简体   繁体   English

Python / Matplotlib:转换Axis <=>数据坐标系

[英]Python/Matplotlib : convert Axis <=> Data coordinates systems

My question is quite simple : in matplotlib, how can I easily convert coordinates in Axis system to/from Data system (Ideally I'm looking for a simple function output_coords = magic_func(input_coords) ) 我的问题很简单:在matplotlib中,如何轻松地将Axis系统中的坐标转换为数据系统(从理想情况来说,我正在寻找一个简单的函数output_coords = magic_func(input_coords)

Actually my exact problem is : I'd like to plot an matplotlib.patches.Ellipse with his center in Axis system but his size (width & length) in Data system. 实际上我的确切问题是:我想用他的中心在Axis系统中绘制一个matplotlib.patches.Ellipse ,但是他的数据系统中的大小(宽度和长度)。 But the transforms.blended_transform_factory method doesn't work in this case. 但是transforms.blended_transform_factory方法在这种情况下不起作用。

Thanks ! 谢谢 !

To get transformations from the Axes instance ax , you can use 要从Axes实例ax获得转换,您可以使用

axis_to_data = ax.transAxes + ax.transData.inverted()
points_data = axis_to_data.transform(points_axis)
data_to_axis = axis_to_data.inverted()
numpy.testing.assert_allclose(points_axis, data_to_axis.transform(points_data))

No immediate solution found, need to write it by myself : 没有立即找到解决方案,需要自己编写:

def axis_data_coords_sys_transform(axis_obj_in,xin,yin,inverse=False):
    """ inverse = False : Axis => Data
                = True  : Data => Axis
    """
    xlim = axis_obj_in.get_xlim()
    ylim = axis_obj_in.get_ylim()

    xdelta = xlim[1] - xlim[0]
    ydelta = ylim[1] - ylim[0]
    if not inverse:
        xout =  xlim[0] + xin * xdelta
        yout =  ylim[0] + yin * ydelta
    else:
        xdelta2 = xin - xlim[0]
        ydelta2 = yin - ylim[0]
        xout = xdelta2 / xdelta
        yout = ydelta2 / ydelta
    return xout,yout

转换教程之后 ,最简单的方法是使用ax.transLimits

output_coords = ax.transLimits.transform(input_coords)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM