You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中如何让新增子坐标轴的饼图居中于指定坐标点

Matplotlib中如何让新增子坐标轴的饼图居中于指定坐标点

我来帮你搞定这个问题!你现在的核心问题是没搞清楚fig.add_axes()参数的逻辑——你之前是把子坐标轴的左下角放在了目标点的归一化坐标上,但饼图是在子坐标轴的中心显示的,所以得调整子轴的位置计算方式,让子轴的中心刚好对准主图里的目标点,饼图自然就居中了。

先给你理清楚关键思路:

  1. 你对目标点的归一化计算是对的,x_norm和y_norm是目标点在figure坐标系(范围0到1)下的坐标值,这就是我们要让子轴中心落在的位置。
  2. fig.add_axes()的left和bottom参数是子坐标轴左下角在figure坐标系的位置,而子轴的中心坐标是left + width/2和bottom + height/2。
  3. 所以要让子轴中心等于(x_norm, y_norm),就得倒推left和bottom:
    • left = x_norm - width/2
    • bottom = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:24:35