简介
在本教程中,你将学习如何使用 Python 的 Matplotlib 库创建一个「复合饼图」(Bar of Pie chart)。复合饼图是饼图和堆积条形图的组合,其中饼图的第一块被展开为一个条形图,并对其特征进行进一步细分。当你想要展示整个数据集的分布,同时突出特定类别时,此图表非常有用。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到「笔记本」(Notebook)标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入必要的库
在开始创建图表之前,我们需要导入必要的库。在这种情况下,我们将使用 matplotlib.pyplot 和 numpy。
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 连接饼图和条形图。