目前还不清楚为什么会发生这种情况,这肯定是一个bug。在这里,我提供了一个方法来获得您想要的结果,尽管它并不像人们希望的那样自动。在
由于某些原因,表示散布点的Patch3DCollection在第一次渲染后不会更新。这个更新是必不可少的,因为它是为每个集合补丁设置唯一颜色的地方。要强制它重新初始化,您可以在Patch3DCollection上使用changed方法(实际上是ScalarMappable方法),而这只是记录了一个变化发生在上。绘制图形时,它检查是否发生了更新,然后重新定义颜色。如果没有,则跳过此过程。在
要强制此更新自动发生,需要对每个“draw”事件执行此操作。要做到这一点,必须使用canvas的mpl_connect方法register a method(请参阅链接教程)。在
这个例子展示了两次保存图形如何保留颜色映射,但是如果取消对plt.show()行的注释,它仍然可以工作(例如在旋转时)。在import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Create Map
cm = plt.get_cmap("RdYlGn")
# added a seed so consistant plotting of points
np.random.seed(101)
x = np.random.rand(30)
y = np.random.rand(30)
z = np.random.rand(30)
col = np.arange(30)
fig = plt.figure()
#ax = fig.add_subplot(111)
#scatCollection = ax.scatter(x,y,
ax3D = fig.add_subplot(111, projection='3d')
# keep track of the Patch3DCollection:
scatCollection = ax3D.scatter(x, y, z, s=30,
c=col,
marker='o',
cmap=cm
)
def forceUpdate(event):
global scatCollection
scatCollection.changed()
fig.canvas.mpl_connect('draw_event',forceUpdate)
#plt.show()
plt.savefig('image1.png')
plt.savefig('image2.png')
理想情况下不需要这样做,全局scatCollection应该使用其他方法访问(我正在做这件事)。但这暂时有效。。。在