如何提高Python绘图速度?
我有一个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那么好看。
另外,我想你应该是关闭了交互模式。