web-dev-qa-db-ja.com

pythonプログラムのシンプルなUIでリアルタイムグラフを表示するにはどうすればよいですか?

配列に格納されている3つのヒストグラムを更新する複雑なアルゴリズムがあります。アルゴリズムをデバッグしたいので、ユーザーインターフェイスで配列をヒストグラムとして表示することを考えていました。これを行う最も簡単な方法は何ですか。 (迅速なアプリケーション開発は、最適化されたコードよりも重要です。)

Qt(C++)の経験と、matplotlibの経験があります。

(私が持っていない多くの経験なしに解決策を評価するのは難しいので、この質問を1日か2日開いたままにしておきます。コミュニティの投票が最良の答えを選ぶのに役立つことを願っています。)

18
Neil G

編集:最近では、_matplotlib.animation_を使用する方が簡単で優れています:

_import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


def animate(frameno):
    x = mu + sigma * np.random.randn(10000)
    n, _ = np.histogram(x, bins, normed=True)
    for rect, h in Zip(patches, n):
        rect.set_height(h)
    return patches    

mu, sigma = 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

ani = animation.FuncAnimation(fig, animate, blit=True, interval=10,
                              repeat=True)
plt.show()
_

アニメーショングラフを作成する例があります ここ 。この例に基づいて、次のようなことを試してみてください。

_import numpy as np
import matplotlib.pyplot as plt

plt.ion()
mu, sigma = 100, 15
fig = plt.figure()
x = mu + sigma*np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
for i in range(50):
    x = mu + sigma*np.random.randn(10000)
    n, bins = np.histogram(x, bins, normed=True)
    for rect,h in Zip(patches,n):
        rect.set_height(h)
    fig.canvas.draw()
_

コードI 最初に投稿された を使用した場合の1秒あたり4フレームと比較して、この方法では1秒あたり約14フレームを取得できます。秘訣は、matplotlibに完全な図を描くように依頼しないようにすることです。代わりに、_plt.hist_を1回呼び出してから、patches内の既存の_matplotlib.patches.Rectangle_ sを操作してヒストグラムを更新し、fig.canvas.draw()を呼び出して更新を表示します。

21
unutbu

リアルタイムのプロットには、Chaco、pyqtgraph、またはglumpyやvisvisなどのopenglベースのライブラリを試すことをお勧めします。 Matplotlibは、それ自体素晴らしいのですが、一般的にこの種のアプリケーションには適していません。

編集:glumpy、visvis、galry、およびpyqtgraphの開発者はすべて、 vispy という視覚化ライブラリで共同作業を行っています。それはまだ開発の初期段階ですが、有望ですでに非常に強力です。

9
Luke

インタラクティブモードでmatplotlibを使用することをお勧めします。.showを一度呼び出すと、独自のウィンドウにポップアップ表示されます。そうでない場合は、メモリ内にのみ存在し、完了したらファイルに書き込むことができます。それと。

1
Gareth Davidson

ああ、今、あなたがリアルタイムと言うとき、あなたは5Hzより高いリフレッシュレートが欲しいということを意味しますmatplotlibは仕事をしません。私は以前にこの問題を抱えていました、私はPyQtで動作する PyQwt に行きました。

0