【问题标题】:How do I display real-time graphs in a simple UI for a python program?如何在 python 程序的简单 UI 中显示实时图形?
【发布时间】:2011-05-06 23:51:03
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您追求快速开发,我推荐 Tkinter。它比 PyQt 更直观的 IMO。
  • @Neil:这里有一个制作动画图的例子:stackoverflow.com/questions/4098131/matplotlib-update-a-plot/…。也许这会对你有所帮助?
  • @unutbu nice +1,你为什么不回答?
  • @Bernardo:这是 Joe Kington 的回答,所以他值得称赞 :)
  • @unutbu 请添加它,因为他不在这里添加它。无论如何,阅读问题并建立联系是值得称赞的。

标签: python matplotlib pyqt vispy


【解决方案1】:

编辑:如今,使用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 一次,然后操作patches 中现有的matplotlib.patches.Rectangles 来更新直方图,然后调用 fig.canvas.draw() 使更新可见。

【讨论】:

  • 这很好用,但绘图窗口没有响应或自行关闭.. 有什么建议吗?
  • @DevC:现在最好使用matplotlib.animation。我在上面添加了一个示例。
  • 这里您可以找到示例动画视频:jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial
  • 如何使用带有 opencv python 的网络摄像头进行实时情绪检测?
【解决方案2】:

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

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

【讨论】:

  • vispy website 包含几个应用程序的图库以及与这些应用程序对应的代码。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    哦,现在明白了,当您说实时时,您的意思是您想要高于 5 Hz 的刷新率,matplotlib 无法完成这项工作。我之前遇到过这个问题,我选择了与 PyQt 配合使用的 PyQwt

    【讨论】:

    • PyQwt 目前被认为是未维护的。希望将来会有所改变,但现在要小心..
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2012-06-04
    • 1970-01-01
    • 2019-11-18
    • 2021-07-31
    • 2012-03-08
    • 2022-11-20
    • 2013-03-30
    相关资源
    最近更新 更多