Matplotlib中如何让新增子坐标轴的饼图居中于指定坐标点
Matplotlib中如何让新增子坐标轴的饼图居中于指定坐标点
我来帮你搞定这个问题!你现在的核心问题是没搞清楚fig.add_axes()参数的逻辑——你之前是把子坐标轴的左下角放在了目标点的归一化坐标上,但饼图是在子坐标轴的中心显示的,所以得调整子轴的位置计算方式,让子轴的中心刚好对准主图里的目标点,饼图自然就居中了。
先给你理清楚关键思路:
- 你对目标点的归一化计算是对的,
x_norm和y_norm是目标点在figure坐标系(范围0到1)下的坐标值,这就是我们要让子轴中心落在的位置。 fig.add_axes()的left和bottom参数是子坐标轴左下角在figure坐标系的位置,而子轴的中心坐标是left + width/2和bottom + height/2。- 所以要让子轴中心等于
(x_norm, y_norm),就得倒推left和bottom:left = x_norm - width/2bottom = y_norm - height/2
接下来是修改后的完整代码,我加上了详细注释,还优化了细节:
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 3)) ax.set_xlim(0,16) ax.set_ylim(8,12) # 绘制正弦曲线 x = np.arange(0, 5*np.pi, 0.1) y = np.sin(x)+10 ax.plot(x, y, color="blue") # 标记我们要让饼图居中的目标点 ax.plot(12,10,marker="o", color="red") # 1. 将目标点的主图坐标转换为figure的归一化坐标(0-1范围) x_min, x_max = ax.get_xlim() y_min, y_max = ax.get_ylim() x_norm = (12 - x_min) / (x_max - x_min) # 计算结果是0.75 y_norm = (10 - y_min) / (y_max - y_min) # 计算结果是0.5 # 2. 定义子坐标轴的尺寸(可以根据需求调整大小) sub_ax_width = 0.1 sub_ax_height = 0.1 # 3. 计算子坐标轴的左下角位置,确保子轴中心与目标点归一化坐标重合 left_pos = x_norm - sub_ax_width / 2 bottom_pos = y_norm - sub_ax_height / 2 # 添加子坐标轴并绘制饼图 sub_ax = fig.add_axes(rect=(left_pos, bottom_pos, sub_ax_width, sub_ax_height)) sub_ax.pie((0.2,0.3,0.5)) # 隐藏子轴的边框和刻度,让饼图更美观 sub_ax.axis('off') plt.show()
这样调整后,子坐标轴的中心就精准对准主图里的(12,10)点了,饼图默认在子轴中心渲染,自然就和你标记的红点完全重合。另外,加上sub_ax.axis('off')是个小技巧,能去掉子轴多余的边框和刻度,让整体画面更干净。
如果之后你要调整主图的x/y轴范围,记得用ax.get_xlim()和ax.get_ylim()动态获取边界值,这样归一化计算就不用手动改参数了,更灵活。
内容来源于stack exchange
相关产品推荐
相关产品推荐

