创建饼图中的条形图

Beginner

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

简介

在本教程中,你将学习如何使用 Python 的 Matplotlib 库创建一个「复合饼图」(Bar of Pie chart)。复合饼图是饼图和堆积条形图的组合,其中饼图的第一块被展开为一个条形图,并对其特征进行进一步细分。当你想要展示整个数据集的分布,同时突出特定类别时,此图表非常有用。

虚拟机使用提示

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

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

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

导入必要的库

在开始创建图表之前,我们需要导入必要的库。在这种情况下,我们将使用 matplotlib.pyplotnumpy

import matplotlib.pyplot as plt
import numpy as np

定义图表数据

接下来,我们需要定义用于创建图表的数据。在这种情况下,我们将使用以下数据:

## 饼图参数
overall_ratios = [.27,.56,.17]
labels = ['批准', '不批准', '未决定']
explode = [0.1, 0, 0]

## 条形图参数
age_ratios = [.33,.54,.07,.06]
age_labels = ['35 岁以下', '35 - 49 岁', '50 - 65 岁', '65 岁以上']

创建饼图

现在我们可以创建饼图了。我们首先定义图形和轴对象:

## 生成图形并分配轴对象
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 5))
fig.subplots_adjust(wspace=0)

然后我们设置饼图的参数并绘制它:

## 旋转以便第一个楔形被 x 轴分割
angle = -180 * overall_ratios[0]
wedges, *_ = ax1.pie(overall_ratios, autopct='%1.1f%%', startangle=angle,
                     labels=labels, explode=explode)

创建条形图

接下来,我们创建堆积条形图。我们首先定义图表的参数:

## 条形图参数
bottom = 1
width =.2

## 从顶部添加与图例匹配。
for j, (height, label) in enumerate(reversed([*zip(age_ratios, age_labels)])):
    bottom -= height
    bc = ax2.bar(0, height, width, bottom=bottom, color='C0', label=label,
                 alpha=0.1 + 0.25 * j)
    ax2.bar_label(bc, labels=[f"{height:.0%}"], label_type='center')

连接饼图和条形图

最后,我们使用 ConnectionPatch 连接饼图和条形图:

## 使用 ConnectionPatch 在两个图之间绘制线条
theta1, theta2 = wedges[0].theta1, wedges[0].theta2
center, r = wedges[0].center, wedges[0].r
bar_height = sum(age_ratios)

## 绘制顶部连接线
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = r * np.sin(np.pi / 180 * theta2) + center[1]
con = ConnectionPatch(xyA=(-width / 2, bar_height), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
con.set_linewidth(4)
ax2.add_artist(con)

## 绘制底部连接线
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = r * np.sin(np.pi / 180 * theta1) + center[1]
con = ConnectionPatch(xyA=(-width / 2, 0), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
ax2.add_artist(con)
con.set_linewidth(4)

显示图表

最后,我们显示图表:

plt.show()

总结

在本教程中,你学习了如何使用 Python 的 Matplotlib 库创建一个「饼图中的条形图」。当你想要展示整个数据集的分布,同时突出特定类别时,饼图中的条形图很有用。你还学习了如何使用 ConnectionPatch 连接饼图和条形图。