Matplotlib绘图入门
内容来自:
https://www.zhihu.com/column/c_1675971714134269952
Matplotlib绘图指南-1-初识matplotlib
什么是 Matplotlib?
Matplotlib 是一个绘图库,可以用于绘制各种统计图表和图形。它提供了丰富的工具和选项,以便你可以根据需要定制图表。
安装 Matplotlib
在开始使用 Matplotlib 之前,你需要安装它。可以通过以下命令来安装:
pip install matplotlib
导入 Matplotlib
安装完成后,你可以通过以下方式在 Python 脚本或 Jupyter Notebook 中导入 Matplotlib:
import matplotlib.pyplot as plt
让图片显示中文
# 如果浏览器不显示图片,就要加上这句话
%matplotlib inline
# 让图片显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 让图片可以显示符号
plt.rcParams['axes.unicode_minus'] = False
# 查看自己电脑上的字体库
from matplotlib.font_manager import FontManager
fm = FontManager()
my_fonts = set(f.name for f in fm.ttflist)
my_fonts
创建折线图
线图通常用于显示随时间或其他连续变量的变化。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.plot(x, y)
plt.xlabel('X Axis') #设置X轴标签
plt.ylabel('Y Axis') # 设置y轴标签
plt.title('Simple Line Plot') # 设置图标题
plt.show()

创建散点图
散点图通常用于显示两个变量之间的关系。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.scatter(x, y)
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Simple Scatter Plot')
plt.show()

创建柱状图
柱状图适用于比较不同类别的值。
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C']
values = [50, 30, 70]
plt.bar(categories, values)
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Simple Bar Chart')
plt.show()

绘制直方图
pyplot 中的 hist() 方法来绘制直方图。
hist() 方法是 Matplotlib 库中的 pyplot 子库中的一种用于绘制直方图的函数。
hist() 方法可以用于可视化数据的分布情况,例如观察数据的中心趋势、偏态和异常值等。
import matplotlib.pyplot as plt
import numpy as np
# 生成一组随机数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, color='skyblue', alpha=0.8)
# 设置图表属性
plt.title(' hist() demo')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 显示图表
plt.show()

自定义图表
Matplotlib 允许你通过更改颜色、线型、标签等来自定义图表的外观。
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.plot(x, y, color='red', linestyle='dashed', marker='o')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Customized Line Plot')
plt.legend(['Line 1'])
plt.show()

x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
# color设置颜色,linestyle线的样式
# color可以缩写成c,linestyle可以缩写成ls
# 但是初学者我建议写全程,避免混淆或忘记含义
plt.plot(x, y,color='red',linestyle='-.')
plt.xlabel('X Axis') #设置X轴标签
plt.ylabel('Y Axis') # 设置y轴标签
plt.title('Simple Line Plot') # 设置图标题
plt.show()

# 配置画布
# figsize:画布大小,宽高
# dpi:分辨率
# facecolor:背景颜色
# 创建一个图形,设置其大小为5x3英寸,分辨率为300 dpi,并将背景颜色设置为红色
plt.figure(figsize=(5,3), dpi=300, facecolor='red')
# 定义x和y的数据
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
# 使用plot函数绘制线图
plt.plot(x, y)
# 显示图形
plt.show()

Matplotlib绘图指南-2-快速入门
import matplotlib as mpl 和 import matplotlib.pyplot as plt 这两条语句看起来很相似,但它们实际上涉及了 Matplotlib 库的不同部分。
import matplotlib as mpl
这条语句导入了整个 Matplotlib 库,并将其命名为 mpl。Matplotlib 是一个相当庞大的库,包括许多不同的模块和功能。导入整个库通常用于访问一些全局设置和配置,例如更改全局字体、颜色方案等。
例如,你可以通过以下方式更改全局字体大小:
import matplotlib as mpl
mpl.rcParams['font.size'] = 12
import matplotlib.pyplot as plt
这条语句导入了 Matplotlib 的 pyplot 模块,并将其命名为 plt。pyplot 是 Matplotlib 的一个子模块,提供了许多用于创建和定制图表的函数和方法。
大多数常见的绘图任务(例如绘制线图、散点图、柱状图等)都可以通过 plt 来完成。下面是一个使用 plt 绘制线图的示例:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.plot(x, y)
plt.show()
- 区别与联系
- 区别:
mpl是整个 Matplotlib 库的引用,可以用于访问全局设置和配置。plt是 Matplotlib 库中pyplot子模块的引用,专门用于绘图和图表定制。
- 联系:
plt实际上是mpl的一部分,是整个库的子模块。- 通常,你会将
plt与mpl一起使用,以便在创建图表的同时更改全局设置。
总的来说,mpl 用于访问库的全局特性和设置,而 plt 用于执行具体的绘图任务。在大多数情况下,你将主要使用 plt,但在需要更改全局设置时,你可能还需要使用 mpl。
快速开始
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.show()

