转换坐标系:轴坐标 ⇔ 数据坐标

26
我的问题很简单:在matplotlib中,如何轻松地将坐标从轴系统转换为/从数据系统转换(理想情况下,我正在寻找一个简单的函数output_coords = magic_func(input_coords))。
实际上,我的确切问题是: 我想绘制一个matplotlib.patches.Ellipse,它的中心在轴系统中,但其大小(宽度和长度)在数据系统中。 但是,在这种情况下,transforms.blended_transform_factory方法不起作用。

4
你可能需要查看这个链接:http://matplotlib.org/users/transforms_tutorial.html - Arthur
3个回答

32

要从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))

1
你好,这个解决了我的问题。有没有文档页面可以解释如何结合trans*()方法和类? - n1_
3
@grafa 请查看这个教程。这里的想法是每个“transform”实例都提供了工具,将某些特定系统的坐标转换为像素/点的通用“显示”坐标。反向变换则相反。当您添加多个变换实例时,它会创建一个新类的新实例,按顺序执行这些变换。因此,上面的“transform”调用从轴到通用,然后从通用到数据。 - Luke Davis
注意,这里的 data_to_axis 相当于 ax.TransData + ax.transAxes.inverted()。更加简洁的方法是使用内置(但文档不太好)的 ax.transLimitsax.transLimits.inverted() 变换分别进入/从坐标轴坐标中转换。 - corvus

12

按照transforms教程所述,最简单的方法是使用ax.transLimits

output_coords = ax.transLimits.transform(input_coords)

3
只是提醒其他人,这个答案是针对“轴→数据”的情况。对于“数据→轴”,应该使用output_coords = ax.transLimits.inverted().transform(input_coords) - golmschenk
2
@golmschenk 我认为你的评论很有帮助,但是你弄反了(至少对于最新版本来说)。transLimits数据坐标转换为坐标。 - corvus
@corvus,好的错别字发现! - golmschenk

3
没有找到即时解决方案,需要自己编写代码:
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

这很不错,谢谢。使用 axis_obj_in.get_[x or y]scale(),它很容易被修改为适用于对数坐标轴。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接