geekdoc-python-zh/docs/pythonlibrary/matplotlib-an-intro-to-crea...

15 KiB
Raw Permalink Blame History

matplotlib——用 Python 创建图形的介绍

原文:https://www.blog.pythonlibrary.org/2021/09/07/matplotlib-an-intro-to-creating-graphs-with-python/

数据可视化是与他人共享数据的一种重要方法。有些人把可视化称为绘图、图表或图形。这些名字在本文中是同义的。

Python 有许多第三方包来实现数据可视化。事实上,有这么多,它可以有些不知所措。其中最古老也是最受欢迎的是 Matplotlib 。Matplotlib 以在 Python 中创建静态、动画和交互式可视化而闻名。

您可以使用 Matplotlib 创建许多不同类型的绘图和图表。它还可以与其他数据科学和数学库很好地集成,如 NumPypandas 。您还会发现 Matplotlib 可以与 Python 的大多数 GUI 工具包兼容,如 Tkinter、wxPython 和 PyQt。因为 Matplotlib 如此出名,所以它将是本文所涉及的图形包。

您将了解以下主题:

  • 用 PyPlot 创建简单的折线图
  • 创建条形图
  • 创建饼图
  • 添加标签
  • 向地块添加标题
  • 创造传奇
  • 显示多个图形

让我们开始用 Matplotlib 绘图吧!

安装 Matplotlib

您需要安装 Matplotlib 才能使用它。幸运的是,使用pip很容易做到:

python -m pip install matplotlib 

这将安装 Matplotlib 以及它需要的任何依赖项。现在你已经准备好开始绘图了!

用 PyPlot 创建简单的折线图

创建图表(或绘图)是使用绘图包的主要目的。Matplotlib 有一个名为pyplot的子模块,您将使用它来创建一个图表。首先,创建一个名为line_plot.py的新文件,并添加以下代码:

# line_plot.py

import matplotlib.pyplot as plt

def line_plot(numbers):
    plt.plot(numbers)
    plt.ylabel('Random numbers')
    plt.show()

if __name__ == '__main__':
    numbers = [2, 4, 1, 6]
    line_plot(numbers)

在这里,您将matplotlib.pyplot作为plt导入。然后创建一个line_plot(),它接受一个 Python 数字列表。要绘制数字,您可以使用plot()功能。您还可以向 y 轴添加一个标签。最后,你调用show()来显示情节。

您现在应该会看到一个如下所示的窗口:

Creating a line plot with Matplotlib

现在你知道如何使用 Matplotlib 创建一个简单的折线图了!现在,您将在下一节中了解如何制作条形图。

创建条形图

使用 Matplotlib 创建条形图与创建折线图非常相似。只需要一些额外的参数。继续创建一个名为bar_chart.py的新文件,并在其中输入以下代码:

# bar_chart.py

import matplotlib.pyplot as plt

def bar_chart(numbers, labels, pos):
    plt.bar(pos, numbers, color='blue')
    plt.xticks(ticks=pos, labels=labels)
    plt.show()

if __name__ == '__main__':
    numbers = [2, 1, 4, 6]
    labels = ['Electric', 'Solar', 'Diesel', 'Unleaded']
    pos = list(range(4))
    bar_chart(numbers, labels, pos)

当您使用bar()创建一个条形图时,您会传入一个 x 轴的值列表。然后你传入一个酒吧的高度列表。您还可以选择设置条形的颜色。在这种情况下,您将它们设置为“蓝色”。接下来,设置xticks(),它是应该出现在 x 轴上的刻度线。您还可以传入对应于刻度的标签列表。

继续运行这段代码,您应该会看到下图:

A Simple Bar Chart

也可以用 Matplotlib 做一个水平条形图。你需要做的就是把bar()改成barh()。创建一个名为bar_chartsh.py的新文件,并添加以下代码:

# bar_charth.py

import matplotlib.pyplot as plt

def bar_charth(numbers, labels, pos):
    plt.barh(pos, numbers, color='blue')
    plt.yticks(ticks=pos, labels=labels)
    plt.show()

if __name__ == '__main__':
    numbers = [2, 1, 4, 6]
    labels = ['Electric', 'Solar', 'Diesel', 'Unleaded']
    pos = list(range(4))
    bar_charth(numbers, labels, pos)

这里还有一个偷偷摸摸的变化。你能发现它吗?变化在于,由于现在它是一个水平条形图,您将希望设置yticks()而不是xticks(),否则它看起来不会很正确。

一旦一切准备就绪,运行代码,您将看到以下内容:

Horizontal bar chart

这看起来很棒,而且根本不需要太多代码!现在让我们看看如何用 Matplotlib 创建一个饼图。

创建饼图

饼状图有点与众不同。要创建一个饼图,您将使用 Matplotlib 的subplots()函数,该函数返回一个Figure和一个Axes对象。要查看它是如何工作的,创建一个名为pie_chart_plain.py的新文件,并将以下代码放入其中:

