Pythonを使用してから数週間しか経っていません。Matplotlibを使用してArduinoからのデータをプロットするのに問題はありません。ただし、プロットはポップウィンドウとして表示されるため、tkinterで作成しているGUIのルートウィンドウのキャンバスにのみプロットを表示したいと思います。複数の組み合わせを試しましたが、うまくいきません。プロット値をコードに追加するだけの場合、次のように言います。
a.plot([1, 2, 3, 4, 5], [2, 3, 4, 5, 6, 7])
それは正常に動作するので、私の主な問題は、Arduinoからデータを取得するときのwhileループにあります。プロットを更新するためにdrawnowオプションも試しましたが、まったく同じ結果が得られます。私が何をしても、プロットが別のウィンドウとして表示されなくなるのを防ぐことができないようです。
[背面にメインGUIウィンドウがあるプロットウィンドウ] [1]
これが私が使用しているサンプルコードです:
import serial
from tkinter import *
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = Tk()
root.geometry('1200x700+200+100')
root.title('This is my root window')
root.state('zoomed')
root.config(background='#fafafa')
yar = []
plt.ion()
style.use('ggplot')
fig = plt.figure(figsize=(14, 4.5), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ser = serial.Serial('com3', 9600)
def animate(i):
while True:
ser.reset_input_buffer()
data = ser.readline().decode("utf-8")
data_array = data.split(',')
yvalue = float(data_array[1])
yar.append(yvalue)
print(yvalue)
plt.ylim(0, 100)
ax1.plot(yar, 'r', marker='o')
plt.pause(0.0001)
plotcanvas = FigureCanvasTkAgg(fig, root, animate)
plotcanvas.get_tk_widget().grid(column=1, row=1)
ani = animation.FuncAnimation(fig, animate, interval=1000, blit=True)
plotcanvas.show()
root.mainloop()
tkのメインループがアニメーションを処理するため、plt.ion()またはplt.pause()を使用しないでください。
アニメーション関数は毎秒呼び出されinterval
ます。while True
この関数内でループを使用することはできません。
にアニメーション機能を提供する理由は何もありませんFigureCanvasTkAgg
。
blit=True
自分が何をしているのかわからない限り、使用しないでください。1秒の間隔では、これはとにかく必要ありません。
すべての反復ステップで行を再プロットするのではなく、行を更新します。
#import serial
from Tkinter import *
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
root = Tk()
root.geometry('1200x700+200+100')
root.title('This is my root window')
root.state('zoomed')
root.config(background='#fafafa')
xar = []
yar = []
style.use('ggplot')
fig = plt.figure(figsize=(14, 4.5), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim(0, 100)
line, = ax1.plot(xar, yar, 'r', marker='o')
#ser = serial.Serial('com3', 9600)
def animate(i):
#ser.reset_input_buffer()
#data = ser.readline().decode("utf-8")
#data_array = data.split(',')
#yvalue = float(data_array[1])
yar.append(99-i)
xar.append(i)
line.set_data(xar, yar)
ax1.set_xlim(0, i+1)
plotcanvas = FigureCanvasTkAgg(fig, root)
plotcanvas.get_tk_widget().grid(column=1, row=1)
ani = animation.FuncAnimation(fig, animate, interval=1000, blit=False)
root.mainloop()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加