2017-04-26 206 views
1

有如圖中所示的立體投影兩點:如何通過兩點繪製一個圓(直徑末端)?

enter image description here

這些點被認爲是在一個圓的dimeter的端點。如何繪製一個通過這兩點的圓圈?

代碼用於上述情節:

import matplotlib.pylab as plt 
from mpl_toolkits.basemap import Basemap 
import numpy as np 
from scipy.interpolate import splev, splrep 

# create instance of basemap, note we want a south polar projection to 90 = E 
myMap = Basemap(projection='spstere',boundinglat=0,lon_0=180,resolution='l',round=True,suppress_ticks=True) 
# set the grid up 
gridX, gridY = 10.0, 15.0 
parallelGrid = np.arange(-90.0,90.0,gridX) 
meridianGrid = np.arange(-180.0,180.0,gridY) 

# draw parallel and meridian grid, not labels are off. We have to manually create these. 
myMap.drawparallels(parallelGrid,labels=[False,False,False,False]) 
myMap.drawmeridians(meridianGrid,labels=[False,False,False,False],labelstyle='+/-',fmt='%i') 


# plot azimuth labels, with a North label. 
ax = plt.gca() 
ax.text(0.5,1.025,'N',transform=ax.transAxes,horizontalalignment='center',verticalalignment='bottom',size=25) 
for para in np.arange(gridY,360,gridY): 
    x= (1.1*0.5*np.sin(np.deg2rad(para)))+0.5 
    y= (1.1*0.5*np.cos(np.deg2rad(para)))+0.5 
    ax.text(x,y,u'%i\N{DEGREE SIGN}'%para,transform=ax.transAxes,horizontalalignment='center',verticalalignment='center') 

summerAzi = np.array([0, 360]) 
summerAlt = np.array([40, 4]) 
summerX, summerY = myMap(summerAzi, -summerAlt) 


summerX_new = np.linspace(summerX.min(), summerX.max(),30) 
summerY_smooth = splev(summerX_new, splrep(summerX, summerY, k=1)) 

myMap.plot(summerX_new, summerY_smooth, 'g') 

myMap.plot(summerX, summerY, 'go') 
plt.show() 
+1

兩點可以定義無限多的圈,你談論的投影空間圓(正如我們看到的)或圓的數學空間(正在表示的數據) –

+0

@NickT;你是對的。我更新了這個問題。這些點是圓的直徑的終點。 – haccks

+0

由於投影,它不工作來計算線的中點,並使用'circ = plt.Circle((myX,myY),radius = myRad)' – beroe

回答

1

內置天梭()函數是不夠好,上繪製等角投影圓(如在這種情況下)。在非共形投影上,它繪製橢圓。 這裏tissueot indicatrix的中點是(0,-22)度。 其半徑=(40-4)/ 2 = 18度。 點數= 36的罰款。

相關的代碼是:

myMap.tissot(0, -22, 18, 36, \ 
      facecolor='none', \ 
      edgecolor='#ff0000', \ 
      linewidth=1, \ 
      alpha=1) 

enter image description here

+0

太棒了!有效。 – haccks

1

在這個極座標表示的圓圈不會像上的矩形網格(即「輪」)的圓。除此之外,您可以像在笛卡爾平面上繪製圓一樣繪製圓,從極座標開始,轉換爲笛卡爾座標,偏移中心並使用繪圖函數。

summerAzi = np.array([0, 360]) 
summerAlt = -np.array([40, 4]) 
summerX, summerY = myMap(summerAzi, summerAlt) 

phi = np.linspace(0,2.*np.pi) 
r = np.abs(np.diff(summerAlt))/2. 
x = r*np.cos(phi) 
y = -r*np.sin(phi)+summerAlt.mean() 
X,Y= myMap(x,y) 

myMap.plot(X,Y, color="crimson") 
myMap.plot(summerX, summerY, color="gold", marker="o") 

enter image description here

+0

有什麼方法可以繪製一個圓,然後可以放在這個極座標表示之上?實際情況有所不同。數據集像'summerAzi = np.array([180,360])'。 – haccks

+0

對不起,沒有明確的問題描述,我無法做任何事情來幫助你。 – ImportanceOfBeingErnest

+0

我們不能做這樣的事:'#%matplotlib直列 進口matplotlib.pylab如PLT 進口numpy的爲NP AX = plt.subplot(111,極性= TRUE) 圈= plt.Circle((0 ,.3),0.6,transform = ax.transData._b,color =「red」,alpha = 0.1) ax.add_artist(圓) plt.show() '使用'summerAzi'和'summerAlt'題? – haccks