使用 Matplotlib 绘制嵌套饼图

Beginner

This tutorial is from open-source community. Access the source code

简介

饼图是一种流行的数据可视化工具,用于以圆形形式表示数据。然而,有时你可能想要创建饼图的嵌套版本,即所谓的圆环图。本教程将指导你使用 Matplotlib(Python 中一个流行的数据可视化库)创建嵌套饼图。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

首先,我们需要导入必要的库。在这种情况下,我们需要Matplotlibnumpy

import matplotlib.pyplot as plt
import numpy as np

使用ax.pie创建嵌套饼图

我们可以使用ax.pie方法创建一个嵌套饼图。我们将首先生成一些虚假数据,对应于三个组。在内圈中,我们将把每个数字视为属于其自己的组。在外圈中,我们将把它们绘制为其原始三个组的成员。

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()

使用ax.bar创建嵌套饼图

我们还可以在具有极坐标系统的轴上使用ax.bar方法创建嵌套饼图。这在绘图的精确设计上可能会提供更大的灵活性。

fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
## 将 vals 归一化到 2π
valsnorm = vals/np.sum(vals)*2*np.pi
## 获取条形边缘的纵坐标
valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.bar(x=valsleft[:, 0],
       width=valsnorm.sum(axis=1), bottom=1-size, height=size,
       color=outer_colors, edgecolor='w', linewidth=1, align="edge")

ax.bar(x=valsleft.flatten(),
       width=valsnorm.flatten(), bottom=1-2*size, height=size,
       color=inner_colors, edgecolor='w', linewidth=1, align="edge")

ax.set(title="Pie plot with `ax.bar` and polar coordinates")
ax.set_axis_off()
plt.show()

自定义嵌套饼图

我们可以通过更改颜色、添加标签和调整大小来自定义嵌套饼图。

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

## 添加标签
labels = ['组 1', '组 2', '组 3']
ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'), labels=labels, labeldistance=0.7)

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

## 设置标题
ax.set(aspect="equal", title='嵌套饼图')

plt.show()

保存嵌套饼图

我们可以将嵌套饼图保存为 png、pdf 或 svg 格式的图像。

fig.savefig('nested_pie_chart.png', dpi=300, bbox_inches='tight')

总结

在本教程中,我们学习了如何使用两种方法在 Matplotlib 中创建嵌套饼图:ax.pieax.bar。我们还学习了如何通过添加标签、更改颜色和调整大小来自定义嵌套饼图。最后,我们了解了如何将嵌套饼图保存为 png、pdf 或 svg 格式的图像。