跳至主要内容

Matplotlib 教程:在 Python 中绘制折线图、柱状图与散点图

基于真实股票市场数据,手把手教您在 Matplotlib 中构建并自定义折线图、柱状图与散点图。
· 12分钟 阅读

使用 AI 探索

在本教程中,我将演示如何使用股票市场数据在 Matplotlib 中创建折线图、柱状图和散点图。教程假设您对NumPy 数组和pandas DataFrame已有一定了解。文中会在出现时解释每个库调用的作用,但重点放在 Matplotlib 本身。

要点速览

  • Matplotlib 是 Python 的基础绘图库 — 通过 pip install matplotlib 安装,并以 import matplotlib.pyplot as plt 导入

  • 用 plt.plot(x, y) 绘制折线图,用 plt.bar(x, height) 绘制柱状图,用 plt.scatter(x, y) 绘制散点图

  • 使用 plt.show() 显示图表,或用 plt.savefig('filename.png') 保存图表

  • 用 plt.title()、plt.xlabel()、plt.ylabel() 和 color 参数自定义图表

  • 连续数据可使用颜色映射(cmap),多序列图可添加 plt.legend()

什么是 Matplotlib?

Matplotlib 是 Python 中使用最广泛的可视化库,截至 2026 年每月下载量超过 5000 万。它可创建静态、交互式和动画图表,包括折线图、柱状图、散点图、直方图等。多数其他 Python 可视化库(Seaborn、pandas 的绘图功能,甚至Plotly 的部分能力)都构建在 Matplotlib 之上。

Matplotlib 能对每个视觉元素进行精细控制,但这也意味着即便是基础图表往往需要更多代码。如果您更关注快速探索性绘图,Seaborn 提供了更高级的默认样式,开箱即用的效果更好。若需要交互式的网页图表,可以考虑 Plotly Express。

完成本教程后,您将会掌握如何创建如下所示的折线图、柱状图与散点图,并了解自定义的基础操作:选择颜色、添加标签与标题、设置坐标轴范围及将图像保存为文件。

image14.png

开始使用 Matplotlib

话不多说,让我们加载 Matplotlib,并快速查看本教程使用的数据集。

加载 Matplotlib

在创建任何图表前,您需要导入该库。pyplot 子模块提供了本教程中使用的所有绘图函数。

约定俗成地将 pyplot 起别名为 plt。我还会导入 pandas、NumPy 和 datetime,后续章节会用到。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from datetime import datetime

加载道琼斯工业平均指数(DJIA)数据集

Matplotlib 旨在与 NumPy 数组和 pandas 数据帧协同工作。该库可轻松从表格数据生成图形。本教程使用 2022-01-01 至 2022-12-31 的道琼斯工业平均指数(DJIA)历史价格(来源)。您可以在页面上设置日期范围,然后点击“download a spreadsheet”按钮下载。

我们将使用 pandas 加载名为 HistoricalPrices.csv 的 CSV 文件,并通过 .head() 方法查看前几行。

import pandas as pd

djia_data = pd.read_csv('HistoricalPrices.csv')
djia_data.head()

image19.png

可以看到数据包含 4 列:Date、Open、High、Low 和 Close。后四列与指数在交易日内的价格相关。下面是每个变量的简要说明。

  • Date:该行数据所对应的日期。
  • Open:股市在东部时间上午 9:30 开盘时 DJIA 的价格。
  • High:当日 DJIA 达到的最高价格。
  • Low:当日 DJIA 达到的最低价格。
  • Close:东部时间下午 4:00 收盘时 DJIA 的价格。

作为一个快速清洗步骤,我们需要使用 pandas 的 rename() 方法,因为下载的数据集中列名前多了一个空格。

djia_data = djia_data.rename(columns = {' Open': 'Open', ' High': 'High', ' Low': 'Low', ' Close': 'Close'})

我们还将 Date 列转换为 datetime 类型,并按日期升序排序。关于数据类型转换的更多内容,请参阅Python 数据类型转换教程。

djia_data['Date'] = pd.to_datetime(djia_data['Date'])
djia_data = djia_data.sort_values(by = 'Date')

用 Matplotlib 绘制折线图

折线图展示数值在连续维度(最常见的是时间)上的变化。对于时间序列数据,它是首选图表,因为连线能一眼揭示趋势、季节性与异常。

单折线图

我们可以使用 plt.plot() 方法创建折线图,第一个参数是 x 变量,第二个参数是 y 变量。每次创建图表后,都要确保调用 plt.show() 才能看到生成的图形。下面我们可视化 DJIA 的收盘价随时间的变化。

plt.plot(djia_data['Date'], djia_data['Close'])
plt.show()

image1.png

可以看到全年走势中,指数在年初处于高位,随后全年上下波动。大约在 10 月达到年内低点,随后在年底出现强劲回升。

多折线图

要在同一张图中展示多条折线,只需在 plt.show() 之前再调用一次 plt.plot()。

plt.plot(djia_data['Date'], djia_data['Open'])
plt.plot(djia_data['Date'], djia_data['Close'])


plt.show()

image16.png

全年来看,每个交易日的开盘价与收盘价彼此接近,并无明确的长期“谁总在谁之上”的规律。

添加图例

若要区分每条折线代表的含义,可以添加图例,这会在图的角落生成颜色对应的标签。使用 plt.legend(),并在每次 plt.plot() 调用中添加 label 参数即可。

plt.plot(djia_data['Date'], djia_data['Open'], label = 'Open')
plt.plot(djia_data['Date'], djia_data['Close'], label = 'Close')
plt.legend()
plt.show()

image2.png

现在在右上角的默认位置看到了带有指定标签的图例(也可通过 plt.legend() 的 loc 参数指定位置)。

用 Matplotlib 绘制柱状图

柱状图非常适合比较不同类别的数值,尤其便于找出最高与最低的类别。

本节中,我们使用 pandas 的 .groupby() 将数据聚合为每月平均值,以比较 DJIA 的月度表现。若想深入了解分组操作,请参阅Pandas GroupBy 教程。

# Import the calendar package 
from calendar import month_name

# Order by months by chronological order
djia_data['Month'] = pd.Categorical(djia_data['Date'].dt.month_name(), month_name[1:])

# Group metrics by monthly averages
djia_monthly_mean = djia_data \
    .groupby('Month') \
    .mean(numeric_only=True) \
    .reset_index()

djia_monthly_mean.head(6)

image5.png

垂直柱状图

我们先创建一个竖向柱状图。使用 plt.bar() 方法,第一个参数为 x 轴变量(Month),height 参数为 y 轴变量(Close)。然后调用 plt.show() 显示图表。

plt.bar(djia_monthly_mean['Month'], height = djia_monthly_mean['Close'])
plt.show()

image9.png

可以看到,大多数月份的 DJIA 平均收盘价接近;6 月最低,1 月最高。

柱状图重新排序

如果希望按月度平均收盘价从高到低显示这些柱,可以使用 pandas 的 sort_values() 对数据排序,再用相同的 plt.bar() 方法绘图。

djia_monthly_mean_srtd = djia_monthly_mean.sort_values(by = 'Close', ascending = False)

plt.bar(djia_monthly_mean_srtd['Month'], height = djia_monthly_mean_srtd['Close'])
plt.show()

image10.png

这样更易于看出哪些月份平均收盘价最高、哪些最低,也便于跨月份比较与排序。

水平柱状图

有时将柱状图改为横向更易阅读标签。可以使用 plt.barh() 方法实现。

plt.barh(djia_monthly_mean_srtd['Month'], width = djia_monthly_mean_srtd['Close'])
plt.show()

image17.png
可以看到,各类别(月份)的标签比竖向时更易阅读,同时仍然便于跨组比较。类别很多时,横向柱状图尤其实用。

