使用Matplotlib实时绘制曲面

时间:2016-06-16 12:08:11

标签: python matplotlib plot

我有一个包含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,这是低效的,但在我看来是必要的。

0 个答案:

没有答案