2014-03-06 28 views
1

我有多個飛機的一系列x,y座標和相關的航向角度。我可以繪製飛行路線,我想用一個特殊的標記來標記路徑上的特定位置,該位置還顯示了飛機在該位置時的航向。可能使用自定義箭頭或多邊形作爲標記來繪製matplotlib中的位置和標題?

使用matplotlib.pyplot我已經使用沒有底座的箭頭來做到這一點,但是在繪製多架飛機時必須定義頭部和尾部位置,結果箭頭長度不一致。我還使用了元組(numsides,style,angle)以及楔形和bigvee符號的自定義三邊符號,但它們看起來都不怎麼樣。

Custom arrow style for matplotlib, pyplot.annotate Saullo Castro顯示了一個不錯的自定義箭頭(箭頭1),我想知道它是否可以被使用或轉換,只是簡單地將它繪製在給定的x,y處,並且其方向由一個航向角。

我可以繪製自定義箭頭以下。有關如何旋轉它以反映標題的任何想法?

a1 = np.array([[0,0],[0,1],[-1,2],[3,0],[-1,-2],[0,-1],[0,0]], dtype=float) 
polB = patches.Polygon(a1, closed=True, facecolor='grey') 
ax.add_patch(polB) 

在此先感謝。

回答

0

所以我做了多邊形有點簡單,還發現旋轉可以通過使用來完成mpl.transforms.Affine2D()rotate_deg_around():

a2 = np.array([[newX,newY+2],[newX+1,newY-1],[newX,newY],[newX-1,newY-1],[newX,newY+2]], dtype=float) 
    polB = patches.Polygon(a2, closed=True, facecolor='gold') 
    t2 = mpl.transforms.Affine2D().rotate_deg_around(newX,newY,heading) + newax.transData 
    polB.set_transform(t2) 
    newax.add_patch(polB) 

我第一次嘗試在覆蓋多邊形從x,y座標繪製的線。但是,x軸和y軸的比例不相等(我也不希望它們),所以多邊形在旋轉時最終看起來都扭曲和拉伸。我周圍這讓先添加一個新的軸平等的x/y縮放:

newax = fig.add_axes(ax.get_position(), frameon=False) 
    newax.set_xlim(-20,20) 
    newax.set_ylim(-20,20) 

我至少可以再旋轉我想要的,並沒有翹曲問題。但後來我需要弄清楚如何基本連接兩個軸,以便我可以在新軸上的一個點上繪製多邊形的原點軸。我想這樣做的方法是,使用轉換從原始軸上的數據座標轉換,將其轉換爲顯示座標,然後將它們反轉回數據座標,但此時在新軸上的數據座標處:

inTrans = ax.transData.transform((x, y)) 
    inv = newax.transData.inverted() 
    newTrans = inv.transform((inTrans[0], inTrans[1])) 
    newX = newTrans[0] 
    newY = newTrans[1] 

它感覺有點像某種Rube Goldberg機器這樣做,但它做了我想要的。

最後,我決定我不喜歡這種方法,並保持簡單並使用花式箭頭代替多邊形。這就是生活...