使用 Matplotlib 绘制带标注的柱状图

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本教程中,我们将学习如何使用Matplotlib中的bar_label辅助函数来创建带标签的柱状图。我们将涵盖各种场景,如标记水平和垂直柱状图、使用不同的标签格式以及自定义标签外观。

虚拟机使用提示

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

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

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

导入库

首先,我们需要导入必要的库,包括numpymatplotlib。我们还将使用numpy中的random模块来生成一些随机数据。

import matplotlib.pyplot as plt
import numpy as np

## Fixing random state for reproducibility
np.random.seed(19680801)

垂直柱状图标注

我们将首先创建一个垂直柱状图,并使用bar_label函数为其添加标注。我们使用的数据是按性别统计的企鹅数量,数据来自https://allisonhorst.github.io/palmerpenguins/ 。

species = ('阿德利企鹅', '帽带企鹅', '巴布亚企鹅')
性别数量 = {
    '雄性': np.array([73, 34, 61]),
    '雌性': np.array([73, 34, 58]),
}
宽度 = 0.6  ## 柱状图的宽度:也可以是x的长度序列

fig, ax = plt.subplots()
底部 = np.zeros(3)

for 性别, 性别数量 in 性别数量.items():
    p = ax.bar(物种, 性别数量, 宽度, label=性别, bottom=底部)
    底部 += 性别数量

    ax.bar_label(p, label_type='center')

ax.set_title('按性别统计的企鹅数量')
ax.legend()

plt.show()

注:原文中species翻译为“物种”更合适,这里为了和代码中的变量名对应,翻译为“物种”,实际在文档语境中理解为“企鹅种类”更准确。你可根据实际需求调整。

水平柱状图标注

接下来,我们将创建一个水平柱状图,并使用bar_label函数为其添加标注。我们将使用上一步中的数据,但这次我们将为每个人生成一些随机的性能数据。

人员 = ('汤姆', '迪克', '哈里', '斯利姆', '吉姆')
y_pos = np.arange(len(人员))
性能 = 3 + 10 * np.random.rand(len(人员))
误差 = np.random.rand(len(人员))

fig, ax = plt.subplots()

水平柱状图 = ax.barh(y_pos, 性能, xerr=误差, align='center')
ax.set_yticks(y_pos, labels=人员)
ax.invert_yaxis()  ## 标签从上到下读取
ax.set_xlabel('性能')
ax.set_title('你今天想多快到达?')

## 用特殊格式的浮点数标注
ax.bar_label(水平柱状图, fmt='%.2f')
ax.set_xlim(right=15)  ## 调整xlim以适应标签

plt.show()

高级柱状图标注

在这一步中,我们将展示一些使用柱状图标签可以实现的更高级的操作。我们将使用与上一步相同的水平柱状图。

fig, ax = plt.subplots()

hbars = ax.barh(y_pos, performance, xerr=error, align='center')
ax.set_yticks(y_pos, labels=people)
ax.invert_yaxis()  ## 标签从上到下读取
ax.set_xlabel('性能')
ax.set_title('你今天想多快到达?')

## 使用给定的标题、自定义填充和注释选项进行标注
ax.bar_label(hbars, labels=[f'±{e:.2f}' for e in error],
             padding=8, color='b', fontsize=14)
ax.set_xlim(right=16)

plt.show()

使用 {} 风格格式字符串进行柱状图标注

在这一步中,我们将展示如何使用 {} 风格的格式字符串来格式化柱状图标签。我们将使用一些按口味分类的意式冰淇淋销售数据。

水果名称 = ['咖啡味', '咸焦糖味', '开心果味']
水果销量 = [4000, 2000, 7000]

fig, ax = plt.subplots()
柱状图容器 = ax.bar(水果名称, 水果销量)
ax.set(ylabel='销售的品脱数', title='按口味分类的意式冰淇淋销售情况', ylim=(0, 8000))
ax.bar_label(柱状图容器, fmt='{:,.0f}')

使用可调用对象进行柱状图标注

最后,我们将展示如何使用可调用对象来格式化柱状图标签。我们将使用一些不同动物奔跑速度的数据。

动物名称 = ['狮子', '瞪羚', '猎豹']
英里每小时速度 = [50, 60, 75]

fig, ax = plt.subplots()
柱状图容器 = ax.bar(动物名称, 英里每小时速度)
ax.set(ylabel='英里每小时速度', title='奔跑速度', ylim=(0, 80))
ax.bar_label(柱状图容器, fmt=lambda x: f'{x * 1.61:.1f} 公里/小时')

总结

在本教程中,我们学习了如何使用Matplotlib中的bar_label辅助函数来创建带标注的柱状图。我们涵盖了各种场景,如标注水平和垂直柱状图、使用不同的标签格式以及自定义标签外观。