如何在Python程序的简单用户界面中显示实时图表?

20

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

我有一些使用C++中的Qt和matplotlib的经验。

(我将保持这个问题开放一两天,因为对于我来说很难评估解决方案而需要更多的经验,但希望社区的投票能够选择最佳答案。)


如果你想要快速开发,我建议使用Tkinter。在我看来,它比PyQt更加直观易用。 - Rafe Kettler
2
@Neil:这里有一个制作动画图表的例子:https://dev59.com/w2855IYBdhLWcg3w5Icb#4098938。也许这会对你有所帮助? - unutbu
2
@unutbu 不错 +1,为什么不把它作为答案呢? - Bernardo Kyotoku
1
@Bernardo:这是Joe Kington的回答,所以他应该得到功劳 :) - unutbu
1
@unutbu 请添加它,因为他不在这里添加它。无论如何,你应该得到阅读问题并建立联系的功劳。 - Neil G
显示剩余2条评论
4个回答

23

编辑: 现在更容易更好地使用 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()

通过这种方式,我可以每秒获得约14帧,相比于我最初发布的代码只能获得4帧。关键是要避免要求matplotlib绘制完整的图形。而是只调用plt.hist一次,然后操作patches中的现有matplotlib.patches.Rectangle来更新直方图,并调用fig.canvas.draw()使更新可见。


这个程序运行得很好,但绘图窗口会变成无响应或自动关闭。有什么建议吗? - DevC
@DevC:现在最好使用matplotlib.animation。我已经添加了一个示例,如上所示。 - unutbu
在这里,您可以找到示例动画视频:http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/ - kakyo
如何使用OpenCV Python实现实时情感检测并利用网络摄像头进行捕捉? - Mr. Jibz

13

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

编辑: glumpy、visvis、galry和pyqtgraph的开发人员正在共同开发一个可视化库,名为vispy。它仍处于早期开发阶段,但非常有前途并且已经相当强大。


Vispy网站包括多个应用程序的画廊以及与这些应用程序相对应的代码。 - Mark

1
我建议在交互模式下使用matplotlib,如果您调用.show一次,它将弹出到自己的窗口中,如果您不这样做,则仅存在于内存中,并且可以在完成后写入文件。

0
哦,现在看来,当你说实时时,你的意思是你想要一个高于5 Hz的刷新率,而matplotlib无法胜任。我以前也遇到过这个问题,我选择了与PyQt一起使用的PyQwt

1
PyQwt目前被认为是未维护的。希望将来会有所改变,但现在请注意。 - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接