fig, ax = plt.subplots()
这一行创建了一个新的 Figure 和一个新的 Axes(子图)。plt.subplots() 函数返回两个对象:
fig:整个图形,包括所有的子图、标题等。ax:单个的子图(或绘图区域),你可以在其中绘制线条、散点图等。
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
这一行在上述创建的 Axes(ax)上绘制了一条线。ax.plot() 函数接受两个列表作为参数:
- 第一个列表
[1, 2, 3, 4]是 x 轴的坐标。 - 第二个列表
[1, 4, 2, 3]是 y 轴的坐标。
这些坐标定义了线条的路径,即从点 (1, 1) 到点 (2, 4),再到点 (3, 2),最后到点 (4, 3)。
plt.show()
这一行负责显示整个图形。当你在脚本中使用 Matplotlib 时,通常需要调用 plt.show() 来打开一个窗口并显示图形。如果你在 Jupyter Notebook 中工作,则可能不需要此行,因为图表通常会自动显示。
- 总结
整个代码段的工作流程是:
- 创建一个包含单个子图的图形。
- 在子图上绘制一条线。
- 显示图形。
图形(Figure)的各个组成部分

Figure
Figure是整个图表的顶级容器。你可以将其视为一个画布,用于承载所有其他绘图元素。
- "Figure" 跟踪其下的所有 "Axes"(子图)。一个 "Figure" 可以包含一个或多个 "Axes",每个 "Axes" 代表一个独立的绘图区域,用于绘制具体的图形,例如线图、柱状图等。
- "Figure" 还跟踪一组特殊的 "Artists"。在 Matplotlib 中,"Artists" 是所有可见元素的基类,包括线条、文本、标签等。这里提到的 "special Artists" 可能包括整个图表的标题、图例、色标等。
- "Figure" 甚至可以包含嵌套的子图形(subfigures)。这意味着你可以在一个 "Figure" 内部创建另一个独立的 "Figure",以组织更复杂的图表布局。
创建 Figure 的方式:可以使用 plt.figure() 创建一个空的 Figure,或使用 plt.subplots() 创建一个带有一个或多个 Axes 的 Figure。
创建一个空图形
fig = plt.figure()
这一行创建了一个空的 Figure 对象,没有任何子图(Axes)。通常,在添加子图之前,你不会看到任何内容。
创建一个带有单个子图的图形
fig, ax = plt.subplots()
这一行创建了一个新的 Figure,并在其中添加了一个 Axes(子图)。plt.subplots() 函数返回 Figure 对象和 Axes 对象,你可以在这个 Axes 上绘制图形。
创建一个 2x2 网格的图形
fig, axs = plt.subplots(2, 2)
这一行创建了一个新的 Figure,并在其中添加了 2x2 网格的子图。axs 是一个 2x2 的数组,包含 4 个独立的 Axes,你可以在每个 Axes 上分别绘图。
使用子图马赛克创建自定义布局
fig, axs = plt.subplot_mosaic([['left', 'right_top'],
['left', 'right_bottom']])
这一行使用 plt.subplot_mosaic() 创建了一个新的 Figure,并定义了一个自定义的子图布局。这个布局包括一个左侧的子图,占据两行,以及右侧的两个子图。你可以通过提供一个字符串列表来描述这个布局。
Axes
Axes 是附加到 Figure 上的对象,包含用于绘图的特定区域。简而言之,它是你在其中绘制图形的地方。
包含的组件
- Axis 对象:每个 Axes 通常包括两个(在 2D 图中)或三个(在 3D 图中)Axis 对象。请注意 "Axes" 和 "Axis" 的区别,前者是绘图区域,后者是坐标轴本身。
- 刻度和刻度标签:Axis 对象提供刻度(轴上的标记)和刻度标签(标记刻度的字符串),为 Axes 中的数据提供比例尺。
- 标题和标签:每个 Axes 还有一个标题(通过
set_title()设置)、一个 x 轴标签(通过set_xlabel()设置)和一个 y 轴标签(通过set_ylabel()设置)。
使用 Axes
- 面向对象编程接口:Axes 类及其成员函数是使用 Matplotlib 的面向对象编程接口的主要入口点。虽然 Matplotlib 还提供了功能接口,但面向对象接口允许更精细的控制和定制。
- 绘图方法:Axes 上定义了大多数绘图方法,例如
ax.plot()用于绘制线图。
Axis
- Axes 与 Axis 的区别:Axes 指的是绘图区域,而 Axis 指的是坐标轴本身。
- 设置标题和标签:可以使用特定的方法设置 Axes 的标题、x 轴标签和 y 轴标签。
Matplotlib绘图指南-3-属性设置(1)
# 导入本章节要使用的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
常用属性介绍

