Matplotlib中axes_divider宿主轴内嵌轴的宽高比与尺寸位置问询
我来帮你把inset_axes的宽高比、尺寸和位置设置逻辑讲明白,你现在的代码其实已经摸到了核心技巧,咱们拆解开说:
一、尺寸设置:百分比与绝对数值的区别
inset_axes的width和height参数有两种常用写法:
- 百分比字符串:比如
"20%",这个百分比是相对于主轴的对应维度的——width对应主轴的宽度占比,height对应主轴的高度占比。 - 绝对数值:比如
2(单位是英寸),直接指定内嵌轴的固定尺寸,不受主轴大小缩放的影响。
你代码里用百分比是为了适配主轴的动态缩放,但因为主轴是矩形,直接设相同百分比的宽高会得到和主轴同比例的内嵌轴,所以才需要用ratio = bbox.width / bbox.height来调整宽度的百分比,保证内嵌轴是方形。
二、宽高比控制:两种更省心的方法
方法1:利用主轴宽高比计算(你当前的思路)
你的代码逻辑完全正确:通过bbox.width / bbox.height拿到主轴的宽高比,然后让内嵌轴的宽度百分比 = 高度百分比 / 宽高比,这样实际渲染时:
内嵌轴实际宽度 = (size/ratio)% * 主轴宽度 = (size/(主轴宽/主轴高))% * 主轴宽 = size% * 主轴高 内嵌轴实际高度 = size% * 主轴高
两者数值相等,自然就是方形。
方法2:直接指定aspect参数(更简洁)
其实不用手动计算比例,inset_axes支持直接设置aspect='equal'来强制方形,再配合单一维度的尺寸即可:
inset_right_upper = inset_axes( base_ax, width="20%", height="20%", loc=loc, aspect='equal' )
或者结合make_axes_locatable工具类,写法更直观:
divider = make_axes_locatable(base_ax) # 从主轴的upper left位置添加一个20%尺寸、间距0.1、方形的内嵌轴 inset_ax = divider.append_axes(loc, size="20%", pad=0.1, aspect=1)
三、位置设置:灵活控制内嵌轴的摆放
loc参数是最常用的位置控制方式,支持两种输入:
- 字符串枚举:比如
"upper left"、"lower right"、"center"等,对应九宫格位置。 - 数字编码:1到9分别对应左下到右上的九宫格(1=左下,5=中心,9=右上)。
如果需要更自由的位置(比如偏离标准九宫格),可以用bbox_to_anchor参数配合归一化坐标:
inset_right_upper = inset_axes( base_ax, width="15%", height="15%", aspect='equal', loc='center', # 内嵌轴的中心对齐到目标点 bbox_to_anchor=(0.3, 0.7), # 目标点的归一化坐标(0-1,对应主轴的左下到右上) bbox_transform=base_ax.transAxes # 使用主轴的坐标系 )
这样就能精准把内嵌轴放在主轴的任意位置啦~
内容的提问来源于stack exchange,提问作者j_n
相关产品推荐
相关产品推荐

