【问题标题】:Python/Matplotlib : convert Axis <=> Data coordinates systemsPython/Matplotlib:转换 Axis <=> 数据坐标系
【发布时间】:2023-04-10 07:49:01
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 你可能应该看看this

标签: python matplotlib coordinate-systems coordinate-transformation


【解决方案1】:

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

【讨论】:

  • 您好,这惊人地解决了我的问题。是否有任何文档页面解释了 trans*() 方法和类的组合?
  • @grafa 看到这个tutorial。这里的想法是,每个“变换”实例都提供了将坐标从某些特殊系统转换为以像素/点为单位的通用“显示”坐标的工具。逆变换则相反。当您添加多个转换实例时,它会创建一个新类的新实例,该类按顺序执行这些转换。所以,上面的transform 调用从轴到通用,然后从通用到数据。
【解决方案2】:

按照transforms tutorial,最简单的方法是使用 ax.transLimits.

output_coords = ax.transLimits.transform(input_coords)

【讨论】:

  • 就像其他人的注释一样,此答案适用于轴 -> 数据。对于数据 -> 轴,它是 output_coords = ax.transLimits.inverted().transform(input_coords)
【解决方案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(),它也可以很容易地修改为适用于对数缩放轴。
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多