繁体   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