我想知道为什么下面的情节看起来如此不同
plt.subplot(projection='3d')
plt.scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
plt.scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
ax.scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
基本上,我不明白如果我只想要一个情节,为什么我需要添加一个子情节。直觉地,我会使用第一个情节,但是他们不会给出相同的结果吗?
最佳答案
不同之处不在plt.subplot
和fig.add_subplot
之间。
相反,在第一种情况下使用pyplot的散射函数plt.scatter
,在第二种情况下使用轴的scatter
。ax.scatter
是一个二维函数。它将解释它的第三个论点作为散射点的大小,并在二维上画出一个散射。(你看到Z轴根本没有缩放。)
使用plt.scatter
时,ax.scatter
是三维轴(ax
)。它的matplotlib.axes._subplots.Axes3DSubplot
方法不同于2d情况,因为它期望3个参数scatter
作为输入。
现在,您可以将x,y,z
和plt.subplot
同时用于三维绘图,但不能对其中任何一个使用fig.add_subplot
。
相反,在这两种情况下都需要使用plt.scatter
,确保调用ax.scatter
的matplotlib.axes._subplots.Axes3DSubplot
方法。
一个选项是使用scatter
获取当前轴(即3d轴):
plt.subplot(projection='3d')
plt.gca().scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
plt.gca().scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
您还可以从对'plt.subplot()的调用中获取轴
ax = plt.subplot(projection='3d')
ax.scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
ax.scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
当然你可以用你已经找到的工作方式,
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
ax.scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
或者你可以使用
plt.gca()
(介意plt.subplots
)同时获得一个图形和轴句柄,fig, ax = plt.subplots(subplot_kw=dict(projection="3d"))
ax.scatter(position1[:,0], position1[:,1], position1[:,2], marker='.')
ax.scatter(position2[:,0], position2[:,1], position2[:,2], marker='.')
plt.show()
结果在所有情况下都是相同的。