Matplotlib 如何避免饼图中标签和自动百分比的重叠

Matplotlib 如何避免饼图中标签和自动百分比的重叠

饼图是数据可视化中常用的图表类型之一,Matplotlib作为常用的Python绘图库,提供了丰富的饼图绘制函数。但是,在进行饼图绘制时,经常会遇到标签和自动百分比重叠的问题,影响可视化效果。那么,如何避免这个问题呢?本文将介绍一些常用的方法。

阅读更多:Matplotlib 教程

绘制基本饼图

在介绍解决标签重叠问题之前,让我们先来快速了解一下如何使用Matplotlib绘制基本的饼图。以下代码展示了一个简单的饼图示例。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10] # 各部分占比
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']

plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)

plt.axis('equal') # 保证饼图为正圆
plt.show()
Python

运行上述代码,将会得到一个简单的饼图。

解决标签重叠问题

在默认情况下,Matplotlib会把标签放在对应扇形区域的中心位置并且旋转一定角度,这样的布局方式会导致标签和自动百分比互相重叠。

为了解决这个问题,我们可以尝试使用下面的几种方法。

方法一:调整标签位置

Matplotlib提供了一个labeldistance参数,可以调整标签和圆心的距离,使标签不再与圆饼重叠。以下代码展示了一个调整labeldistance参数的饼图示例。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10] # 各部分占比
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']

plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
        startangle=90, labeldistance=1.1)

plt.axis('equal') # 保证饼图为正圆
plt.show()
Python

我们将labeldistance参数设置为1.1,运行上述代码,将会得到一个标签不重叠的饼图。

方法二:使用较小的字体

另一个常用的方法是使用较小的字体,让标签和自动百分比能够更好地适应圆形区域。Matplotlib提供了字体大小的控制参数fontsize,可以使用它来调整字体大小。以下代码展示了一个调整字体大小的饼图示例。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10] # 各部分占比
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']

plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
        startangle=90, textprops={'fontsize': 10})

plt.axis('equal') # 保证饼图为正圆
plt.show()
Python

我们将fontsize参数设置为10,运行上述代码,将会得到一个字体较小的饼图。

方法三:使用更复杂的标签布局

如果以上方法都无法解决问题,我们可以尝试使用更复杂的标签布局,比如将标签分为两行或者使用外部标签。以下代码展示了一个使用外部标签的饼图示例。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10] # 各部分占比
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']

fig, ax = plt.subplots()

# 绘制饼图
wedges, texts, autotexts = ax.pie(sizes, colors=colors, autopct='%1.1f%%',
                                  startangle=90)

# 调整位置和大小
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    ax.annotate(labels[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
                horizontalalignment=horizontalalignment, **kw)

# 添加标题
ax.set_title("External Labels")

plt.show()
Python

运行上述代码,将会得到一个使用外部标签的饼图。

总结

本文介绍了三种解决饼图中标签和自动百分比重叠问题的方法:调整标签位置、使用较小的字体和使用更复杂的标签布局。在实际应用中,我们可以根据具体情况选择适合自己的方法,提高可视化效果。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册