用 Matplotlib 绘制散点图

散点图展示两个数值变量之间的关系。每个点代表一条观测,整体形态揭示线性、非线性或无关关系,从而直接影响建模方法的选择。

创建基础散点图

与其他图表类似,散点图可用 pyplot.scatter() 创建,第一个参数是 x 轴变量,第二个参数是 y 轴变量。本例考察 DJIA 的开盘价与收盘价之间的关系。

plt.scatter(djia_data['Open'], djia_data['Close'])
plt.show()

image4.png

x 轴为开盘价,y 轴为收盘价。正如预期,开盘价越高,收盘价也越高,二者呈现明显的正相关关系。

添加趋势线

接下来,为图形添加趋势线,以更明确地展示开盘与收盘变量之间的线性关系。我们将使用 numpy 的 polyfit() 与 poly1d()。前者执行最小二乘多项式拟合:第一个参数是 x 变量,第二个是 y 变量,第三个是拟合阶数(1 表示线性);后者基于系数生成一维多项式类,随后用 plt.plot() 画出趋势线。

z = np.polyfit(djia_data['Open'], djia_data['Close'], 1)
p = np.poly1d(z)


plt.scatter(djia_data['Open'], djia_data['Close'])
plt.plot(djia_data['Open'], p(djia_data['Open']))
plt.show()

image20.png

可以看到,背景中的直线紧密跟随散点的趋势,说明开盘与收盘价格之间具有很强的线性关系。开盘价上升时,收盘价通常也以近似线性的速度上升。

设置图表标题与坐标轴标签

图表标题与坐标轴标签有助于读者理解所见数据。Matplotlib 提供 plt.title()、plt.xlabel() 和 plt.ylabel() 来注释图表。下面是在之前的散点图中加入这三者的示例:

plt.scatter(djia_data['Open'], djia_data['Close'])
plt.title('DJIA 2022: Open vs. Close Price')
plt.xlabel('Open Price ($)')
plt.ylabel('Close Price ($)')
plt.show()

image8.png

更改颜色

配色影响可读性与重点突出。在 Matplotlib 中,可通过三种方式指定颜色:

  • 命名颜色:"red"、"blue"、"steelblue"

  • 十六进制色值:"#f4db9a"、"#383c4a"

  • RGB 元组:(0.49, 0.39, 0.15)、(0.12, 0.21, 0.47)

更改折线颜色

在折线图中,可在 plt.plot() 中使用 color 参数修改颜色。下面将开盘价折线改为“black”,收盘价折线改为“red”。

plt.plot(djia_data['Date'], djia_data['Open'], color = 'black')
plt.plot(djia_data['Date'], djia_data['Close'], color = 'red')
plt.show()

image3.png

更改柱形颜色

对于柱状图,可以向 color 参数传入一个列表来指定每个柱的颜色。假设我们想突出 1 月的平均价格,以强调其平均收盘价较强的观点,就可以为该柱赋予唯一的颜色以吸引注意力。

plt.bar(djia_monthly_mean_srtd['Month'], height = djia_monthly_mean_srtd['Close'], color = ['blue', 'gray', 'gray', 'gray', 'gray', 'gray'])
plt.show()

image11.png

更改散点颜色

最后,在散点图中,可通过 plt.scatter() 的 color 参数设置点的颜色。我们将 1 月的所有点设为蓝色,其余月份设为灰色,讲述与上图相似的故事。

plt.scatter(djia_data[djia_data['Month'] == 'January']['Open'], djia_data[djia_data['Month'] == 'January']['Close'], color = 'blue')

plt.scatter(djia_data[djia_data['Month'] != 'January']['Open'], djia_data[djia_data['Month'] != 'January']['Close'], color = 'gray')

plt.show()

image18.png
使用颜色映射