| Attribute | 描述 | Function/Method |
|---|---|---|
| xlabel | x轴的标签 | set_xlabel() |
| ylabel | y轴的标签 | set_ylabel() |
| title | 图的标题 | set_title() |
| xlim | x轴的范围 | set_xlim() |
| ylim | y轴的范围 | set_ylim() |
| xticks | x轴的刻度位置 | set_xticks() |
| yticks | y轴的刻度位置 | set_yticks() |
| xticklabels | x轴的刻度标签 | set_xticklabels() |
| yticklabels | y轴的刻度标签 | set_yticklabels() |
| grid | 显示或隐藏网格线 | grid() |
| legend | 显示或隐藏图例 | legend() |
| color | 线或标记的颜色 | color 参数 in plot() |
| linestyle | 线的样式(如实线、虚线等) | linestyle 参数 in plot() |
| linewidth | 线的宽度 | linewidth 参数 in plot() |
| marker | 数据点的标记样式(如圆圈、星形等) | marker 参数 in plot() |
| markersize | 数据点标记的大小 | markersize 参数 in plot() |
| alpha | 图形元素的透明度 | alpha 参数 in plot() |
图例legend
在matplotlib中,legend方法用于在图上添加图例。
legend和label一起用!
基本参数
- loc:定义图例的位置。例如,
'upper left','lower right'等。默认为'best',即matplotlib会自动选择最佳的位置。
| 位置字符串 | 数值代码 |
|---|---|
| 'best' | 0 |
| 'upper right' | 1 |
| 'upper left' | 2 |
| 'lower left' | 3 |
| 'lower right' | 4 |
| 'right' | 5 |
| 'center left' | 6 |
| 'center right' | 7 |
| 'lower center' | 8 |
| 'upper center' | 9 |
| 'center' | 10 |
以下两种方法是等效的:
ax.legend(loc='upper right')
ax.legend(loc=1)
- frameon:布尔值,表示是否在图例周围画一个框。默认为
True。 - title:图例的标题。
- fontsize:图例的字体大小。
- labels:用于在图例中显示的标签列表。
示例
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建图形和坐标轴
fig, ax = plt.subplots()
# 使用不同的颜色、线型、标记和标签绘制两条线
ax.plot(x, y1, 'b-', label='sin(x)')
ax.plot(x, y2, 'r--', label='cos(x)')
# 添加图例
ax.legend(loc='upper right',
frameon=True,
title='Functions'
)
plt.show()

在上述代码中,为两条线(sin(x)和cos(x))创建了图例,并指定了它们的标签和样式。
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, 'b-')
ax.plot(x, y2, 'r--')
# 添加图例
ax.legend(labels=['sin(x)','cos(x)'],
loc='lower left',
frameon=True,
title='Functions'
)
plt.show()

更多高级参数和用法
- ncol:图例中的列数。
- shadow:布尔值,表示图例是否具有阴影。
- borderpad:图例边框的内边距。
- labelspacing:图例中的标签之间的垂直间距。
- handlelength:图例句柄的长度(例如线)。
- handletextpad:图例句柄和文本之间的间距。
- borderaxespad:图例和坐标轴之间的间距。
- bbox_to_anchor:微调图例的位置。
这只是legend方法的一部分参数。为了完整地了解它的功能,建议查看官方文档。
ncol
ncol 是 legend 函数中的一个参数,它表示图例中的列数。
默认情况下,ncol 的值为1,这意味着图例中的所有条目都会垂直排列在一列中。
但是,当图例中有许多条目时,使用多列可以更有效地利用空间并提供更清晰的视觉布局。
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig, ax = plt.subplots(figsize=(8,6))
# 绘制5条线,并为每条线指定标签
for i in range(5):
ax.plot(x, y + i, label=f'Line {i + 1}')
# 设置图例的位置,并将其分成2列
ax.legend(loc='lower left', ncol=2)
plt.show()

在上面的例子中,我们使用了 ncol=2,这使得图例中的5个条目分成了2列。第一列有3个条目,第二列有2个。
bbox_to_anchor
bbox_to_anchor 参数在 matplotlib 中用于微调图例的位置。它通常与 loc 参数一起使用,允许将图例放在图中的任何特定位置。bbox_to_anchor 定义了图例框左上角的位置。
- 参数格式:
bbox_to_anchor可以是一个二元组(x, y),其中x和y是图例框左上角的坐标。
- 使用方法:
- 默认坐标系:如果没有任何其他的坐标系参数(如
bbox_transform)被指定,那么这些坐标将相对于loc参数所定义的位置。例如,loc='upper right'与bbox_to_anchor=(1, 1)是相同的。
- 轴坐标系:如果您想要在轴的特定位置放置图例,可以使用轴的坐标系统。在这个坐标系统中,
(0, 0)是轴的左下角,(1, 1)是右上角。
- 图坐标系:如果您想要在整个图的特定位置放置图例,可以使用图的坐标系统。在这个坐标系统中,
(0, 0)是图的左下角,(1, 1)是右上角。
bbox_to_anchor参数也可以接受一个四元组(或者说是一个包含四个值的列表)来定义一个矩形框,即 ([x, y, width, height])。
在这种情况下:
- ( x, y ):定义了矩形左下角的坐标。
- ( width, height ):定义了矩形的宽度和高度。
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, 'b-', label='sin(x)')
ax.plot(x, y2, 'r--', label='cos(x)')
# 设置图例的位置。loc定义基准位置,bbox_to_anchor进行微调。
ax.legend(loc='upper left', bbox_to_anchor=(1, 1))
plt.show()

