我有一个复杂的算法,它会更新三个存储在数组中的直方图。我想调试我的算法,所以我考虑将这些数组显示为直方图形式在用户界面上。最简单的方法是什么?(快速应用开发比优化代码更重要。)
我有一些使用C++中的Qt和matplotlib的经验。
(我将保持这个问题开放一两天,因为对于我来说很难评估解决方案而需要更多的经验,但希望社区的投票能够选择最佳答案。)
我有一个复杂的算法,它会更新三个存储在数组中的直方图。我想调试我的算法,所以我考虑将这些数组显示为直方图形式在用户界面上。最简单的方法是什么?(快速应用开发比优化代码更重要。)
我有一些使用C++中的Qt和matplotlib的经验。
(我将保持这个问题开放一两天,因为对于我来说很难评估解决方案而需要更多的经验,但希望社区的投票能够选择最佳答案。)
编辑: 现在更容易更好地使用 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()
使更新可见。
matplotlib.animation
。我已经添加了一个示例,如上所示。 - unutbu.show
一次,它将弹出到自己的窗口中,如果您不这样做,则仅存在于内存中,并且可以在完成后写入文件。