# pie_chart_plain.py

import matplotlib.pyplot as plt

def pie_chart():
    numbers = [40, 35, 15, 10]
    labels = ['Python', 'Ruby', 'C++', 'PHP']

    fig1, ax1 = plt.subplots()
    ax1.pie(numbers, labels=labels)
    plt.show()

if __name__ == '__main__':
    pie_chart()

在这段代码中,您创建了subplots(),然后使用了Axes对象的pie()方法。您像以前一样传入一个数字列表,以及一个标签列表。然后当您运行代码时,您将看到您的饼图:

A plain pie chart

对于这么短的代码来说,这已经很不错了。但是你可以让你的饼图看起来更好。创建一个名为pie_chart_fancy.py的新文件,并添加以下代码,看看如何操作:

# pie_chart_fancy.py

import matplotlib.pyplot as plt

def pie_chart():
    numbers = [40, 35, 15, 10]
    labels = ['Python', 'Ruby', 'C++', 'PHP']
    # Explode the first slice (Python)
    explode = (0.1, 0, 0, 0)

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

if __name__ == '__main__':
    pie_chart()

对于本例,您使用explode参数来告诉饼图“爆炸”或从饼图中移除一个切片。在这种情况下您删除第一个切片它对应于“Python”。您还可以向饼图添加一个shadow。您可以通过设置startangle来告诉您的饼图逆时针旋转一定的角度。如果您想显示切片百分比,可以使用autopct,它将使用 Python 的字符串插值语法。

当您运行这段代码时,您的饼图将如下所示:

A fancier pie chart

这不是很棒吗?你的饼图现在看起来更加完美了!现在是时候学习如何给其他图表添加标签了!

添加标签

当您绘制数据时,您通常会想要标注轴。您可以使用xlabel()功能标记 x 轴,使用相应的ylabel()功能标记 y 轴。要了解这是如何工作的,创建一个名为bar_chart_labels.py的文件,并向其中添加以下代码:

# bar_chart_labels.py

import matplotlib.pyplot as plt

def bar_chart(numbers, labels, pos):
    plt.bar(pos, numbers, color='blue')
    plt.xticks(ticks=pos, labels=labels)
    plt.xlabel('Vehicle Types')
    plt.ylabel('Number of Vehicles')
    plt.show()

if __name__ == '__main__':
    numbers = [2, 1, 4, 6]
    labels = ['Electric', 'Solar', 'Diesel', 'Unleaded']
    pos = list(range(4))
    bar_chart(numbers, labels, pos)

这里你同时调用了xlabel()ylabel()并将它们设置为不同的字符串。这将分别在图表的下方和左侧添加一些说明性文本。结果如下所示:

Bar chart with labels

看起来很不错。你的图表更容易理解,但它缺少一个标题。您将在下一节学习如何做到这一点!

向地块添加标题

用 Matplotlib 给你的图表添加标题非常简单。事实上,你需要做的就是使用title()函数来添加一个。要了解如何操作,创建一个名为bar_chart_title.py的新文件,并向其中添加以下代码:

# bar_chart_title.py

import matplotlib.pyplot as plt

def bar_chart(numbers, labels, pos):
    plt.bar(pos, [4, 5, 6, 3], color='green')
    plt.bar(pos, numbers, color='blue')
    plt.xticks(ticks=pos, labels=labels)
    plt.title('Gas Used in Various Vehicles')
    plt.xlabel('Vehicle Types')
    plt.ylabel('Number of Vehicles')
    plt.show()

if __name__ == '__main__':
    numbers = [2, 1, 4, 6]
    labels = ['Electric', 'Solar', 'Diesel', 'Unleaded']
    pos = list(range(4))
    bar_chart(numbers, labels, pos)

这里的主要变化在第 9 行,在那里调用title()并传入一个字符串。默认情况下,这会设置图形的标题,并使其沿顶部居中。您可以通过将loc参数设置为“left”或“right”来稍微更改位置但是您不能指定标题位于顶部以外的任何位置。还有一个fontdict参数,可以用来控制标题字体的外观。

您还可以向图表中添加一个新的条形图。这有助于您了解堆积条形图的外观,并为下一节做好准备。

你的图表现在看起来是这样的:

Bar chart with title

这张图看起来更好,但它仍然缺少一些东西。哦!你需要一个传奇!让我们看看下一步该怎么做。

创造传奇

向 Matplotlib 图添加图例也很简单。您将使用legend()功能添加一个。创建一个名为bar_chart_legend.py的新文件。然后,向其中添加以下代码:

# bar_chart_legend.py

import matplotlib.pyplot as plt

def bar_chart(numbers, labels, pos):
    plt.bar(pos, [4, 5, 6, 3], color='green')
    plt.bar(pos, numbers, color='blue')
    plt.xticks(ticks=pos, labels=labels)
    plt.xlabel('Vehicle Types')
    plt.ylabel('Number of Vehicles')
    plt.legend(['First Label', 'Second Label'], loc='upper left')
    plt.show()

