質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

3097閲覧

リアルタイムでグラフ描画失敗

Deng

総合スコア19

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2021/04/16 01:21

前提・実現したいこと

Python matplotlib + tkinter を使って、リアルタイムでデータファイルをグラフで表示したいです。
ボタンを押したら、描画が始めるという予定です。

発生している問題・エラーメッセージ

リアルタイムで動かないようで、データの最後に一気で表示することでした。

該当のソースコード

def button1():
time=[1,2,3,4,5]
data_ch = [0.2,1,0.5,3,9]
for k in range (1,10):
time.append(k)
data_ch.append(k)
fig = plot_wave(time, data_ch)
canvas = FigureCanvasTkAgg(fig, frame_2)
canvas.draw()
canvas.get_tk_widget().grid(row=0, column=0)

注:リストtimeとdata_chは、テストのため、作った例です。

試したこと

リアルタイムで動かないようで、データの最後に一気で表示することでした。

補足情報(FW/ツールのバージョンなど)

Win10, Python3.6, matplotlib 3.3.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

課題を解決しました。

def button1():
time=[1,2,3,4,5]
data_ch = [0.2,1,0.5,3,9]
for k in range (1,100):
time.append(k)
data_ch.append(k)
fig = plot_wave(time, data_ch)
canvas = FigureCanvasTkAgg(fig, frame_2)
canvas.get_tk_widget().grid(row=0, column=0)
fig.canvas.draw() # この二行を入れまして、問題は解決しました。
fig.canvas.flush_events() # ループので、一回描画した後、flushする必要がある。

投稿2021/04/16 04:56

Deng

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2021/04/16 08:22

button1 がどのように呼ばれるのか、 matplotlib と tkinter どちらのイベントループを使うのかで状況が異なります。 問題になるケース: flush_events() はボタンをクリックした時等のイベント処理を行います。 つまり、flush_events() 内で button1() が呼び出される (可能性がある)為、 button1() 内で flush_events() を呼び出すと、その中で button1() が呼ばれて更に ... と、操作によっては誤動作の原因になるので注意してください。 (安全に使える場面もありますが、バックエンドのイベントループの扱い次第) for 文内で強制的にイベント処理や描画の更新を行いたい場合は、大抵 イベントループの提供するタイマー機能を使う方法が安全な解決策です。 ですが、リアルタイムのプロットであれば、matplotlib.animation の利用をお勧めします。
Deng

2021/04/16 08:34

教えていただいてありがとうございます。animationの方に考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問