2012-10-15 77 views
85

我正在學習如何使用mplot3d生成3D數據的美妙情節,到目前爲止我非常高興。我現在想做的是旋轉表面的一點動畫。爲此,我需要爲3D投影設置相機位置。我想這一定是可能的,因爲交互式使用matplotlib時可以使用鼠標旋轉曲面。但是我怎麼能從腳本中做到這一點? 我在mpl_toolkits.mplot3d.proj3d中發現了很多變換,但我無法找到如何使用這些用於我的目的,我沒有找到任何我想要做的示例。如何使用python/matplotlib設置3d圖的「攝像頭位置」?

+0

旁註爲那些不知道如何在jupyter筆記本交互旋轉:您可以使用'%matplotlib筆記本' – YvesgereY

回答

103

通過「攝像頭位置」,聽起來您想要調整用於查看3D圖的高程和方位角。我已經使用了下面的腳本來創建劇情,然後我確定了一個很好的海拔,或者從中查看我的劇情。然後我調整了方位角或azim,以改變我的地塊周圍的全部360度,在每個實例處保存圖(並且注意到我保存該圖的方位角)。對於更復雜的攝像機平移,您可以調整高程和角度以達到所需的效果。

from mpl_toolkits.mplot3d import Axes3D 
    ax = Axes3D(fig) 
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6) 
    for ii in xrange(0,360,1): 
     ax.view_init(elev=10., azim=ii) 
     savefig("movie%d.png" % ii) 
+17

打我吧!在附註中,這些可以用作'ax.elev'和'ax.azim'屬性。你也可以寫下'ax.azim = ii'或甚至'ax.azim + = 1'來達到同樣的效果。 –

+0

抱歉,我擊敗了你,但公平點四周。這也僅僅是我的代碼片段,在for循環中比view_init和savefig更多。 =) – cosmosis

+2

感謝cosmosis和喬,那正是我一直在尋找的。由於我現在知道要尋找什麼,我還發現ax.dist與ax.azim和ax.elev一起允許在極座標中設置相機位置。 –

9

將相機位置應用到新的情節會是多麼方便。 所以我繪製,然後用鼠標移動陰謀改變距離。然後嘗試複製包含另一個圖上距離的視圖。 我發現axx.ax.get_axes()使用舊的.azim和.elev得到了一個對象。

在Python ...

axx=ax1.get_axes() 
azm=axx.azim 
ele=axx.elev 
dst=axx.dist  # ALWAYS GIVES 10 
#dst=ax1.axes.dist # ALWAYS GIVES 10 
#dst=ax1.dist  # ALWAYS GIVES 10 

後來3D圖形...

ax2.view_init(elev=ele, azim=azm) #Works! 
ax2.dist=dst      # works but always 10 from axx 

編輯1 ... OK,攝像頭位置的思維有關.dist值走錯了路。它作爲整個圖形的一種hackey標量乘法器,在所有方面都佔據首位。視圖的

這適用於放大/縮小:

xlm=ax1.get_xlim3d() #These are two tupples 
ylm=ax1.get_ylim3d() #we use them in the next 
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing 
axx=ax1.get_axes() 
azm=axx.azim 
ele=axx.elev 

後來曲線圖...

ax2.view_init(elev=ele, azim=azm) #Reproduce view 
ax2.set_xlim3d(xlm[0],xlm[1])  #Reproduce magnification 
ax2.set_ylim3d(ylm[0],ylm[1])  #... 
ax2.set_zlim3d(zlm[0],zlm[1])  #... 
+0

+1用於調出哈克標量乘法。如果你希望透視,這是非常煩人的。 – user5920660

相關問題