Matplotlib饼图:为各百分比值设置不同的pctdistance
实现饼图百分比标签自定义距离中心的位置
嘿,这个问题我之前也踩过坑!matplotlib的pie()函数里的pctdistance确实只支持单个数值,没法直接传列表,但我们可以手动调整每个百分比文本的位置来实现你要的效果。下面是具体的解决方案和修改后的代码:
核心思路
- 先正常绘制饼图,获取到百分比文本的对象列表
- 计算每个饼块的中心角度,结合自定义的距离值,重新计算每个文本的坐标
- 逐个设置百分比文本的新位置
修改后的代码
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
相关产品推荐
相关产品推荐

