我有一个复杂的算法,可以更新存储在数组中的3个直方图。我想调试我的算法,所以我想在用户界面中将数组显示为直方图。最简单的方法是什么? (快速应用程序开发比优化代码更重要。)
我对Qt(使用C ++)有一些经验,并且有使用matplotlib的经验。
(我要打开这个问题一两天,因为我很难在没有更多经验的情况下评估解决方案。希望社群的投票能帮助我们选择最佳答案。)
答案 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)