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

Matplotlib饼图:为各百分比值设置不同的pctdistance

实现饼图百分比标签自定义距离中心的位置

嘿,这个问题我之前也踩过坑!matplotlib的pie()函数里的pctdistance确实只支持单个数值,没法直接传列表,但我们可以手动调整每个百分比文本的位置来实现你要的效果。下面是具体的解决方案和修改后的代码:

核心思路

  1. 先正常绘制饼图,获取到百分比文本的对象列表
  2. 计算每个饼块的中心角度,结合自定义的距离值,重新计算每个文本的坐标
  3. 逐个设置百分比文本的新位置

修改后的代码

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10,10))
ax11 = fig.add_subplot(111)

# 数据定义
labels = 'Python', 'C++', 'Ruby', 'Java'
sizes = [215, 130, 245, 2000]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0)  # 突出第一个饼块

# 自定义每个百分比标签距离中心的距离(顺序对应各个饼块)
pct_distances = [0.6, 0.8, 0.9, 0.7]

# 绘制饼图,获取饼块、标签、百分比文本对象
w, l, p = ax11.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', 
                   startangle=140, pctdistance=0.8, radius=0.5)

# 统一设置百分比标签的旋转角度和字体大小
for text in p:
    text.set_rotation(0)
    text.set_fontsize(50)

# 计算每个饼块的中心角度,调整百分比标签位置
total_size = sum(sizes)
current_angle = -140  # 对应startangle的初始角度(逆时针旋转140度开始)
for idx, (size, dist) in enumerate(zip(sizes, pct_distances)):
    # 计算当前饼块的中心角度(转换为弧度制)
    mid_angle = current_angle + (size / total_size) * 180
    mid_angle_rad = np.deg2rad(mid_angle)
    # 根据距离和角度计算新坐标
    new_x = dist * np.cos(mid_angle_rad)
    new_y = dist * np.sin(mid_angle_rad)
    # 更新百分比文本的位置
    p[idx].set_position((new_x, new_y))
    # 累加角度,处理下一个饼块
    current_angle += (size / total_size) * 360

plt.axis('equal')  # 保证饼图是正圆形
plt.show()

效果说明

  • 现有效果:所有百分比标签都固定在pctdistance指定的同一圆环上,位置统一但缺乏灵活性
  • 期望效果:通过自定义pct_distances列表,每个百分比标签会按照你设置的距离值分布在不同的半径位置,实现错落有致的展示

你可以根据实际需求调整pct_distances里的数值,数值越大,标签离中心越远,反之则越近。

内容的提问来源于stack exchange,提问作者Silvia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:13:35