我有一个包含ax.plot_surface
数据的文本文件。
我想实时绘制它,即实时绘制图形。我当前的解决方案通过处理索引或多或少地完成了工作。
问题是它非常慢,因为我必须清除每个帧。
我是Matplotlib的新手,我怎么能加速这个过程呢? 此外,在最终的代码中,我将直接保存图形而不是绘制它。
我目前的代码:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
X, Y, Z = axes3d.get_test_data(0.05)
cpt = 0
for i in xrange(0, X.shape[0], 2):
for j in xrange(0, X.shape[1]):
ax = fig.gca(projection='3d')
if i > 1:
# Plot continuous surface from the beginning
ax.plot_surface(X[0:i-2, :], Y[0:i-2, :], Z[0:i-2, :], rstride=8, cstride=8, alpha=0.3)
# Plot the current column
ax.plot_surface(X[i-2:i, 0:j], Y[i-2:i, 0:j], Z[i-2:i, 0:j], rstride=8, cstride=8, alpha=0.3)
else:
ax.plot_surface(X[0:i, 0:j], Y[0:i, 0:j], Z[0:i, 0:j], rstride=8, cstride=8, alpha=0.3)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.pause(0.001)
# Save in file directly
#filename = 'TMP/%04d.png' % cpt
#plt.savefig(filename, bbox_inches='tight')
cpt += 1
plt.gcf().clear()
编辑:
基于@River评论,以下代码尝试仅绘制当前的“tile”。看起来要快一点,但结果不如整个表面完全重新绘制之前那么好。
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
X, Y, Z = axes3d.get_test_data(0.05)
ax = fig.gca(projection='3d')
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
cpt = 0
for i in xrange(0, X.shape[0], 2):
for j in xrange(0, X.shape[1], 2):
if i > 1:
# Plot the current column
ax.plot_surface(X[i-2:i, j-2:j], Y[i-2:i, j-2:j], Z[i-2:i, j-2:j], rstride=8, cstride=8, alpha=0.3)
plt.pause(0.001)
# Save in file directly
#filename = 'TMP/%04d.png' % cpt
#plt.savefig(filename, bbox_inches='tight')
cpt += 1
注意:
我也意识到我必须输出与我的数据相同数量的数字(我想在左侧制作视频,在右侧制作视频)。我认为这意味着即使我们可以递增2(我们直接绘制“瓦片”),我也必须增加1,这是低效的,但在我看来是必要的。