如何在python程序的简单UI中显示实时图形?

时间:2010-11-09 01:28:45

标签: python matplotlib pyqt vispy

我有一个复杂的算法,可以更新存储在数组中的3个直方图。我想调试我的算法,所以我想在用户界面中将数组显示为直方图。最简单的方法是什么? (快速应用程序开发比优化代码更重要。)

我对Qt(使用C ++)有一些经验,并且有使用matplotlib的经验。

(我要打开这个问题一两天,因为我很难在没有更多经验的情况下评估解决方案。希望社群的投票能帮助我们选择最佳答案。)

4 个答案:

答案 0 :(得分:21)

编辑:现在,使用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()

有一个制作动画图here的例子。 在此示例的基础上,您可以尝试类似:

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()

我可以通过这种方式获得大约每秒14帧,相比之下,使用代码I first posted每秒可以获得4帧。诀窍是避免要求matplotlib绘制完整的数字。而是调用plt.hist一次,然后操纵matplotlib.patches.Rectangle中的现有patches来更新直方图,然后调用 fig.canvas.draw()使更新可见。

答案 1 :(得分:9)

对于实时绘图,我建议尝试使用Chaco,pyqtgraph或任何基于opengl的库,如glumpy或visvis。 Matplotlib虽然很棒,但通常不适合这种应用。

编辑:glumpy,visvis,galry和pyqtgraph的开发人员都在名为vispy的可视化库上进行协作。它仍处于发展的早期阶段,但前途无量且已经相当强大。

答案 2 :(得分:1)

我建议在交互模式下使用matplotlib,如果你调用.show一次然后会弹出它自己的窗口,如果你没有那么它只存在于内存中,并且可以在你打开时写入文件完成它。

答案 3 :(得分:1)

噢,现在看,当你说实时你的意思是你想要一个高于5赫兹的刷新率时,matplotlib将无法胜任。之前我遇到过这个问题,我选择使用PyQt的PyQwt