Python 提供了丰富的选项用于可视化数据。我将向您展示在 Matplotlib 中绘制图表的基础知识,通过创建一个带有分组条形图的条形图。它显示了 1966 年至 2020 年英国的选举结果

(© 2019 Anvil)
有关 Python 绘图库的完整比较,请参阅在 Python 中绘制数据的 7 种最流行方法。
精确而强大
Matplotlib 是绘图动物园中的鳄鱼。它已经存在一段时间了,但仍然很有咬合力。Matplotlib 使您可以精确控制绘图——但是,像任何精确而强大的东西一样,这有时会迫使您比您想要的更努力地思考。
为了了解我的意思,让我们开始创建多条形图。在我们继续之前,请注意您可能需要调整您的 Python 环境才能运行此代码,包括以下内容。
数据可在线获取,可以使用 pandas 导入
import pandas as pd
df = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')
现在我们准备好了。首先导入 Matplotlib 和 Numpy
import matplotlib.pyplot as plt
import numpy as np
它采用宽格式,意味着每个政党都有一列
year conservative labour liberal others
0 1966 253 364 12 1
1 1970 330 287 6 7
2 Feb 1974 297 301 14 18
.. ... ... ... ... ...
12 2015 330 232 8 80
13 2017 317 262 12 59
14 2019 365 202 11 72
接下来,告诉 Matplotlib 您正在创建一个包含单个轴的图形。它为您提供了一个 Figure 和 Axis 对象。如果您有多个子图,则您有一个 Figure 和多个 Axes。
# Create a Figure with one Axis on it
fig, ax = plt.subplots()
制作条形图
现在添加条形图本身。多条形图是通过在同一轴上绘制四个单独的条形图来制作的——将每个条形图偏移一定的量,以便它们并排显示。这意味着您必须计算出每个条形图的偏移量,并且如果您想添加另一个政党,您将不得不重新考虑您的计算。
# The x-values of the bars.
years = df['year']
x = np.arange(len(years))
# The width of the bars (1 = the whole width of the 'year group')
width = 0.15
# Create the bar charts!
ax.bar(x - 3*width/2, df['conservative'], width, label='Conservative', color='#0343df')
ax.bar(x - width/2, df['labour'], width, label='Labour', color='#e50000')
ax.bar(x + width/2, df['liberal'], width, label='Liberal', color='#ffff14')
ax.bar(x + 3*width/2, df['others'], width, label='Others', color='#929591')
轴标签和图例
那是它自己创建的图,但您仍然需要添加一些轴标签和图例
# Notice that features like labels and titles are added in separate steps
ax.set_ylabel('Seats')
ax.set_title('UK election results')
ax.set_xticks(x) # This ensures we have one tick per year, otherwise we get fewer
ax.set_xticklabels(years.astype(str).values, rotation='vertical')
ax.legend()
让魔法发生
最后,调用魔法词使图表出现在屏幕上
plt.show()
嘿,成功了!

(© 2019 Anvil)
这需要一些脑力劳动,但您得到了一个漂亮、干净的图表。
力量
您可能可以看到此 API 如何为您提供强大的功能。让我们想象一下,您想绘制一条线,显示保守党和工党之间的席位差异。当您这样做时,在背景中添加一组网格线并设置一些合理的 Y 轴限制
ax.plot(x, df['conservative'] - df['labour'], label='Conservative lead over Labour', color='black', linestyle='dashed')
ax.grid(color='#eeeeee')
ax.set_axisbelow(True)
ax.set_ylim([-500, 500])

(© 2019 Anvil)
您可以完全按照您想要的方式获得它,因为 Matplotlib 提供了一个低级 API,可以精确控制事物的外观和显示位置。
如果您希望在其他地方运行此程序,您可以将此示例复制为 Anvil 应用程序 此处(注意:Anvil 需要注册才能使用)。
图表很棒,但我们可以让它更简单吗?
所有这些功能都很棒,但肯定有一些人们一直想制作的图表。为什么没有人将 Matplotlib 包装在一个更高级的接口中,使事情变得更简单?这已经完成了,它被称为 Seaborn。我们下次会研究它。
同时,祝贺您完成第一个 Matplotlib 可视化!
本文基于 Anvil 博客上的 如何使用 Matplotlib 制作图表,经许可重复使用。
1 条评论