簡體   English   中英

Python-matplotlib中具有極坐標散點圖的坐標變換

[英]Python - Coordinate transformation with polar scatter plot in matplotlib

我必須在使用matplotlib生成的某些極坐標圖上關聯HTML可單擊的地圖,因此我需要一種將Data坐標轉換為圖形的像素坐標的方法。

該代碼改編自“ 如何獲取Matplotlib生成的散點圖的像素坐標”? ,是:

# Creates 6 points on a ray of the polar plot
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
points, = ax.plot([1,1,1,1,1,1],[0,1,2,3,4,5], 'ro')
ax.set_rmax(5)

x, y = points.get_data()
xy_pixels = ax.transData.transform(np.vstack([x,y]).T)
xpix, ypix = xy_pixels.T
width, height = fig.canvas.get_width_height()
ypix = height - ypix

for xp, yp in zip(xpix, ypix):
    print('{x:0.2f}\t{y:0.2f}'.format(x=xp, y=yp))

這使

328.00  240.00
354.80  207.69
381.60  175.38
408.40  143.06
435.20  110.75
461.99  78.44

僅第一個位於圖形中心的點是正確的。 其他人物似乎在移動,好像人物是水平伸展的一樣。 該圖表示由matplotlib(紅色)繪制的點以及我在坐標后繪制的點:

繪制的點和得到的圖形坐標之間的差異

可能會發生什么? 謝謝你的幫助!

更新2017年8月3日

“伸展”甚至更奇怪:我試圖使用以下命令繪制一個刻在半徑為3的圓中的八面體:

points, = ax.plot([math.pi/4,math.pi/2,3*math.pi/4,math.pi,5*math.pi/4,3*math.pi/2,7*math.pi/4,2*math.pi],[3,3,3,3,3,3,3,3], 'ro')

結果是相同的程序

495.01  110.70
328.00  57.14
160.99  110.70
91.81   240.00
160.99  369.30
328.00  422.86
495.01  369.30
564.19  240.00

雖然沿x和y軸的4個點正確放置,但是對應於i * pi / 2 + pi / 4角度(其中i = 0、1、2、3)的其他4個點受到“拉伸”的影響。 實際上,甚至可以通過查看它們的坐標來看到:對於i = 0,2,4,6,| x [(i + 4)%8] -x [i] |應該是正確的。 = | y [(i + 4)%8] -y [i] |,但事實並非如此。

這是一個非常棘手的問題,原來已經在這里解決了:

matplotlib中具有相同長寬比的圖形坐標不一致

問題是,將縱橫比設置為相等時,軸上的尺寸和位置只能由matplotlib確定,一旦在畫布上繪制了一些東西。 在繪制數據之前,它無法知道最終圖形中軸的位置。

最簡單的解決方案是致電

 fig.canvas.draw() 

在plot命令之后但在進行任何轉換之前。 通過這種方式,人物被應用到畫布上,並具有相同的外觀。 從現在開始,可以使用正確的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM