Matplotlib饼图优化:解决标签重叠、添加引导线、调整字号问题

问题解决方案
1. textprops修改fontsize不生效的原因
你设置的字体大小没有直观变化,核心原因是默认画布尺寸过小,渲染时字体被自动压缩适配画布,只需要在创建子图时指定足够大的figsize即可看到字体大小的实际变化。
2. 添加饼块与标签的引导线
matplotlib的pie方法没有内置引导线参数,我们可以先获取每个饼块的角度、中心位置,再通过plot方法为每个标签绘制对应的连接线。
3. 解决顶部标签重叠问题
调用pie方法时会返回所有标签的文本对象,直接修改重叠标签的y轴坐标即可实现上移,避免重叠。
完整可运行代码
import matplotlib.pyplot as plt import numpy as np labels = 'Control & Handling of Events', 'Arch. Structures & Viewpoints', 'Distribution of Components', 'Arch. Styles', 'Concurrency', 'Interaction & Presentation', 'Error & Exeption Handling', 'Fam. of Prog. & Frameworks','Security & Safety', 'Design Patterns', 'Arch. Design Decisions', 'Data Persistence' sizes = [59, 40, 21, 21, 19, 17, 11, 8, 8, 5, 4, 4] colors = ['#00305d','#003d69','#014b76','#025883', '#03668f','#04749c','#0481a9','#058fb6', '#069dc2','#07aacf','#08b8dc','#09c6e9'] # 调整画布尺寸,保证字体大小可以正常显示 fig1, ax1 = plt.subplots(figsize=(14, 10)) # 接收pie返回的楔形对象、标签文本对象 wedges, texts = ax1.pie(sizes, colors=colors, labels=['%s, (%1.1f%%)' % (l, s) for l, s in zip(labels, sizes)], shadow=False, textprops={'color':"k", 'fontsize': 12}, startangle=90, labeldistance=1.2) # 调远标签距离,预留引导线空间 # 调整第一个标签的位置,向上移动避免重叠,移动幅度可自行修改 texts[0].set_y(texts[0].get_y() + 0.08) # 为每个标签添加引导线 for wedge, text in zip(wedges, texts): # 获取饼块的角度中点 ang = (wedge.theta2 + wedge.theta1) / 2 # 计算引导线的起点(饼块边缘坐标) x1 = wedge.r * 0.95 * np.cos(np.deg2rad(ang)) y1 = wedge.r * 0.95 * np.sin(np.deg2rad(ang)) # 引导线终点(标签附近坐标) x2 = text.get_position()[0] * 0.95 y2 = text.get_position()[1] * 0.95 # 绘制连接线,颜色、粗细可自行调整 ax1.plot([x1, x2], [y1, y2], color='gray', linewidth=1) ax1.axis('equal') plt.tight_layout() # 自动调整布局避免标签被截断 plt.show()
内容的提问来源于stack exchange,提问作者aripod
相关产品推荐
相关产品推荐