在上面的例子中,我们设置 loc='upper left' 作为基准,然后使用 bbox_to_anchor 进行微调,使得图例完全在图的右侧。
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, 'b-', label='sin(x)')
ax.plot(x, y2, 'r--', label='cos(x)')
# 设置图例的位置。这里我们定义了一个矩形框,然后使用loc确定图例在这个框中的位置。
ax.legend(loc='upper left', bbox_to_anchor=(1, 1, 0.3, 0.3))
plt.show()

在上面的例子中,我们定义了一个矩形框,它从坐标系的 ((1, 1)) 开始,宽度为 0.3,高度为 0.3。接着,我们使用 loc='upper left' 确定图例在这个矩形框的左上角。
线条属性
- color颜色
- linestyle样式
- linewidth宽度
- alpha透明度
- marker标记
- mfc:marker face color 标记的背景颜色
color (颜色)
用于指定线条的颜色。可以接受多种颜色格式,例如:
- 字符串名称,如
'red'、'green'。 - RGB元组,如
(0.5, 0.2, 0.8)。 - 十六进制颜色代码,如
'#FF5733'。
linestyle (样式)
定义线条的样式。常见的选项有:
'-':实线'--':虚线'-.':点划线':':点线''或' ':无线条
linewidth (宽度)
指定线条的宽度,通常使用浮点数表示。例如,linewidth=2.5。
alpha (透明度)
指定线条的透明度,其值范围从0(完全透明)到1(完全不透明)。
marker (标记)
定义数据点的标记样式。常见的标记样式有:
'.':点标记'o':圆圈's':正方形'*':星形'+':加号'x':X标记
mfc (marker face color)
定义标记的填充颜色。其接受的颜色格式与 color 参数相同。
示例
x = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x, y,
color='red',
linestyle='--',
linewidth=2,
alpha=0.7,
marker='o',
mfc='yellow')
plt.show()

在上面的代码中,我们绘制了一条红色虚线,线宽为2,透明度为0.7,数据点使用黄色填充的圆圈标记。
坐标轴刻度xticks、yticks
xticks
这个函数主要用于获取或设置x轴的当前刻度位置和标签。
用法:
- 获取当前x轴的刻度位置和标签:
locs, labels = plt.xticks()
locs是一个列表,包含刻度的位置;labels是一个文本标签的列表。
- 设置x轴的刻度位置和标签:
plt.xticks(ticks, [labels], **kwargs)
ticks是刻度的位置的列表;[labels]是对应的标签列表(可选)。如果不提供标签,ticks的值将作为默认标签。
yticks
与 xticks 类似,但用于y轴。
用法:
- 获取当前y轴的刻度位置和标签:
locs, labels = plt.yticks()
- 设置y轴的刻度位置和标签:
plt.yticks(ticks, [labels], **kwargs)
示例
基本
x = np.linspace(0, 5, 100)
y = x ** 2
plt.plot(x, y)
# 设置x轴和y轴的刻度位置
plt.xticks(ticks=[0, 1, 2, 3, 4, 5], labels=['a', 'b', 'c', 'd', 'e', 'f'])
plt.yticks(ticks=[0, 5, 10, 15, 20, 25], labels=['A', 'B', 'C', 'D', 'E', 'F'])
plt.show()

使用不等间距的刻度
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置x轴的刻度位置和标签
plt.xticks(ticks=[0, 2, 4, 6, 8, 10, 12],
labels=['zero', 'two', 'four', 'six', 'eight', 'ten', 'twelve'],
fontsize=12
)
plt.yticks(fontsize=12)
plt.show()

使用旋转的刻度标签
categories = ['A very long category name', 'B', 'C', 'D', 'E']
values = [5, 7, 3, 8, 6]
plt.bar(categories, values)
# 设置y轴的刻度范围和标签,并旋转标签
plt.yticks(ticks=range(0, 11, 2), fontsize=10)
plt.xticks(rotation=45, ha='right') # 旋转x轴的刻度标签45度,并设置对齐方式为'right'
plt.tight_layout() # 自动调整布局,确保标签不会被裁剪
plt.show()

