了解matplotlib中subplot和add_subplot(散点)图之间的区别

时间:2017-10-10 18:25:45

标签: python matplotlib

我试图理解为什么以下情节看起来如此不同

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()
基本上,如果我只想要一个情节,我不明白为什么我需要添加一个子情节。直觉上我会使用第一个情节,但它们没有给出相同的结果? enter image description here enter image description here

1 个答案:

答案 0 :(得分:3)

差异不在plt.subplotfig.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.subplotfig.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

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