[英]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確定,一旦在畫布上繪制了一些東西。 在繪制數據之前,它無法知道最終圖形中軸的位置。
最簡單的解決方案是致電
fig.canvas.draw()
在plot命令之后但在進行任何轉換之前。 通過這種方式,人物被應用到畫布上,並具有相同的外觀。 從現在開始,可以使用正確的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.