在上述例子中,我们使用了 xticks 的 rotation 和 ha 参数来旋转和对齐x轴的刻度标签。这在处理长标签时非常有用。
Matplotlib绘图指南-3-属性设置(2)
坐标轴范围xlim、ylim
xlim 和 ylim 在 matplotlib 中分别用于获取或设置x轴和y轴的范围。
xlim
这个函数主要用于获取或设置x轴的范围。
用法:
- 获取当前x轴的范围:
xmin, xmax = plt.xlim()
xmin和xmax分别是x轴的最小值和最大值。
- 设置x轴的范围:
plt.xlim(xmin, xmax)
或
plt.xlim([xmin, xmax])
ylim
与 xlim 类似,但用于y轴。
用法:
- 获取当前y轴的范围:
ymin, ymax = plt.ylim()
- 设置y轴的范围:
plt.ylim(ymin, ymax)
或
plt.ylim([ymin, ymax])
示例
(1)基本
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置x轴和y轴的范围
plt.xlim(2, 8)
plt.ylim(-1, 1)
plt.show()

在上面的例子中,我们设置x轴的范围从2到8,y轴的范围从-1到1,从而放大了图形中的一个特定区域。
(2)逆转坐标轴
有时,可能希望逆转坐标轴的方向。例如,可能希望在y轴上,较大的值显示在底部而较小的值显示在顶部。
x = np.linspace(0, 10, 100)
y = x**2
plt.plot(x, y)
# 逆转y轴的方向
plt.ylim(100, 0)
plt.show()

(3)同步两个子图的坐标轴范围
当在同一图中显示多个子图并对比它们时,通常需要确保它们的坐标轴范围是同步的。
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, axs = plt.subplots(2, 1)
axs[0].plot(x, y1, 'r')
axs[1].plot(x, y2, 'b')
# 设置两个子图的x轴范围相同
axs[0].set_xlim(2, 8)
axs[1].set_xlim(2, 8)
plt.show()

(4)动态调整坐标轴范围
有时,可能希望根据数据的特性动态地设置坐标轴的范围。
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(0, 0.2, 100) # 添加随机噪声
plt.plot(x, y, 'o')
# 动态设置y轴范围,使其略大于数据的最大值和最小值
plt.ylim(y.min() - 0.5, y.max() + 0.5)
plt.show()

在上面的示例中,我们首先创建了一个带有随机噪声的正弦曲线。然后,我们根据数据的最大值和最小值动态地设置y轴的范围,确保所有的数据点都能在图中显示,并且留有一些边距。
标题title
在 matplotlib 中,title 函数用于为图或子图添加标题。
title 函数的基本用法
语法
(label, fontdict=None, loc=None, pad=None, **kwargs)
参数
- label: 要显示的标题文本。
- fontdict: 字体属性的字典,例如大小、权重等。
- loc: 标题的位置,可以是
'left','center','right'。默认是'center'。 - pad: 标题与图/子图的距离,以磅为单位。默认是
rcParams["axes.titlepad"]。 - kwargs: 其他文本属性。
示例
(1)基本用法
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.title("A Simple Line Plot")
plt.show()

(2)设置字体属性
plt.plot(x, y)
plt.title("A Simple Line Plot with Bold Title", fontdict={'weight': 'bold', 'size': 15})
plt.show()

(3)设置标题位置
plt.plot(x, y)
plt.title("Title on the Left", loc='left')
plt.show()

(4)子图标题
使用 ax.set_title("Title"),为每个子图设置单独的标题,其中 ax 是一个 Axes 对象。
fig, axs = plt.subplots(2, 1)
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
axs[0].plot(x, y1)
axs[0].set_title("Plot 1")
axs[1].plot(x, y2)
axs[1].set_title("Plot 2")
plt.tight_layout()
plt.show()

网格grid
在数据可视化中,网格是一个非常有用的特性,它可以帮助我们更容易地对照和解读图中的数据点。在 matplotlib 中,可以使用 grid 函数来开启或关闭网格。
grid 函数的基本用法
语法
(b=None, which='major', axis='both', **kwargs)
参数
- b: 布尔值或
None,用于开启或关闭网格。如果未设置或为None,则切换网格状态。 - which: 可以是
'major'(默认值),'minor', 或'both'来确定应用网格的刻度。 - axis: 可以是
'both'(默认值),'x', 或'y',决定画在哪个轴上的网格。 - kwargs: 其他线条属性,如线条风格、宽度和颜色。
示例
(1)基本用法
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.grid(True) # 打开网格
plt.show()

(2)自定义网格样式
plt.plot(x, y)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.show()

(3)只在某个轴上显示网格
plt.plot(x, y)
plt.grid(axis='y', color='gray', linestyle=':')
plt.show()

(4)子图网格
当使用子图时,可以为每个子图单独设置网格样式。例如,使用 ax.grid(),其中 ax 是一个 Axes 对象。
fig, axs = plt.subplots(2, 1)
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
axs[0].plot(x, y1)
axs[0].grid(True, color='red', linestyle='--')
axs[1].plot(x, y2)
axs[1].grid(True, axis='y', color='blue', linestyle='-.')
plt.tight_layout()
plt.show()

