2016-12-13 8 views
0

私のコードでは、ラズベリーパイからの継続的に更新された入力がグラフにプロットされます。私は現在の頻度(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 

答えて

0

更新機能の最後にfig.canvas.draw()と呼んでください。途中ではありません。私はあなたがなぜ更新機能で再びすべてのアーティストを追加するのか分からないので、あなたはそれを残すかもしれません。凡例に関しては、それを最初に作成するのが一番良いかもしれません。そして、更新機能の中では、関連テキストを更新するだけです。

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') 
# add legend already at the beginning 
legend = ax.legend((line, avr), (0.0, '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() <- use this at the end 
    #ax.draw_artist(ax.patch) # useless? 
    #ax.draw_artist(line)  # useless? 
    #ax.draw_artist(avr)  # useless? 

    ax.relim() 
    ax.autoscale_view() 
    data = round(y_data[-1], 1) 
    # only update legend here 
    legend.get_texts()[0].set_text(str(data)) 

    #fig.canvas.update() # <- what is this one needed for? 
    fig.canvas.draw() 
    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) 
    a = np.random.rand(700,800) # <- just something that takes a little time 

    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 
+0

すべてが実行されますが、私は凡例に「データ」の値が必要です。 Set_textは私に文字列の代わりに –

+0

の直前に計算された文字列である 'data'を返します。また、優れた凡例機能を使用する必要のない連続的に更新されるテキストセクションを表示する方法があれば。 –

+0

'legend.get_texts()[0] .set_text(str(data))'行は、必要なものを正確に実行します。つまり、y_dataの最後の値を凡例の小数点第1位に四捨五入して表示します。 'set_text()'は浮動小数点値を扱うことができるので、 'str'コマンドを省略することができます。凡例が必要なのではなく、純粋なテキストが必要な場合は、凡例の代わりに['text'](http://matplotlib.org/users/text_intro.html)コマンドを使用できます。 – ImportanceOfBeingErnest

0

updateの終わりにplt.draw()(または複数のオブジェクト指向のアプローチのためのfig.canvas.draw_idle())を追加します。

+0

ん図に凡例を配置する問題を解決:

すべてのGPIOのものをコメントアウト、これは私のために正常に動作バージョンはありますか? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnestそれは私のためです。私は 'GPIO'のものを削除し、' GPIO.wait_for_edge'を 'time.sleep'に置き換える以外は何も変更しませんでした。 – Goyo

+0

十分に良い。それは私のために働かなかった、それは私が私の答えを掲示した理由です。たぶんそれは私が持っていない 'qt5agg'のためです。 – ImportanceOfBeingErnest

関連する問題