如何在Matplotlib饼图中分离两个占比较小的数值
解决饼图小占比类别文本重叠问题
针对你遇到的“Shared room”和“Hotel room”文本重叠问题,核心原因是这两个类别占比过小,仅靠explode参数不足以拉开文本距离,你可以尝试以下几种解决方案:
方案1:增大小占比类别的偏移量+调整百分比文本距离
修改explode参数给小占比类别设置更大的偏移,同时通过pctdistance让百分比文本离饼图中心更远,避免重叠:
fig, ax = plt.subplots(figsize=(12, 8), subplot_kw=dict(aspect="equal")) labels = available_rooms.room_type.tolist() sizes = available_rooms['percent'].tolist() # 给小占比类别设置更大的偏移值(根据实际类别顺序调整索引) explode = (0.1, 0, 0.3, 0.3) wedges, texts, autotexts = ax.pie( sizes, autopct='%1.1f%%', explode=explode, textprops=dict(color="w"), pctdistance=0.8 # 调整百分比文本与饼图中心的距离,默认是0.6 ) ax.legend(wedges, labels, title="RoomTypes", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1)) plt.setp(autotexts, size=8, weight="bold") ax.set_title("Type of rooms available in the Listing") plt.tight_layout() # 优化布局,避免图例或标题被截断 plt.show()
方案2:手动调整重叠文本位置
如果方案1效果仍不理想,可以手动定位重叠的百分比文本:
# 承接方案1的代码,在plt.setp之后添加 # 根据实际文本索引调整位置坐标 autotexts[2].set_position((1.2, 0.2)) autotexts[3].set_position((1.2, -0.2))
方案3:合并极小占比类别
若这两个类别占比极低,可将其合并为“Other”类别,避免视觉混乱:
# 预处理数据,合并占比低于阈值的类别 threshold = 1 # 设置占比阈值,低于该值的类别合并 small_percent = sizes[2] + sizes[3] labels = labels[:2] + ["Other"] sizes = sizes[:2] + [small_percent] explode = (0.1, 0, 0.1) # 后续饼图绘制代码与原代码一致

内容的提问来源于stack exchange,提问作者Sepid
相关产品推荐
相关产品推荐