标签xlabel、ylabel
在 matplotlib 中,xlabel 和 ylabel 分别用于为图形的 x 轴和 y 轴添加标签。这些标签有助于描述图上的数据和轴的含义,从而使图形更加清晰和易于理解。
xlabel
用于为 x 轴添加标签。
- 语法:
plt.xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)
- 参数:
- xlabel: 要显示的标签文本。
- fontdict: 字体属性的字典,例如大小、权重等。
- labelpad: 标签与轴之间的间距,以点为单位。
- kwargs: 其他文本属性。
ylabel
与 xlabel 类似,但用于 y 轴。
- 语法:
plt.ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)
- 参数 与
xlabel相同
示例
(1)基本用法
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.xlabel("X-axis Label")
plt.ylabel("Y-axis Label")
plt.show()

(2)自定义字体属性
plt.plot(x, y)
plt.xlabel("X-axis Label", fontdict={'weight': 'bold', 'size': 15})
plt.ylabel("Y-axis Label", fontdict={'color': 'red', 'size': 12})
plt.show()

(3)对于子图
当使用子图时,可以为每个子图单独设置轴标签。例如,使用 ax.set_xlabel("Label") 和 ax.set_ylabel("Label"),其中 ax 是一个 Axes 对象。
fig, axs = plt.subplots(2, 1)
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
axs[0].plot(x, y1)
axs[0].set_xlabel("X-axis for Plot 1")
axs[0].set_ylabel("Y-axis for Plot 1")
axs[1].plot(x, y2)
axs[1].set_xlabel("X-axis for Plot 2")
axs[1].set_ylabel("Y-axis for Plot 2")
plt.tight_layout()
plt.show()

Matplotlib绘图指南-4-多图布局
import matplotlib.pyplot as plt
import numpy as np
# 让图片显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 让图片可以显示符号
plt.rcParams['axes.unicode_minus'] = False
使用subplot函数
subplot函数允许在一张图纸上快速创建多个子图。
基本语法:plt.subplot(nrows, ncols, index)
nrows和ncols用于指定图纸将被分成多少行和列。index是子图的索引,从1开始,从左到右,从上到下。
fig = plt.figure(figsize=(8,6))
x = np.linspace(-np.pi, np.pi, 30)
y = np.sin(x)
# 子图1
ax1 = plt.subplot(221) #2行2列中的第1个图
ax1.plot(x,y)
ax1.set_title('子图1')
# 子图2
ax2 = plt.subplot(222) #2行2列中的第2个图
ax2.plot(x,y)
ax2.set_title('子图2')
# 子图3
ax3 = plt.subplot(2,2,3) #2行2列中的第3个图
ax3.plot(x,y)
ax3.set_title('子图3')
# 子图4
ax4 = plt.subplot(2,2,4) #2行2列中的第4个图
ax4.plot(x,y)
ax4.set_title('子图4')
# 调整子图之间的间距
plt.tight_layout()
plt.show()

fig = plt.figure(figsize=(8,6))
# 第一个子图
plt.subplot(2, 2, 1)
plt.plot([0,1,2], [0,1,2])
plt.title('Subplot 1')
# 第二个子图
plt.subplot(2, 2, 2)
plt.plot([0,1,2], [0,2,4])
plt.title('Subplot 2')
# 第三个子图
plt.subplot(2, 2, 3)
plt.plot([0,1,2], [0,3,6])
plt.title('Subplot 3')
# 第四个子图
plt.subplot(2, 2, 4)
plt.plot([0,1,2], [0,4,8])
plt.title('Subplot 4')
# 调整子图之间的间距
plt.tight_layout()
plt.show()

fig = plt.figure(figsize=(8,6))
x = np.linspace(-np.pi, np.pi, 30)
y = np.sin(x)
# 子图1
ax1 = plt.subplot(221) #2行2列中的第1个图
ax1.plot(x,y)
ax1.set_title('子图1')
# 子图2
ax2 = plt.subplot(222) #2行2列中的第2个图
ax2.plot(x,y)
ax2.set_title('子图2')
# 子图3
ax3 = plt.subplot(2,1,2) #2行1列中的第2行
ax3.plot(x,np.sin(x*x))
ax3.set_title('子图3')
# 调整子图之间的间距
plt.tight_layout()
plt.show()

x = np.linspace(0,2*np.pi)
# 3行3列
fig, ax = plt.subplots(3, 3)
ax1, ax2, ax3 = ax
ax11, ax12, ax13 = ax1
ax21, ax22, ax23 = ax2
ax31, ax32, ax33 = ax3
# fig设置画布大小
fig.set_figwidth(8)
fig.set_figheight(8)
# 第1行
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tan(x))
# 第2行
ax21.plot(x,np.sinh(x))
ax22.plot(x,np.cosh(x))
ax23.plot(x,np.tanh(x))
# 第3行
ax31.plot(x,np.sin(x)+np.cos(x))
ax32.plot(x,np.sin(x*x)+np.cos(x*x))
ax33.plot(x,np.tanh(x)+np.cosh(x))
# 调整子图之间的间距
plt.tight_layout()
plt.show()

