我正在尝试理解这段代码:
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)
原始代码来自this notebook file。
我不明白为什么需要进行两次坐标转换:
inax_position = ax.transAxes.transform(rect[0:2])
infig_position = ax.figure.transFigure.inverted().transform(inax_position)
答案 0 :(得分:4)
在方法next
中,a.subscribe(val => b.next(val));
是轴坐标中的矩形。这是有道理的,因为你经常想要指定相对于它所居住的轴的插入位置
但是,为了以后能够创建新轴,需要在图形坐标中知道轴位置,然后可以将其赋予add_inset(ax, rect)
。
因此,需要的是从轴坐标到图形坐标的坐标变换。这是在两个步骤中执行的:
rect
从轴坐标转换为显示坐标。fig.add_axes(figurecoordinates)
的倒数从显示坐标转换为图形坐标。这个两步程序可以在单个转换中进一步压缩,如
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