Python - 在matplotlib中使用极坐标散点图进行坐标转换

时间:2017-07-31 23:34:59

标签: python matplotlib coordinate-transformation polar-coordinates

我必须在matplotlib生成的一些极坐标图上关联HTML可点击地图,所以我需要一种方法将数据坐标转换为图的像素坐标。

改编自How to get pixel coordinates for Matplotlib-generated scatterplot?的代码是:

# 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(红色)绘制的点以及我在坐标后绘制的点:

Difference between the plotted points and the Figure coordinates I get

可能发生什么事? 谢谢你的帮助!

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个点正确放置,但另外4个对应于i * pi / 2 + pi / 4个角度(其中i = 0,1,2,3)受到&#34的影响;拉伸&#34 ;.事实上,即使通过查看它们的坐标也可以看到:对于i = 0,2,4,6,应该是| x [(i + 4)%8] -x [i] | = | y [(i + 4)%8] -y [i] |,而情况似乎并非如此。

1 个答案:

答案 0 :(得分:0)

这是一个非常棘手的问题,事实证明它已经在这里解决了:

  

Inconsistent figure coordinates in matplotlib with equal aspect ratio

     

问题在于,当将方面设置为等于轴的尺寸和位置时,只有在画布上绘制了某些内容后才能通过matplotlib确定。在绘制数据之前,它无法知道轴在最终图中的位置。

     

最简单的解决方案是致电

fig.canvas.draw()
     

在绘图命令之后,但在进行任何转换之前   作品。通过这种方式,图形被绘制到画布上,应用了   平等的;从这一点来看,正确的转变是   可用。