使用gridspec函数
gridspec提供了更多的灵活性,允许创建不规则的子图布局。
基本用法涉及以下步骤:
- 创建一个
GridSpec对象。 - 使用这个
GridSpec对象为每个子图指定位置。
示例:创建一个布局,其中有一个大子图和两个小子图。大子图占据左侧,两个小子图垂直堆叠在右侧。
# 使用gridspec创建不规则的子图布局
fig = plt.figure(figsize=(8, 6))
# 创建一个GridSpec对象,定义为2x2的布局
gs = plt.GridSpec(2, 2, width_ratios=[2, 1], height_ratios=[1, 1])
# 创建大子图,占据左侧
ax1 = fig.add_subplot(gs[:, 0])
ax1.plot([0, 1, 2], [0, 1, 2])
ax1.set_title('Large subplot')
# 创建右上方的小子图
ax2 = fig.add_subplot(gs[0, 1])
ax2.plot([0, 1, 2], [0, 2, 4])
ax2.set_title('Top right subplot')
# 创建右下方的小子图
ax3 = fig.add_subplot(gs[1, 1])
ax3.plot([0, 1, 2], [0, 3, 6])
ax3.set_title('Bottom right subplot')
plt.tight_layout()
plt.show()

总结
- 使用
subplot,可以快速创建规则的多子图布局。 - 使用
gridspec,可以创建不规则或更复杂的子图布局。
Matplotlib绘图指南-5-图形嵌套
import matplotlib.pyplot as plt
import numpy as np
# 让图片显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 让图片可以显示符号
plt.rcParams['axes.unicode_minus'] = False
add_subplot函数
add_subplot是一个非常强大和常用的函数,它用于在matplotlib图形中添加子图。add_subplot不仅可以用于创建规则的子图布局,还可以用于图形嵌套,即在图形中添加更小的子图。
基本用法
基本语法为:add_subplot(nrows, ncols, index),其中:
nrows和ncols分别指定要将图形划分成的行数和列数。index指定子图的索引,从1开始,从左到右,从上到下。
例如,add_subplot(2, 2, 1) 将创建一个2x2的布局中的第一个子图。
图形嵌套
除了上述基本用法外,add_subplot还允许为图形添加嵌套的子图。这是通过传递一个4元素的列表来实现的,该列表定义了子图的位置和大小:[left, bottom, width, height]。
其中:
left和bottom是子图左下角的x和y坐标。width和height是子图的宽度和高度。
所有这些值都是相对于图形大小的比例,范围在0到1之间。
示例
让我们创建一个图形,其中有一个主子图和一个嵌套的子图。
# 创建一个图形
fig = plt.figure(figsize=(8, 6))
# 添加主子图
main_ax = fig.add_subplot(1, 1, 1)
main_ax.plot([0, 1, 2], [0, 1, 2], label="Main Plot")
main_ax.set_title('Main Subplot')
main_ax.legend()
# 添加嵌套的子图
# 子图的位置和大小是相对于图形大小的比例
# [left, bottom, width, height]
nested_ax = fig.add_subplot(4, 4, 16) # 这也等效于 fig.add_axes([0.7, 0.2, 0.2, 0.2])
nested_ax.plot([0, 1, 2], [0, 2, 4], 'r', label="Nested Plot")
nested_ax.set_title('Nested Subplot')
nested_ax.legend()
plt.show()

如上图所示:
- 主子图:占据了整个图形的大部分,显示了一个蓝色的线图。
- 嵌套的子图:位于图形的右下角,显示了一个红色的线图。
这是通过以下方式完成的:
- 使用
add_subplot(1, 1, 1)添加主子图。 - 使用
add_subplot(4, 4, 16)添加嵌套的子图。这等效于使用fig.add_axes([0.7, 0.2, 0.2, 0.2]),其中列表[0.7, 0.2, 0.2, 0.2]定义了子图的位置和大小。
使用 add_subplot 和 add_axes可以在图形中创建多个子图,并灵活地定义它们的位置和大小,这为创建复杂的图形布局提供了可能性。
fig = plt.figure(figsize=(8,6))
# 子图1
axes1 = fig.add_subplot(1,1,1,)
axes1.plot([0,1],[1,3])
# 子图2
axes2 = fig.add_subplot(2,2,1,facecolor='pink')
axes2.plot([1,3])
[<matplotlib.lines.Line2D at 0x1b8c7bfed60>]

