如何提高Python绘图速度?

3 投票
3 回答
4149 浏览
提问于 2025-04-17 02:46

我有一个256x256的numpy数组,这个数组里的数据一直在变化。每次循环的时候,我会拍一张快照来制作电影。这个快照是用matplotlib制作的3D表面图。

问题是,每次绘图都要花费超过2秒,这样250次循环下来就要600秒。我在MATLAB上运行同样的程序时,处理同样次数的循环只需要80到120秒。

我的问题是:有没有办法加快matplotlib的3D表面图绘制速度,或者有没有更快的绘图工具可以在Python中使用?

以下是一些代码:

## initializing plot

fig = plt.figure(111)
fig.clf()
ax = fig.gca(projection='3d')
X = np.arange(0, field_size, 1)
Y = np.arange(0, field_size, 1)
X, Y = np.meshgrid(X, Y)

## the loop

start_time = time.time()
for k in xrange(250):
    it_time = time.time()
    field[128,128] = maxvalue
    field = scipy.ndimage.convolve(field, kernel)
    print k, " calculation: ", time.time() - it_time, " seconds"
    it_time = time.time()
    ax.cla()
    ax.plot_surface(X, Y, field.real, rstride=4, cstride=4, cmap=cm.hot,
        linewidth=0, antialiased=False)
    ax.set_zlim3d(-50, 150)
    filename = "out_%d.png" % k
    fig.savefig(filename)
    #fig.clf()
    print k, " plotting: ", time.time() - it_time, " seconds"
print "computing: ", time.time() - start_time, " seconds"

3 个回答

0

我无法测试这是否有效,因为你没有提供可以运行的例子。不过你可以试试看,修改一下由 plot_surface 返回的 Poly3DCollection,看看这样做是否比每次都创建一个新的集合要快。

另外,你是使用非交互式的后端对吧?(在导入 pyplot 之前,先调用 matplotlib.use('agg')。)

2

如果你想做3D图形绘制,我推荐你试试mayavi。刚开始用的时候可能会觉得有点难,但其实花点时间去学是很值得的。

在绘制一次3D数据时,它的速度肯定比matplotlib快很多。不过如果你要多次绘图并且使用保存图像的功能,我就不太确定了……

0

GNUplot(通过它的各种 python 接口 访问)可能会更快。至少几年前我认识一个人,他遇到过和你类似的问题,经过测试多个软件包后,他们选择了GNUplot。不过,GNUplot的图形效果没有matplotlib那么好看。

另外,我想你应该是关闭了交互模式。

撰写回答