我试图理解为什么以下情节看起来如此不同
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()
基本上,如果我只想要一个情节,我不明白为什么我需要添加一个子情节。直觉上我会使用第一个情节,但它们没有给出相同的结果?
答案 0 :(得分:3)
差异不在plt.subplot
和fig.add_subplot
之间
相反,在第一种情况下,您使用pyplot的分散函数plt.scatter
,在第二种情况下,您使用轴的scatter
ax.scatter
。
plt.scatter
是2D功能。它将第三个参数解释为散点的大小,并在二维中绘制一个散点图。 (您会看到z轴根本没有缩放。)
使用ax.scatter
时,ax
是3D轴(matplotlib.axes._subplots.Axes3DSubplot
)。它的scatter
方法与2D情况不同,因为它需要3个参数x,y,z
作为输入。
现在,您可以同时使用plt.subplot
和fig.add_subplot
作为3D绘图,但不能在其中任何一个上使用plt.scatter
。
相反,您需要在两种情况下都使用ax.scatter
,确保调用matplotlib.axes._subplots.Axes3DSubplot
的{{1}}方法。
一种选择是使用scatter
获取当前轴(即3D轴):
plt.gca()
您也可以通过调用“plt.subplot()
来获取轴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()
当然,你可以使用你已经找到的工作方式,
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.subplots
)同时处理数字和轴,
s
结果在所有情况下都是相同的。