add_axes函数
add_axes函数是matplotlib中的一个重要工具,用于在图形上添加子图。与subplot函数自动布局子图不同,add_axes允许用户手动定义子图的位置和大小。
基本语法
add_axes(rect, **kwargs)
其中:
rect是一个包含四个元素的列表:[left, bottom, width, height]。left和bottom是子图左下角的坐标。width和height是子图的宽度和高度。- 所有这些值都是相对于图形大小的比例,范围在0到1之间。
**kwargs是其他可选参数,例如projection(如果要创建3D坐标轴
- )。
示例
为了更好地理解,让我们创建一个图形,并使用add_axes在其中添加两个子图:一个大的主子图和一个嵌套的小子图。这将与我们之前使用axes函数创建的布局相似。
# 创建一个图形
fig = plt.figure(figsize=(8, 6))
# 使用add_axes函数添加一个大子图
# [left, bottom, width, height]
main_ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
main_ax.plot([0, 1, 2], [0, 1, 2], label="Main Plot")
main_ax.set_title('Main Subplot')
main_ax.legend()
# 使用add_axes函数添加一个嵌套的子图
nested_ax = fig.add_axes([0.6, 0.6, 0.25, 0.25])
nested_ax.plot([0, 1, 2], [0, 2, 4], 'r', label="Nested Plot")
nested_ax.set_title('Nested Subplot')
nested_ax.legend()
plt.show()

如上图所示,我们得到了两个子图:
- 主子图:这是一个大的子图,占据了图形的大部分区域。它是使用
fig.add_axes([0.1, 0.1, 0.8, 0.8])创建的,其中列表[0.1, 0.1, 0.8, 0.8]定义了子图的位置和大小。 - 嵌套的子图:这是一个小的子图,位于主子图的右上角。它是使用
fig.add_axes([0.6, 0.6, 0.25, 0.25])创建的。
总结
add_axes函数是matplotlib中用于手动定义子图位置和大小的工具。与subplot和gridspec
相比,这为您提供了更多的灵活性,但同时也需要更多的注意力来确保子图之间没有重叠。
可以使用add_axes来创建不规则或自定义的子图布局,或在图形上添加嵌套或叠加的子图。
axes函数
matplotlib的axes函数是用于在图形上添加子图的工具,它提供了一种手动定义子图位置和大小的方法。与add_subplot和add_axes相比,axes函数允许更直观地定义子图的位置。
基本语法
axes([left, bottom, width, height], **kwargs)
其中:
left和bottom是子图左下角的坐标。width和height是子图的宽度和高度。- 所有这些值都是相对于图形大小的比例,范围在0到1之间。
**kwargs是其他可选参数。
示例
创建一个图形,并使用axes函数在其中添加两个子图:一个大子图和一个小子图。
# 创建一个图形
fig = plt.figure(figsize=(8, 6))
# 使用axes函数添加一个大子图
# [left, bottom, width, height]
main_ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
main_ax.plot([0, 1, 2], [0, 1, 2], label="Main Plot")
main_ax.set_title('Main Subplot')
main_ax.legend()
# 使用axes函数添加一个小子图
nested_ax = fig.add_axes([0.6, 0.6, 0.25, 0.25])
nested_ax.plot([0, 1, 2], [0, 2, 4], 'r', label="Nested Plot")
nested_ax.set_title('Nested Subplot')
nested_ax.legend()
plt.show()

如上图所示:
- 主子图:这是一个大的子图,占据了图形的大部分区域。它是使用
fig.add_axes([0.1, 0.1, 0.8, 0.8])创建的,其中列表[0.1, 0.1, 0.8, 0.8]定义了子图的位置和大小。 - 嵌套的子图:这是一个小的子图,位于主子图的右上角。它是使用
fig.add_axes([0.6, 0.6, 0.25, 0.25])创建的。
总结
add_subplot
主要用途
- 用于在图形上添加子图,并按照规定的网格布局排列它们。
语法
add_subplot(nrows, ncols, index, **kwargs)
特点
- 自动生成标准网格布局。
- 允许通过索引访问特定位置的子图。
- 相对于其他方法,灵活性稍差,因为它主要用于创建标准的子图网格。
add_axes
主要用途
- 在图形上手动添加子图,并精确定义其位置和大小。
语法
add_axes([left, bottom, width, height], **kwargs)
特点
- 允许用户精确控制子图的位置和大小。
- 很适合创建不规则的子图布局或图形嵌套。
- 需要注意确保子图之间没有重叠。
axes
主要用途
- 与
add_axes类似,它也用于在图形上手动添加子图。但它是matplotlib.pyplot模块的功能,而不是Figure对象的方法。
语法
plt.axes([left, bottom, width, height], **kwargs)
特点
- 功能与
add_axes非常相似。 - 作为
pyplot的函数,它直接作用于当前的图形。 - 允许用户精确控制子图的位置和大小。
结语
add_subplot:当需要创建标准的、规则的子图网格时,这是首选方法。add_axes和axes:当需要手动控制子图的位置和大小、创建不规则的子图布局或嵌套子图时,这两种方法都很有用。add_axes是Figure对象的方法,而axes是pyplot的函数。

浙公网安备 33010602011771号