颜色映射是 Matplotlib 内置的颜色刻度,可将数值映射到颜色渐变(官方文档)。想进一步了解,请参阅我们的Matplotlib 颜色映射教程。颜色映射通常在审美上更协调,并有助于讲述“数值递增”的视觉故事。

在下例中,我们将收盘价(y 变量)传给 c 参数,并通过 cmap 使用 plasma 颜色映射。可以看到,数值越大,颜色越亮、越偏黄;数值较低时则呈现更深的紫色。

plt.scatter(djia_data['Open'], djia_data['Close'], c=djia_data['Close'], cmap = plt.cm.plasma)

plt.show()

 image6.png

设置坐标轴范围

有时我们希望只观察图中的某个数值区间。例如,如果 DJIA 当前在 30,000 美元附近交易,我们或许只关心该价格附近的表现。可以向 plt.xlim() 与 plt.ylim() 传入元组,分别设置 x 与 y 的范围。元组的第一个值为下限,第二个值为上限。

plt.scatter(djia_data['Open'], djia_data['Close'])
plt.xlim((29000, 34000))
plt.ylim((29000, 34000))
plt.title('DJIA Open vs Close (Zoomed In)')
plt.xlabel('Open Price ($)')
plt.ylabel('Close Price ($)')
plt.show()

image15.png

保存图表

当您对图表满意后,可以将其保存为文件。Matplotlib 通过 plt.savefig() 支持 PNG、PDF、SVG 等格式,格式由文件扩展名推断。

最后,我们可以使用 plt.savefig() 保存在 matplotlib 中创建的图表。支持多种文件格式,包括“png”“pdf”“svg”。第一个参数是文件名,格式由扩展名推断(也可用 format 参数覆盖)。

plt.scatter(djia_data['Open'], djia_data['Close'])
plt.savefig('DJIA 2022 Scatterplot Open vs. Close.png')

总结

本教程介绍了折线图、柱状图与散点图——最常用的三类图表。与 Seaborn 或 Plotly 等更高级的库相比,Matplotlib 的代码更为繁琐,但这种“啰嗦”换来了对图像中每个元素的像素级控制。

接下来,建议继续学习直方图、饼图以及颜色映射。若想系统深入,Introduction to Data Visualization with Matplotlib 课程将在 4 小时内带您掌握子图、样式与分享图形等主题。

Matplotlib 常见问答

What is Matplotlib in Python?

Matplotlib 是 Python 中广受欢迎的可视化库,常用于创建静态、交互式和动画图表。使用 Matplotlib,您只需几行代码就能生成折线图、直方图、柱状图、散点图等。

Why should I use Matplotlib for data visualization?

有几个原因。首先,Matplotlib 十分灵活,支持多种图形类型,并且能很好地与 NumPy、pandas 等众多 Python 库集成。其次,它成熟且应用广泛,拥有强大的社区与丰富的教程资源。最后,由于它基于 Python,您可以将绘图自动化并在数据流水线中高度自定义。

How do I install Matplotlib?

您可以使用 Python 的包管理器 pip 安装 Matplotlib。打开终端并输入:pip install matplotlib。如果您在使用 Jupyter 笔记本,可以在代码单元前加感叹号直接运行:!pip install matplotlib。

How do I create a basic plot in Matplotlib?

下面是一个简单示例。首先需要导入 Matplotlib 库。最常用的模块是 pyplot,通常以别名 plt 导入:

import matplotlib.pyplot as plt

然后可以这样创建一个基础折线图:

plt.plot([1, 2, 3, 4]) plt.ylabel('Some Numbers') plt.show()

在此示例中,plt.plot([1, 2, 3, 4]) 用于绘制给定的数字列表。plt.ylabel('Some Numbers') 设置 y 轴标签,plt.show() 用于显示图表。

作者

Kevin Babitz

数据科学作者|Wayfair 高级技术营销分析师|宾夕法尼亚大学数据科学硕士(MSE)

主题