使用 Matplotlib 在 Python 中进行精确数据绘图

Matplotlib 是 Python 开发者进行数据可视化的强大工具。以下是如何开始使用。
64 位读者喜欢这篇文章。
wavegraph

Opensource.com

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

Matplotlib plot of British election data

(© 2019 Anvil)

有关 Python 绘图库的完整比较,请参阅在 Python 中绘制数据的 7 种最流行方法

精确而强大

Matplotlib 是绘图动物园中的鳄鱼。它已经存在一段时间了,但仍然很有咬合力。Matplotlib 使您可以精确控制绘图——但是,像任何精确而强大的东西一样,这有时会迫使您比您想要的更努力地思考。

为了了解我的意思,让我们开始创建多条形图。在我们继续之前,请注意您可能需要调整您的 Python 环境才能运行此代码,包括以下内容。

  • 运行最新版本的 Python(LinuxMacWindows 的说明)
  • 验证您正在运行的 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()

嘿,成功了!

Matplotlib plot of British election data

(© 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])

UK election results with plot line

(© 2019 Anvil)

您可以完全按照您想要的方式获得它,因为 Matplotlib 提供了一个低级 API,可以精确控制事物的外观和显示位置。

如果您希望在其他地方运行此程序,您可以将此示例复制为 Anvil 应用程序 此处(注意:Anvil 需要注册才能使用)。

图表很棒,但我们可以让它更简单吗?

所有这些功能都很棒,但肯定有一些人们一直想制作的图表。为什么没有人将 Matplotlib 包装在一个更高级的接口中,使事情变得更简单?这已经完成了,它被称为 Seaborn。我们下次会研究它。

同时,祝贺您完成第一个 Matplotlib 可视化!


本文基于 Anvil 博客上的 如何使用 Matplotlib 制作图表,经许可重复使用。

接下来阅读什么
User profile image.
Shaun 通过模拟世界最大激光系统中的燃烧聚变等离子体,认真开始了编程。他爱上了 Python 作为数据分析工具,并且从未回头。现在他想把一切都变成 Python。

贡献者

1 条评论

关于绘图的一件事是,仅仅因为你能做某事并不意味着你应该做它。
有一本非常 informative 的书,《定量信息的可视化显示》,作者是 Edward Tufte,书中解释并展示了人们对制作图表的许多误导性想法。其中之一是视觉振动效果,它来自具有交替的线条和空格,例如上面条形图中所示的。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.