私のコードでは、ラズベリーパイからの継続的に更新された入力がグラフにプロットされます。私は現在の頻度(y_dataの最近の出力)を表示するために凡例を使用しようとしていますが、表示することはできません。 plt.show()
の直前にplt.legend()
を配置すると、グラフがフリーズしますが、表示されます。どんな助けでも大歓迎です。ライブデータとwhileループの設定では、凡例は機能しません
import matplotlib
matplotlib.use('qt5agg')
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import RPi.GPIO as GPIO
import time
import numpy as np
x_data = []
y_data = []
GPIO.setmode(GPIO.BCM)
INPUT_PIN = 26
GPIO.setup(INPUT_PIN, GPIO.IN)
fig, ax = plt.subplots()
line, = plt.plot([],[], 'k-',label = 'data', drawstyle = 'steps')
avr, = plt.plot([],[], 'g--',label = 'mean')
plt.show(block = False)
def update(x_data, y_data, average):
line.set_ydata(y_data)
line.set_xdata(x_data)
avr.set_xdata(x_data)
avr.set_ydata([average]*len(x_data))
fig.canvas.draw()
ax.draw_artist(ax.patch)
ax.draw_artist(line)
ax.draw_artist(avr)
ax.relim()
ax.autoscale_view()
data = round(y_data[-1], 1)
ax.legend((line, avr), (data, 'mean'))
fig.canvas.update()
fig.canvas.flush_events()
while True: #Begin continuous loop
NUM_CYCLES = 10 #Loops to be averaged over
start = time.time()
for impulse_count in range(NUM_CYCLES):
GPIO.wait_for_edge(INPUT_PIN, GPIO.FALLING)
duration = time.time() - start #seconds to run for loop
frequency = NUM_CYCLES/duration #Frequency in Hz
bpm = (frequency/1000)*60 #Frequency/no. of cogs per breath * min
x_data.append(time.time()) #add new data to data lists
y_data.append(bpm)
average = sum(y_data)/float(len(y_data))
update(x_data,y_data, average) #call function to update graph contents
すべてが実行されますが、私は凡例に「データ」の値が必要です。 Set_textは私に文字列の代わりに –
の直前に計算された文字列である 'data'を返します。また、優れた凡例機能を使用する必要のない連続的に更新されるテキストセクションを表示する方法があれば。 –
'legend.get_texts()[0] .set_text(str(data))'行は、必要なものを正確に実行します。つまり、y_dataの最後の値を凡例の小数点第1位に四捨五入して表示します。 'set_text()'は浮動小数点値を扱うことができるので、 'str'コマンドを省略することができます。凡例が必要なのではなく、純粋なテキストが必要な場合は、凡例の代わりに['text'](http://matplotlib.org/users/text_intro.html)コマンドを使用できます。 – ImportanceOfBeingErnest