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

如何在python程序的简单UI中显示实时图形?,python,matplotlib,pyqt,vispy,Python,Matplotlib,Pyqt,Vispy,我有一个复杂的算法,可以更新存储在数组中的3个直方图。我想调试我的算法,所以我想在用户界面中将数组显示为直方图。最简单的方法是什么。(快速应用程序开发比优化代码更重要。) 我对Qt(在C++中)有一些经验,对matplotlib也有一些经验 (我将把这个问题留待一两天,因为如果没有更多的经验,我很难评估解决方案。希望社区投票能帮助选择最佳答案。)我建议在交互模式下使用matplotlib,如果您调用.show一次,它将在自己的窗口中弹出,如果您不调用,它将只存在于内存中,并且在使用完后可以写入文

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

我对Qt(在C++中)有一些经验,对matplotlib也有一些经验


(我将把这个问题留待一两天,因为如果没有更多的经验,我很难评估解决方案。希望社区投票能帮助选择最佳答案。)

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

哦,现在看,当您说实时时,您的意思是希望刷新率高于5 Hz,matplotlib无法完成此任务。我以前遇到过这个问题,我选择了PyQt。

编辑:现在,使用
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帧,相比之下,使用代码I可以每秒获得4帧。诀窍是避免让matplotlib绘制完整的图形。而是调用
plt.hist
一次,然后在
patches
中操作现有的
matplotlib.patchers.Rectangle
s以更新直方图,然后调用
fig.canvas.draw()
使更新可见。

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


编辑:glumpy、visvis、galry和pyqtgraph的开发人员都在协作开发一个名为的可视化库。它仍处于开发初期,但很有前途,而且已经相当强大。

如果您所追求的是快速开发,我推荐Tkinter。它比PyQt直观得多。@Neil:这里有一个制作动画图形的例子:。也许这会对你有帮助?@unutbu nice+1,你为什么不把它作为一个答案?@Bernardo:这是乔·金顿的答案,所以他值得表扬:)@unutbu请加上它,因为他不是来加的。无论如何,你读了问题并建立了联系,这是值得表扬的。PyQwt目前被认为是未维护的。希望这在将来会改变,但现在要小心。这很好,但绘图窗口会自行关闭或不响应。。有什么建议吗?@DevC:现在,最好使用
matplotlib.animation
。我在上面添加了一个示例。在这里,您可以找到示例动画视频:如何使用opencv python的网络摄像头进行实时情感检测?包括几个应用程序的库以及与这些应用程序对应的代码。