Python 插入轴的特定位置

Python 插入轴的特定位置,python,matplotlib,graph,Python,Matplotlib,Graph,我想创建一组轴,以便在父轴集中的特定位置形成插入。因此,仅在插入轴中使用参数loc=1,2,3是不合适的,如下所示: inset_axes = inset_axes(parent_axes, width="30%", # width = 30% of parent_bbox height=1., # height : 1 inch loc=3) 然而,我想要接近这个的东西。答

我想创建一组轴,以便在父轴集中的特定位置形成插入。因此,仅在
插入轴中使用参数
loc=1,2,3
是不合适的,如下所示:

inset_axes = inset_axes(parent_axes,
                    width="30%", # width = 30% of parent_bbox
                    height=1., # height : 1 inch
                    loc=3)
然而,我想要接近这个的东西。答案似乎比我的问题要复杂一些

所以,问题是,在上面的代码中是否有一个参数可以替换,该参数允许在父轴中自定义插入轴的位置?我曾尝试使用
bbox\u to\u锚定
,但不了解它的规范或行为。具体而言,我尝试过:

 inset_axes = inset_axes(parent_axes,
                        width="30%", # width = 30% of parent_bbox
                        height=1., # height : 1 inch
                        bbox_to_anchor=(0.4,0.1))
尝试使插图左侧和底部的锚分别位于x轴和y轴的40%和10%。或者,我试着把它放在绝对坐标中:

inset_axes = inset_axes(parent_axes,
                            width="30%", # width = 30% of parent_bbox
                            height=1., # height : 1 inch
                            bbox_to_anchor=(-4,-100))
这两种方法都不正确,给了我一个无法解释的警告


更一般地说,
loc
似乎是属于
matplotlib
的许多函数中的一个非常标准的参数,因此,是否有一个通用的解决方案可以在任何地方使用?这似乎就是
bbox\u to\u anchor
的含义,但我还是不知道如何正确使用它

你采取的方法原则上是正确的。然而,就像使用
bbox\u到\u锚定
一样,位置被确定为
bbox\u到\u锚定
loc
之间的相互作用。以上链接答案中的大部分解释也适用于此处

默认的
loc
loc=1
(“右上”)。这意味着,如果指定
bbox\u to\u anchor=(0.4,0.1)
,则这些将是右上角的坐标,而不是左下角的坐标。
因此,您需要指定
loc=3
,以将插图的左下角定位在
(0.4,0.1)

但是,只有在不以相对单位指定宽度和高度的情况下,将边界指定为2元组才有意义(
“30%”
)。或者换句话说,为了使用相对单位,您需要为
bbox\u to\u锚定使用4元组表示法

如果在轴单位中指定
bbox\u to_锚定
,则需要再次使用
bbox\u transform
参数,就像前面解释的图例一样,并将其设置为
ax.transAxes

plt.figure(figsize=(6,3))
ax = plt.subplot(221)
ax.set_title("100%, (0.5,1-0.3,.3,.3)")
ax.plot(xdata, ydata)
axins = inset_axes(ax, width="100%", height="100%", loc='upper left',
                   bbox_to_anchor=(0.5,1-0.3,.3,.3), bbox_transform=ax.transAxes)


ax = plt.subplot(222)
ax.set_title("30%, (0.5,0,1,1)")
ax.plot(xdata, ydata)
axins = inset_axes(ax, width="30%", height="30%", loc='upper left',
                   bbox_to_anchor=(0.5,0,1,1), bbox_transform=ax.transAxes)

在matplotlib页面上找到完整的示例:

另一个选项是使用
InsetPosition
而不是
inset\u轴
,并为现有轴提供一个新位置
InsetPosition
将轴左下角的x和y坐标(在标准化轴坐标中)以及宽度和高度作为输入

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition

fig, ax= plt.subplots()

iax = plt.axes([0, 0, 1, 1])
ip = InsetPosition(ax, [0.4, 0.1, 0.3, 0.7]) #posx, posy, width, height
iax.set_axes_locator(ip)

iax.plot([1,2,4])
plt.show()
最后应该提到,从matplotlib 3.0开始,您可以使用

结果大致相同,只是
mpl_工具箱.axes_grid1.inset_定位器.inset_轴
允许在轴周围填充(默认情况下应用),而
axes.inset_轴
没有这种填充


使用ImportanceOfBeingErnest的答案和未发布的
matplotlib
文档(如和)中的几个建议链接,我仍然花了一些时间来弄清楚所有参数的行为。因此,为了清楚起见,我将在这里重复我的理解。我最终使用了:

bbox_ll_x = 0.2
bbox_ll_y = 0
bbox_w = 1
bbox_h = 1
eps = 0.01
inset_axes = inset_axes(parent_axes, 
               height="30%", #height of inset axes as frac of bounding box
               width="70%",  #width of inset axes as frac of bounding box
               bbox_to_anchor=(bbox_ll_x,bbox_ll_y,bbox_w-bbox_ll_x,bbox_h), 
               loc='upper left',
               bbox_transform=parent_axes.transAxes)

parent_axes.add_patch(plt.Rectangle((bbox_ll_x, bbox_ll_y+eps),
               bbox_w-eps-bbox_ll_x, 
               bbox_h-eps, 
               ls="--", 
               ec="c", 
               fc="None",
               transform=parent_axes.transAxes))
bbox\u ll\u x
是父轴坐标中边界框左下角的x位置(即
bbox\u变换的含义
输入)

bbox\u ll\u y
是父轴坐标中边界框左下角的y位置

bbox\u w
是父轴坐标中边界框的宽度

bbox_h
是父轴坐标中边界框的高度

eps
是一个小数字,用于在绘制矩形边界框时从轴下方显示矩形

我使用了
add_patch
调用,以放置一条青色虚线,表示绘制的边界框的内边缘

对我来说,最棘手的部分是意识到
高度
宽度
输入(指定为百分比时)与边界框大小有关。这就是为什么(如以下链接和答案中所述)如果以百分比为单位指定插入轴的大小,则必须为
bbox\u to\u anchor
参数指定一个4元组。如果将插入轴的大小指定为百分比,并且不提供
bbox\u w
bbox\u h
如何获得插入轴的绝对大小


另一件事是,
loc
参数指定在边界框中定位插入轴的位置。据我所知,这是该参数的唯一函数

我尝试了
插入轴(ax3,height=“30%”,width=“70%”,bbox\u-to\u-anchor=(0.4,0.6),loc=3)
但它产生了一个警告:
用户警告:无法找到沿轴的像素距离来填充刻度;假设不需要间隔填充。
并且插入显示为父轴外的一个小轴。您是对的。matplotlib中存在错误或文档中存在错误。我想知道发生了什么。这是否意味着我可以停止构建一个?或者,你能分享一下你所构建的吗?是的,我可以很容易地复制这个问题。你会在GitHub上找到关于这一点的mcve。我还更新了解决方案的答案。这可能与插入轴一样容易使用。
bbox\u to\u锚定
生成一个框。在该框内,将创建指定宽度和高度的插图,并根据
loc
参数对齐。公共关系仍未合并。文档的预览版本为。连同
bbox_ll_x = 0.2
bbox_ll_y = 0
bbox_w = 1
bbox_h = 1
eps = 0.01
inset_axes = inset_axes(parent_axes, 
               height="30%", #height of inset axes as frac of bounding box
               width="70%",  #width of inset axes as frac of bounding box
               bbox_to_anchor=(bbox_ll_x,bbox_ll_y,bbox_w-bbox_ll_x,bbox_h), 
               loc='upper left',
               bbox_transform=parent_axes.transAxes)

parent_axes.add_patch(plt.Rectangle((bbox_ll_x, bbox_ll_y+eps),
               bbox_w-eps-bbox_ll_x, 
               bbox_h-eps, 
               ls="--", 
               ec="c", 
               fc="None",
               transform=parent_axes.transAxes))