我想知道为什么下面的情节看起来如此不同

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()

基本上,我不明白如果我只想要一个情节,为什么我需要添加一个子情节。直觉地,我会使用第一个情节,但是他们不会给出相同的结果吗?
python - 了解matplotlib中的子图和add_subplot(散点图)图之间的区别-LMLPHP
python - 了解matplotlib中的子图和add_subplot(散点图)图之间的区别-LMLPHP

最佳答案

不同之处不在plt.subplotfig.add_subplot之间。
相反,在第一种情况下使用pyplot的散射函数plt.scatter,在第二种情况下使用轴的scatter
ax.scatter是一个二维函数。它将解释它的第三个论点作为散射点的大小,并在二维上画出一个散射。(你看到Z轴根本没有缩放。)
使用plt.scatter时,ax.scatter是三维轴(ax)。它的matplotlib.axes._subplots.Axes3DSubplot方法不同于2d情况,因为它期望3个参数scatter作为输入。
现在,您可以将x,y,zplt.subplot同时用于三维绘图,但不能对其中任何一个使用fig.add_subplot
相反,在这两种情况下都需要使用plt.scatter,确保调用ax.scattermatplotlib.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()

结果在所有情况下都是相同的。

10-06 06:47