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

Cov*_*ich 9 python matplotlib coordinate-systems coordinate-transformation

我的问题很简单:在matplotlib中,如何轻松地将Axis系统中的坐标转换为数据系统(从理想情况来说,我正在寻找一个简单的函数output_coords = magic_func(input_coords))

实际上我的确切问题是:我想matplotlib.patches.Ellipse用他的中心在Axis系统中绘制一个但是他的数据系统中的大小(宽度和长度).但是这种transforms.blended_transform_factory方法在这种情况下不起作用.

谢谢 !

wil*_*mpa 15

要从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))
Run Code Online (Sandbox Code Playgroud)

  • @grafa 看到这个 [教程](https://matplotlib.org/users/transforms_tutorial.html)。这里的想法是每个“转换”实例都提供了将坐标从某些特殊系统转换为以像素/点为单位的通用“显示”坐标的工具。反向变换则相反。当您添加多个转换实例时,它会创建一个新类的新实例,依次执行这些转换。所以,上面的 `transform` 调用从轴到通用,然后从通用到数据。 (3认同)

eme*_*mem 7

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

output_coords = ax.transLimits.transform(input_coords)
Run Code Online (Sandbox Code Playgroud)

  • 正如其他人的注释一样,这个答案适用于轴 -&gt; 数据。对于数据 -&gt; 轴,它是 `output_coords = ax.transLimits.inverted().transform(input_coords)` (3认同)
  • @golmschenk我认为你的评论很有帮助,但你把它倒退了(至少对于最新版本)。`transLimits` 采用 *data* 坐标 -&gt; *axes* 坐标。 (2认同)

Cov*_*ich 4

没有立即找到解决方案,需要自己编写:

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
Run Code Online (Sandbox Code Playgroud)