在本教程中,我将演示如何使用股票市场数据在 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。
完成本教程后,您将会掌握如何创建如下所示的折线图、柱状图与散点图,并了解自定义的基础操作:选择颜色、添加标签与标题、设置坐标轴范围及将图像保存为文件。
开始使用 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( ) 技术支持
可以看到数据包含 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( ) 技术支持
可以看到全年走势中,指数在年初处于高位,随后全年上下波动。大约在 10 月达到年内低点,随后在年底出现强劲回升。
多折线图
要在同一张图中展示多条折线,只需在 plt.show() 之前再调用一次 plt.plot()。
plt. plot( djia_data[ 'Date' ] , djia_data[ 'Open' ] )
plt. plot( djia_data[ 'Date' ] , djia_data[ 'Close' ] )
plt. show( ) 技术支持
全年来看,每个交易日的开盘价与收盘价彼此接近,并无明确的长期“谁总在谁之上”的规律。
添加图例
若要区分每条折线代表的含义,可以添加图例,这会在图的角落生成颜色对应的标签。使用 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( ) 技术支持
现在在右上角的默认位置看到了带有指定标签的图例(也可通过 plt.legend() 的 loc 参数指定位置)。
用 Matplotlib 绘制柱状图
柱状图非常适合比较不同类别的数值,尤其便于找出最高与最低的类别。
本节中,我们使用 pandas 的 .groupby() 将数据聚合为每月平均值,以比较 DJIA 的月度表现。若想深入了解分组操作,请参阅Pandas GroupBy 教程。
from calendar import month_name
djia_data[ 'Month' ] = pd. Categorical( djia_data[ 'Date' ] . dt. month_name( ) , month_name[ 1 : ] )
djia_monthly_mean = djia_data \
. groupby( 'Month' ) \
. mean( numeric_only= True ) \
. reset_index( )
djia_monthly_mean. head( 6 ) 技术支持
垂直柱状图
我们先创建一个竖向柱状图。使用 plt.bar() 方法,第一个参数为 x 轴变量(Month),height 参数为 y 轴变量(Close)。然后调用 plt.show() 显示图表。
plt. bar( djia_monthly_mean[ 'Month' ] , height = djia_monthly_mean[ 'Close' ] )
plt. show( ) 技术支持
可以看到,大多数月份的 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( ) 技术支持
这样更易于看出哪些月份平均收盘价最高、哪些最低,也便于跨月份比较与排序。
水平柱状图
有时将柱状图改为横向更易阅读标签。可以使用 plt.barh() 方法实现。
plt. barh( djia_monthly_mean_srtd[ 'Month' ] , width = djia_monthly_mean_srtd[ 'Close' ] )
plt. show( ) 技术支持
可以看到,各类别(月份)的标签比竖向时更易阅读,同时仍然便于跨组比较。类别很多时,横向柱状图尤其实用。
用 Matplotlib 绘制散点图
散点图展示两个数值变量之间的关系。每个点代表一条观测,整体形态揭示线性、非线性或无关关系,从而直接影响建模方法的选择。
创建基础散点图
与其他图表类似,散点图可用 pyplot.scatter() 创建,第一个参数是 x 轴变量,第二个参数是 y 轴变量。本例考察 DJIA 的开盘价与收盘价之间的关系。
plt. scatter( djia_data[ 'Open' ] , djia_data[ 'Close' ] )
plt. show( ) 技术支持
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( ) 技术支持
可以看到,背景中的直线紧密跟随散点的趋势,说明开盘与收盘价格之间具有很强的线性关系。开盘价上升时,收盘价通常也以近似线性的速度上升。
设置图表标题与坐标轴标签
图表标题与坐标轴标签有助于读者理解所见数据。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( ) 技术支持
更改颜色
配色影响可读性与重点突出。在 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( ) 技术支持
更改柱形颜色
对于柱状图,可以向 color 参数传入一个列表来指定每个柱的颜色。假设我们想突出 1 月的平均价格,以强调其平均收盘价较强的观点,就可以为该柱赋予唯一的颜色以吸引注意力。
plt. bar( djia_monthly_mean_srtd[ 'Month' ] , height = djia_monthly_mean_srtd[ 'Close' ] , color = [ 'blue' , 'gray' , 'gray' , 'gray' , 'gray' , 'gray' ] )
plt. show( ) 技术支持
更改散点颜色
最后,在散点图中,可通过 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( ) 技术支持
使用颜色映射
颜色映射是 Matplotlib 内置的颜色刻度,可将数值映射到颜色渐变(官方文档 )。想进一步了解,请参阅我们的Matplotlib 颜色映射 教程。颜色映射通常在审美上更协调,并有助于讲述“数值递增”的视觉故事。
在下例中,我们将收盘价(y 变量)传给 c 参数,并通过 cmap 使用 plasma 颜色映射。可以看到,数值越大,颜色越亮、越偏黄;数值较低时则呈现更深的紫色。
plt. scatter( djia_data[ 'Open' ] , djia_data[ 'Close' ] , c= djia_data[ 'Close' ] , cmap = plt. cm. plasma)
plt. show( ) 技术支持
设置坐标轴范围
有时我们希望只观察图中的某个数值区间。例如,如果 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( ) 技术支持
保存图表
当您对图表满意后,可以将其保存为文件。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 中创建折线图、柱状图和散点图。教程假设您对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。
完成本教程后,您将会掌握如何创建如下所示的折线图、柱状图与散点图,并了解自定义的基础操作:选择颜色、添加标签与标题、设置坐标轴范围及将图像保存为文件。
开始使用 Matplotlib
话不多说,让我们加载 Matplotlib,并快速查看本教程使用的数据集。
加载 Matplotlib
在创建任何图表前,您需要导入该库。
pyplot子模块提供了本教程中使用的所有绘图函数。约定俗成地将
pyplot起别名为plt。我还会导入 pandas、NumPy 和datetime,后续章节会用到。加载道琼斯工业平均指数(DJIA)数据集
Matplotlib 旨在与 NumPy 数组和 pandas 数据帧协同工作。该库可轻松从表格数据生成图形。本教程使用 2022-01-01 至 2022-12-31 的道琼斯工业平均指数(DJIA)历史价格(来源)。您可以在页面上设置日期范围,然后点击“download a spreadsheet”按钮下载。
我们将使用
pandas加载名为 HistoricalPrices.csv 的 CSV 文件,并通过.head()方法查看前几行。可以看到数据包含 4 列:Date、Open、High、Low 和 Close。后四列与指数在交易日内的价格相关。下面是每个变量的简要说明。
作为一个快速清洗步骤,我们需要使用 pandas 的 rename() 方法,因为下载的数据集中列名前多了一个空格。
我们还将 Date 列转换为
datetime类型,并按日期升序排序。关于数据类型转换的更多内容,请参阅Python 数据类型转换教程。用 Matplotlib 绘制折线图
折线图展示数值在连续维度(最常见的是时间)上的变化。对于时间序列数据,它是首选图表,因为连线能一眼揭示趋势、季节性与异常。
单折线图
我们可以使用
plt.plot()方法创建折线图,第一个参数是 x 变量,第二个参数是 y 变量。每次创建图表后,都要确保调用plt.show()才能看到生成的图形。下面我们可视化 DJIA 的收盘价随时间的变化。可以看到全年走势中,指数在年初处于高位,随后全年上下波动。大约在 10 月达到年内低点,随后在年底出现强劲回升。
多折线图
要在同一张图中展示多条折线,只需在
plt.show()之前再调用一次plt.plot()。全年来看,每个交易日的开盘价与收盘价彼此接近,并无明确的长期“谁总在谁之上”的规律。
添加图例
若要区分每条折线代表的含义,可以添加图例,这会在图的角落生成颜色对应的标签。使用
plt.legend(),并在每次plt.plot()调用中添加 label 参数即可。现在在右上角的默认位置看到了带有指定标签的图例(也可通过
plt.legend()的loc参数指定位置)。用 Matplotlib 绘制柱状图
柱状图非常适合比较不同类别的数值,尤其便于找出最高与最低的类别。
本节中,我们使用 pandas 的 .groupby() 将数据聚合为每月平均值,以比较 DJIA 的月度表现。若想深入了解分组操作,请参阅Pandas GroupBy 教程。
垂直柱状图
我们先创建一个竖向柱状图。使用
plt.bar()方法,第一个参数为 x 轴变量(Month),height参数为 y 轴变量(Close)。然后调用plt.show()显示图表。可以看到,大多数月份的 DJIA 平均收盘价接近;6 月最低,1 月最高。
柱状图重新排序
如果希望按月度平均收盘价从高到低显示这些柱,可以使用 pandas 的 sort_values() 对数据排序,再用相同的
plt.bar()方法绘图。这样更易于看出哪些月份平均收盘价最高、哪些最低,也便于跨月份比较与排序。
水平柱状图
有时将柱状图改为横向更易阅读标签。可以使用
plt.barh()方法实现。可以看到,各类别(月份)的标签比竖向时更易阅读,同时仍然便于跨组比较。类别很多时,横向柱状图尤其实用。
用 Matplotlib 绘制散点图
散点图展示两个数值变量之间的关系。每个点代表一条观测,整体形态揭示线性、非线性或无关关系,从而直接影响建模方法的选择。
创建基础散点图
与其他图表类似,散点图可用
pyplot.scatter()创建,第一个参数是 x 轴变量,第二个参数是 y 轴变量。本例考察 DJIA 的开盘价与收盘价之间的关系。x 轴为开盘价,y 轴为收盘价。正如预期,开盘价越高,收盘价也越高,二者呈现明显的正相关关系。
添加趋势线
接下来,为图形添加趋势线,以更明确地展示开盘与收盘变量之间的线性关系。我们将使用 numpy 的
polyfit()与poly1d()。前者执行最小二乘多项式拟合:第一个参数是 x 变量,第二个是 y 变量,第三个是拟合阶数(1 表示线性);后者基于系数生成一维多项式类,随后用 plt.plot() 画出趋势线。可以看到,背景中的直线紧密跟随散点的趋势,说明开盘与收盘价格之间具有很强的线性关系。开盘价上升时,收盘价通常也以近似线性的速度上升。
设置图表标题与坐标轴标签
图表标题与坐标轴标签有助于读者理解所见数据。Matplotlib 提供
plt.title()、plt.xlabel()和plt.ylabel()来注释图表。下面是在之前的散点图中加入这三者的示例:更改颜色
配色影响可读性与重点突出。在 Matplotlib 中,可通过三种方式指定颜色:
命名颜色:
"red"、"blue"、"steelblue"十六进制色值:
"#f4db9a"、"#383c4a"RGB 元组:
(0.49, 0.39, 0.15)、(0.12, 0.21, 0.47)更改折线颜色
在折线图中,可在 plt.plot() 中使用 color 参数修改颜色。下面将开盘价折线改为“black”,收盘价折线改为“red”。
更改柱形颜色
对于柱状图,可以向 color 参数传入一个列表来指定每个柱的颜色。假设我们想突出 1 月的平均价格,以强调其平均收盘价较强的观点,就可以为该柱赋予唯一的颜色以吸引注意力。
更改散点颜色
最后,在散点图中,可通过
plt.scatter()的 color 参数设置点的颜色。我们将 1 月的所有点设为蓝色,其余月份设为灰色,讲述与上图相似的故事。使用颜色映射
颜色映射是 Matplotlib 内置的颜色刻度,可将数值映射到颜色渐变(官方文档)。想进一步了解,请参阅我们的Matplotlib 颜色映射教程。颜色映射通常在审美上更协调,并有助于讲述“数值递增”的视觉故事。
在下例中,我们将收盘价(y 变量)传给
c参数,并通过cmap使用 plasma 颜色映射。可以看到,数值越大,颜色越亮、越偏黄;数值较低时则呈现更深的紫色。设置坐标轴范围
有时我们希望只观察图中的某个数值区间。例如,如果 DJIA 当前在 30,000 美元附近交易,我们或许只关心该价格附近的表现。可以向
plt.xlim()与plt.ylim()传入元组,分别设置 x 与 y 的范围。元组的第一个值为下限,第二个值为上限。保存图表
当您对图表满意后,可以将其保存为文件。Matplotlib 通过
plt.savefig()支持 PNG、PDF、SVG 等格式,格式由文件扩展名推断。最后,我们可以使用
plt.savefig()保存在 matplotlib 中创建的图表。支持多种文件格式,包括“png”“pdf”“svg”。第一个参数是文件名,格式由扩展名推断(也可用format参数覆盖)。总结
本教程介绍了折线图、柱状图与散点图——最常用的三类图表。与 Seaborn 或 Plotly 等更高级的库相比,Matplotlib 的代码更为繁琐,但这种“啰嗦”换来了对图像中每个元素的像素级控制。
接下来,建议继续学习直方图、饼图以及颜色映射。若想系统深入,Introduction to Data Visualization with Matplotlib 课程将在 4 小时内带您掌握子图、样式与分享图形等主题。