Matplotlib协调转化

时间:2017-03-21 16:26:53

标签: python matplotlib

我正在尝试理解这段代码:

def add_inset(ax, rect, *args, **kwargs):
    box = ax.get_position()
    inax_position = ax.transAxes.transform(rect[0:2])
    infig_position = ax.figure.transFigure.inverted().transform(inax_position)
    new_rect = list(infig_position) + [box.width * rect[2], box.height * rect[3]]
    return fig.add_axes(new_rect, *args, **kwargs)

此代码为现有图形添加了插图。它看起来像这样: enter image description here

原始代码来自this notebook file

我不明白为什么需要进行两次坐标转换:

inax_position = ax.transAxes.transform(rect[0:2])
infig_position = ax.figure.transFigure.inverted().transform(inax_position)

1 个答案:

答案 0 :(得分:4)

解释

在方法next中,a.subscribe(val => b.next(val)); 是轴坐标中的矩形。这是有道理的,因为你经常想要指定相对于它所居住的轴的插入位置 但是,为了以后能够创建新轴,需要在图形坐标中知道轴位置,然后可以将其赋予add_inset(ax, rect)。 因此,需要的是从轴坐标到图形坐标的坐标变换。这是在两个步骤中执行的:

  1. 使用rect从轴坐标转换为显示坐标。
  2. 使用fig.add_axes(figurecoordinates)的倒数从显示坐标转换为图形坐标。
  3. 这个两步程序可以在单个转换中进一步压缩,如

    transAxes

    关于转换如何工作,阅读matplotlib transformation tutorial可能是有意义的。

    替代

    以上可能不是放置插图最明显的方法。 Matplotlib本身提供了一些工具。一种方便的方法是transFigure。以下是在轴坐标中创建插入时使用其mytrans = ax.transAxes + ax.figure.transFigure.inverted() infig_position = mytrans.transform(rect[0:2]) 方法的两种方法。

    mpl_toolkits.axes_grid1.inset_locator

    enter image description here