Matplotlib 如何在饼图中显示真实数值而非百分比

Matplotlib 如何在饼图中显示真实数值而非百分比

在本文中,我们将介绍如何使用Matplotlib来展示真实数值,而非百分比,以呈现更为直观的数据可视化。

阅读更多:Matplotlib 教程

饼图表示法简介

饼图是以圆形的方式展示数据分布的一种图表示法,通常用于比较不同类别之间的数量或占比关系。饼图在数据可视化中的应用颇具争议,因为它可能造成一些误导。

例如,在下面这个示例中,我们使用的是饼图表示全球六大洲的人口占比。从图中可以看到,亚洲占全球人口的51.8%,而非洲仅占15.2%。

import matplotlib.pyplot as plt

labels = 'Asia', 'Africa', 'Europe', 'North America', 'South America', 'Oceania'
sizes = [51.8, 15.2, 9.4, 7.5, 5.8, 0.5]

fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
ax1.axis('equal')

plt.show()
Python

然而,饼图有一个主要的缺陷,即对于普通公众而言并不直观,因为他们更习惯于查看数字而非图形展示。此外,当饼图中的类别数量过多或数量相似时,图形变得越发难以阅读。

那么,如何使用Matplotlib解决这个问题呢?

饼图实践:展示真实数值

为了展示真实数值而非百分比,我们需要在饼图中显示合适的标签,并使用文本注释的方式在图中标记具体数值。

下面是一个实际的例子,展示了2018年美国国内航班延误的原因分布情况。我们将每个原因的数值明确地标注在饼图上。

import matplotlib.pyplot as plt

labels = 'Carrier', 'Extreme Weather', 'National Aviation System', 'Late Aircraft', 'Security', 'Others'
sizes = [3.4, 4.8, 10.0, 22.8, 0.2, 58.8]
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99', '#ac33ff', '#cccccc']

fig, ax = plt.subplots()

total = sum(sizes)
ax.pie(sizes, colors=colors, startangle=90, autopct=lambda p: '{:.1f}%  ({:.0f})'.format(p, p * total / 100))
ax.legend(labels=labels, loc='lower left')
ax.set_title("2018 Annual Delay Reason Distribution - Domestic Flights")

plt.show()
Python

在这个例子中,我们使用了autopct参数来显示真实数值和百分比。具体实现方式是在函数中写一个格式化字符串,例如{:.1f}% ({:.0f}),以代表百分比和真实数值。然后,我们通过lambda表达式将函数作为格式化字符串的参数传递进去,即:

autopct=lambda p: '{:.1f}%  ({:.0f})'.format(p, p * total / 100)
Python

上述表达式将传递的参数P代表的是当前数据在整体数据中的百分比。total变量存储的就是整体数据的总数。

改进饼图

要注意的是,将真实数值展示在饼图上,只是饼图展示中的一种更为可读的方式之一,但并不是唯一的方式。下面是在上面示例中使用条形图的版本:

import matplotlib.pyplot as plt

labels = 'Carrier', 'Extreme Weather', 'National Aviation System', 'Late Aircraft', 'Security', 'Others'
sizes = [3.4, 4.8, 10.0, 22.8, 0.2, 58.8]
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99', '#ac33ff', '#cccccc']

fig, ax = plt.subplots()

ax.bar(labels, sizes, color=colors)
ax.set_title("2018 Annual Delay Reason Distribution - Domestic Flights")
ax.set_ylabel("Percentage of Delay")
for i in range(len(labels)):
    ax.annotate(str(sizes[i])+"%", xy=(labels[i], sizes[i]), ha='center', va='bottom')

plt.show()
Python

在这个例子中,我们使用了条形图来展示数据,并将每个原因的数值标注在每条柱形的顶部。这样,公众可以更容易地查看具体的数字而无需读取饼图上的标签。

总结

虽然饼图是一种传统的图形展示方式,但其在真实数据展示方面的确存在一定的局限性。在实践过程中,要根据数据特点和受众需求,选择更为恰当的数据展示方式,并尽可能地使数据呈现出更鲜活的一面。Matplotlib提供了多种数据展示方式,可以在各个场景中添加一些不一样的色彩,以更好地凸显数据特点。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册