我试图理解为什么下面的图看起来如此不同
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
.
plt.scatter
是一个二维函数。它将其第三个参数解释为散点的大小并绘制二维散点图。 (您会看到 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
的 scatter
方法.
一种选择是使用
plt.gca()
获取当前轴(即 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.subplots
(注意s
)同时获取图形和坐标轴句柄,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()
在所有情况下结果都是一样的。
关于python - 了解 matplotlib 中 subplot 和 add_subplot(散点)图之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673480/