私は30秒ごとにインターネットからデータを取得するボットを構築しています。新しいデータが到着したらMatplotlibグラフを更新するには?
私はmatplotlibを使ってこのデータをプロットし、新しいものをフェッチするときにグラフを更新できるようにしたいと思います。
スクリプトの冒頭で、私のプロットを初期化します。 その後、これらのプロットを30秒ごとに更新する機能を実行しますが、私のプロットウィンドウはこの時点でフリーズします。
私はいくつかの研究を行ってきたが、いずれかの作業溶液を見つけるように見えることはできません。
plt.show(block=False)
plt.pause(0.001)
は私が間違って何をやっているの?
コードの一般的な構造:
import matplotlib.pyplot as plt
import time
def init_plots():
global fig
global close_line
plt.ion()
fig = plt.figure()
main_fig = fig.add_subplot(111)
x = [datetime.fromtimestamp(x) for x in time_series]
close_line, = main_fig.plot(x, close_history, 'k-')
plt.draw()
def update_all_plots():
global close_line
x = [datetime.fromtimestamp(x) for x in time_series]
close_line.set_xdata(time_series)
close_line.set_ydata(close_history)
plt.draw()
# SCRIPT :
init_plots()
while(True):
# Fetch new data...
# Update time series...
# Update close_history...
update_plots()
time.sleep(30)
ご返信ありがとうございます。私のメインスクリプトがプロットによってブロックされずに続行できるように、グラフを別のスレッドにプロットするはずですか? – ypicard
プロットの唯一のブロック部分は 'plt.show()'関数です。私は通常、プロットにデータを送り、その後私のメインスクリプトから 'plt.show()'を呼び出す別のスレッドを開始します。だから私のメインのスクリプトは、プロットが閉じられるまでブロックしますが、データソースはデータを送り続けます。しかし、インタラクティブモードを有効にすると、メインスクリプトを非ブロックにすることができると思います。https://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode – Johannes
そして私のプロットはPythonスクリプトは(time.sleep(x)で)スリープしますか? – ypicard