if __name__ == '__main__':
    numbers = [2, 1, 4, 6]
    labels = ['Electric', 'Solar', 'Diesel', 'Unleaded']
    pos = list(range(4))
    bar_chart(numbers, labels, pos)

在这里,您在图表的show()前添加一个legend()。创建图例时,可以通过传入字符串列表来设置标签。列表应与图形中的地块数量相匹配。您也可以使用loc参数设置图例的位置。

当您运行这段代码时,您将看到您的图形更新成这样:Bar chart with legend

现在你的图拥有了你期望在图中拥有的所有正常组件。至此,您已经看到了许多使用 Matplotlib 可以完成的任务。最后一个要学习的主题是如何用 Matplotlib 将多个图形相加。

显示多个图形

Matplotlib 允许您在显示之前创建几个图。这使您可以同时处理多个数据集。有几种不同的方法可以做到这一点。您将看到一种最简单的方法。

创建一个名为multiple_figures.py的新文件,并添加以下代码:

# multiple_figures.py

import matplotlib.pyplot as plt

def line_plot(numbers, numbers2):
    first_plot = plt.figure(1)
    plt.plot(numbers)

    second_plot = plt.figure(2)
    plt.plot(numbers2)
    plt.show()

if __name__ == '__main__':
    numbers = [2, 4, 1, 6]
    more_numbers = [5, 1, 10, 3]
    line_plot(numbers, more_numbers)

这里您创建了两个线形图。在绘图之前,您调用figure(),这将为调用它之后的绘图创建一个顶级容器。因此,第一个图被添加到图 1第二个图被添加到图 2。当您在最后调用show()Matplotlib 将打开两个窗口,分别显示每个图形。

运行代码,您将在机器上看到以下两个窗口:

Multiple figures at once

Matplotlib 还支持在单个窗口中添加两个或多个图。要了解这是如何工作的,创建另一个新文件,并将其命名为multiple_plots.py。为了使事情更有趣,您将在本例中使用 NumPy 来创建这两个图。

**注意:**如果您还没有安装 NumPy那么您需要安装它来运行这个例子。

此示例基于 Matplotlib 文档中的一个示例:

# multiple_plots.py

import matplotlib.pyplot as plt
import numpy as np

def multiple_plots():
    # Some example data to display
    x = np.linspace(0, 2 * np.pi, 400)
    y = np.sin(x ** 2)

    fig, axs = plt.subplots(2)
    fig.suptitle('Vertically stacked subplots')
    axs[0].plot(x, y)
    axs[1].plot(x, -y)
    plt.show()

if __name__ == '__main__':
    multiple_plots()

这里你创建了两个独立的正弦波图。为了让它们都出现在同一个窗口中,您可以调用subplots(),这是一个方便的实用程序,可以在一次调用中创建多个图形。然后您可以使用它返回的Axes对象来绘制您用 NumPy 创建的数据。

结果看起来像这样:

Stacking multiple plots

如果您不想使用 NumPy您可以绘制上一个示例中的两组数字。事实上你应该试试。继续创建一个名为multiple_plots2.py的新文件,并添加以下代码:

# multiple_plots2.py

import matplotlib.pyplot as plt

def multiple_plots():
    numbers = [2, 4, 1, 6]
    more_numbers = [5, 1, 10, 3]
    fig, axs = plt.subplots(2)
    fig.suptitle('Vertically stacked subplots')
    axs[0].plot(numbers)
    axs[1].plot(more_numbers)
    plt.show()

if __name__ == '__main__':
    multiple_plots()

在这段代码中,您完全删除了 NumPy 代码,并添加了前面示例中的两个数字列表。然后使用Axes对象绘制它们。

这导致了以下堆积图:

Another stacked plot

至此,您应该已经很好地掌握了如何使用 Matplotlib 创建多个图形和堆叠图。

包扎

Matplotlib 是一个很棒的包,可以用来创建各种简洁的图形。令人惊讶的是,从数据中创建一个有用的绘图只需要编写几行代码。在本文中,您了解了以下主题:

  • 用 PyPlot 创建简单的折线图
  • 创建条形图
  • 创建饼图
  • 添加标签
  • 向地块添加标题
  • 创造传奇
  • 显示多个图形

Matplotlib 非常强大,有很多这里没有涉及的特性。您可以使用 Matplotlib 创建许多其他类型的可视化。有一个更新的包叫做 Seaborn ,它构建在 Matplotlib 之上,使它的图形看起来更好。还有许多其他完全独立的 Python 绘图包。您会发现 Python 支持您能想到的几乎任何类型的图,可能还有许多您不知道的图。

相关阅读

想了解更多关于 Python 的功能吗?查看这些教程: