跳至主要内容

Python 饼图:使用 Pandas 和 Matplotlib 构建与美化

学习如何使用 Python 的 Matplotlib 与 Pandas 库构建并优化饼图。通过实用代码示例与关键设计技巧,制作清晰易读的可视化。
· 7分钟 阅读

使用 AI 探索

饼图是用于可视化占比最常见的图表之一。您大概已经很熟悉了;如果不熟悉,不妨把它想象成一个大馅饼,或者一块圆形的瑞士奶酪,被切成不同大小的扇形。

Python 提供了多种创建饼图的方法。本文将重点介绍如何使用 Matplotlib 和 Pandas(Python 中最受欢迎的两个数据分析工具包)来创建饼图。我们将按方法来组织内容,方便您专注于最契合自己工作流程的思路与语法。

除了这些方法,我们还会提供一些增强饼图排版、排错、可访问性与可用性的提示。最后,我们也会讨论在某些场景下可能比饼图更合适的替代图表。

在 Python 中创建饼图的方式

我将展示两种创建 Python 饼图的方法,您可以自行选择更偏好的那一种。两种方法都很流行且可行,选哪种都不会错。

方法一:使用 Matplotlib 绘制饼图

先来看看如何用 Matplotlib 创建饼图。

在本节中,我们将分析 DataCamp 课程目录中不同课程的相关数据,您可以在这里找到。(我浏览了目录,统计了各项技术对应的课程数量,并据此创建了一个表格。)

如何创建图表

要用 Matplotlib 创建第一个饼图,可以使用 plt.pie() 函数。我们将使用一个列表来表示不同数据与 AI 技术对应的课程数(每个值代表一个扇形的大小),再用第二个列表存放技术名称,通过 labels 参数将其显示在图中。或者,我们也可以使用 plt.legend() 添加单独的图例。

像往常一样,别忘了在代码末尾运行 plt.show(),以正确显示 Matplotlib 图表。

import pandas as pd
import matplotlib.pyplot as plt

courses = [164, 127, 31, 31,12, 11]
labels = ['Python','R','SQL','Power BI','Excel','ChatGPT']
dictionary = {'courses':courses, 'labels':labels}
python_pie_chart_df = pd.DataFrame(dictionary)

plt.pie(x = python_pie_chart_df.courses, labels = python_pie_chart_df.labels)
plt.show()

带图例的基础 Python 饼图

plt.pie(x = python_pie_chart_df.courses)
plt.legend(labels = python_pie_chart_df.labels, loc = [0.95,0.35])
plt.show()

基础 Python 饼图

此外,我们还可以使用 autopct 参数显示每个扇形的百分比。下面的示例中,我们以一位小数显示扇形大小。

plt.pie(x = python_pie_chart_df.courses, labels = python_pie_chart_df.labels, autopct='%1.1f%%') 
plt.show()

带标签的 Python 饼图

如何自定义图表

Matplotlib 的饼图及其组成的扇形具有很高的可定制性。让我们看看 pie.plot() 函数提供的一些选项。

要更改扇形的颜色,可以使用 colors 参数。我们将使用该参数将 DataCamp 的配色方案应用到图表中。

datacamp_palette = ['#03ef62','#06bdfc','#ff6ea9','#ff931e','#ff5400','#7933ff']
plt.pie(x = python_pie_chart_df.courses, labels = python_pie_chart_df.labels, colors = datacamp_palette, autopct='%1.1f%%')
plt.show()

使用自定义配色的 Python 饼图

看起来是不是顺眼多了?我们还能做更多自定义。例如,可以分别通过 labeldistance 和 pctdistance 参数调节标签与百分比的距离,并使用 startangle 参数设置开始切分的角度。

plt.pie(x = python_pie_chart_df.courses, labels = python_pie_chart_df.labels, colors = datacamp_palette, autopct='%1.1f%%', 
pctdistance= 0.8, labeldistance=1.1, startangle=180)

plt.show()

最后,设想您在做演示,想突出 R 课程。一种简便的方式是使用 explode 参数将对应扇形“炸开”以强调,如下所示:

explode = (0, 0.1, 0, 0, 0, 0)  # only "explode" the 2nd slice (i.e. 'R')

plt.pie(x = python_pie_chart_df.courses, labels = python_pie_chart_df.labels, 
        colors = datacamp_palette, autopct='%1.1f%%', 
        pctdistance= 0.8, labeldistance=1.1, 
        startangle=180, explode=explode)

plt.show()

如何保存图表

创建好饼图后,您就可以与协作伙伴分享了。可以使用 plt.savefig() 函数,将文件名作为输入参数,并保存为 .png、.jpg、.svg 或 .pdf 等多种格式。此外,您可以使用 dpi 调整图像分辨率。

下面是一个示例,展示如何以 .jpg 格式保存饼图,分辨率为每英寸 200 点。

plt.pie(x = df.courses, labels = df.labels, 
        colors = datacamp_palette, autopct='%1.1f%%', 
        pctdistance= 0.8, labeldistance=1.1, 
        startangle=180, explode=explode)

plt.savefig('demo.jpg', dpi =200)

关于如何正确保存可视化,您可以在我们的课程 Introduction to Data Visualization with Matplotlib 中了解更多。

方法二:使用 Pandas 绘制饼图

现在您已经了解了如何用 Matplotlib 创建饼图,我们再来看看在 Pandas 中如何实现。

如何创建图表

Pandas 提供了一个 plot() 方法,可用于绘制多种类型的图表。该方法既适用于 DataFrame,也适用于 Series。您可以通过 plot() 方法中的 kind 参数指定图表类型。在我们的场景中,将 kind ='pie' 即可创建饼图。您还可以添加 labels 参数为每个扇形命名,以及 autopct 参数显示每一片的百分比。

python_pie_chart_df['courses'].plot(kind='pie', labels=python_pie_chart_df['labels'], autopct='%1.1f%%')
plt.show()

如何自定义图表

Pandas 的 plot() 方法能快速绘图,但自定义选项有限。好在它以 Matplotlib 为后端,这意味着您可以在方法之外使用 Matplotlib 语法来自定义可视化。下面是一个结合 Pandas 与 Matplotlib 的示例。

ax= python_pie_chart_df['courses'].plot(kind='pie', labels=python_pie_chart_df['labels'], autopct='%1.1f%%', 
                       colors=datacamp_palette, figsize=(5,5))

ax.set_title('Pie Chart DatataCamp Courses')
ax.set_ylabel(None)

plt.show()

如何保存图表

在 Pandas 中保存饼图与在 Matplotlib 中完全相同,因为 Pandas 的底层依赖 Matplotlib。

ax= python_pie_chart_df['courses'].plot(kind='pie', labels=python_pie_chart_df['labels'], autopct='%1.1f%%', 
                       colors=datacamp_palette, figsize=(5,5))

ax.set_title('Pie Chart DatataCamp Courses')
ax.set_ylabel(None)

plt.savefig('demo.png')

饼图故障排查

要确保饼图正确显示,您必须为 Matplotlib 提供正确的数据。这意味着应始终在数据框中执行数据清洗操作,例如用 pd.dropna() 删除空值,并为输入列设置正确的数据类型。

此外,自定义对于呈现有说服力且有影响力的饼图至关重要。但请注意,如果您使用的是 Pandas,类似“炸开”等高级自定义可能不受支持。如前所述,如果您需要对饼图有更多控制,可能需要在脚本中加入 Matplotlib 代码。

提升可访问性与可用性

在展示饼图时,应遵循良好实践。

  • 了解您的受众: 一条黄金法则是始终设身处地为可视化的受众着想。这意味着要充分了解受众的专业领域、技术水平和兴趣点。
  • 去除杂乱: 为避免难以阅读、信息拥挤的可视化,请自问所呈现的内容是否与受众相关,尽可能移除不必要的元素。对于饼图,避免使用 3D 效果或阴影,因为它们可能妨碍解读。
  • 注意字体: 尽管使用多种字体和字号可能很诱人,但通常建议只使用一种字体且不超过三种字号。遵循字体层级,让标题大于正文,并用粗体强调关键元素与标题。
  • 巧用颜色: 颜色是任何数据可视化中最吸引眼球的元素之一。因此,请认真选择可视化的配色方案。这意味着在不同可视化之间保持一致的调色板,并系统化地用颜色区分群组、重要程度以及不同的信息层级。
  • 多设备测试: 建议始终在多种设备上测试您的图表,以观察其呈现效果。

数据可视化可以被视为一门艺术。直觉和审美会带来差异,但也应始终考虑其背后的理论。想了解更多有效数据可视化的最佳实践,请查看我们的数据叙事与沟通速查表。此外,如果您在制作仪表板,不妨阅读这篇文章:设计仪表板的最佳实践。

饼图的替代方案

说实话,饼图是被批评最多的图表之一。已有研究表明,人类并不擅长解读角度。我们可以用上面使用过的饼图来说明这一点。看看 Excel 和 ChatGPT 这两块扇形。您能一眼分辨出哪个角度更大吗?

多半很难。这也是为什么许多数据可视化专家建议在表示占比时使用其他图表,尤其是在类别较多时,比如条形图与堆叠条形图、矩形树图,甚至是甜甜圈图。您可以在我们的文章常见数据图表类型及其在 Python 中的实现中了解更多这些替代方案。

总结

恭喜您读到教程末尾。Python 是一门高度多样化的编程语言,提供了多种库与方法来创建饼图。本文介绍了如何使用 Matplotlib 和 Pandas 创建饼图。两者都同样胜任,并且有许多相似之处。理念不是二选一,而是根据您的需求与工作流程灵活互换使用。

如果您想进一步了解饼图,或者更广泛地了解 Python 数据可视化,DataCamp 随时为您提供帮助。浏览我们的精选资料,准备成为可视化高手吧!

Javier Canales Luna

作者

Javier Canales Luna

我是一名自由职业的数据分析师,与全球各地的公司和组织合作开展数据科学项目。我也担任数据科学讲师,拥有2年以上授课经验。我经常用英语和西班牙语撰写与数据科学相关的文章,其中一些已发表在 DataCamp、Towards Data Science 和 Analytics Vidhya 等知名网站上。作为一名具有政治学与法律背景的数据科学家,我的目标是在公共政策、法律与技术的交汇处开展工作,借助思想的力量推动创新解决方案与叙事,帮助我们应对紧迫挑战,尤其是气候危机。我认为自己是自学成才、不断进步的人,坚定支持跨学科合作。学习新事物永远不嫌晚。

常见问答

什么是饼图,何时应该使用?

饼图是一种将圆形按比例分割成多个扇区的图形,每个扇区代表整体的一部分。因此,它适合用于表示比例关系。

如何在 Matplotlib 中创建饼图?

使用 plt.pie() 函数是用 Matplotlib 创建饼图的最简单方式,并且它提供了多种自定义参数。

如何在 Pandas 中创建饼图?

使用 Series.plot.(kind=’pie’) 方法是用 Pandas 创建饼图的最简单方式。它能快速在 Pandas DataFrame 上进行可视化,但与 Matplotlib 相比自定义选项有限。

创建饼图的最佳实践有哪些?

创建可视化时应始终遵循最佳实践。这包括尽量保持饼图简洁、避免不必要元素、选择直观的配色方案,并根据受众调整图表。

饼图的主要局限是什么?

人类并不擅长解读角度,这就是为什么许多可视化专家建议使用其他图表(如条形图)来表示比例。

主题