2017-10-10 20 views
2

我試圖理解爲什麼下列情節看起來如此不同瞭解插曲和add_subplot之間的差異(分散)地塊在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

回答

3

所不同的是不plt.subplotfig.add_subplot之間。
在第一種情況下,您使用pyplot的分散函數plt.scatter,而在第二種情況下,您使用軸的scatterax.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.Axes3DSubplotscatter方法。

  • 一種選擇是使用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() 
    

結果將在所有情況下是相同的。