目录
3. Figure对象
在Matplotlib中,Figure对象用于表示整个图形窗口,包括所有的子图(Axes)、标题、图例等。
其中子图Axes是进行数据绘制和设置坐标轴等操作的核心区域,它与Figure对象密切相关,共同构建了完整的绘图体系;其中Figure相当于是一个画框,axes相当于是画板上的一个子图。
3.1. Figure对象的创建
对象的创建有两种方式:
● 隐式创建:当直接调用绘图函数(plot、bar、hit等)而没有预先创建Figure对象时,Matplotlib会自动隐式创建一个Figure对象和Axes对象。
● 显式创建:有两种方式:
○ 使用pyplot模块中的figure函数(重点)
○ 使用figure模块中的Figure类
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=Figure, clear=False, **kwargs)
功能:用于创建一个新的图形窗口或激活一个已有的图形窗口
参数:num (int 或 str, 可选):图形的编号或名称。如果为 None 或省略,则创建一个新的图形窗口,并为其分配一个自动增加的编号。如果为整数,则尝试重用具有该编号的图形窗口。如果为字符串,则尝试重用具有该名称的图形窗口。
figsize (tuple):图形的宽度和高度(单位为英寸)
dpi (int):图形的分辨率(每英寸点数)。
facecolor :图形的背景颜色。
edgecolor :图形的边框颜色。不常用效果不明显
frameon (bool):是否显示图形的边框。默认为 True。
FigureClass (type):用于创建图形的类。默认为 matplotlib.figure.Figure。通常不需要更改此参数。
clear (bool):如果为 True,则清除当前图形的内容(如果存在)。默认为 False。
*kwargs**:其他关键字参数将传递给 Figure 类的构造函数。这允许你设置 Figure 对象的其他属性,如 tight_layout、constrained_layout 等。
返回值: Figure 对象,代表创建的图形窗口
代码:
import matplotlib.pyplot as plt
import numpy as np
# 隐式创建Figure对象
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
# 显式创建figure对象,num=1重用原有的窗口,dpi分辨率,facecolor:背景色,clear:清除图像
fig = plt.figure(num = 1, dpi=100, facecolor='r', clear=True)
plt.show()
3.2. Figure类中常用函数
3.2.1. add_subplot
fig.add_subplot(nrows, ncols, index, **kwargs)
功能:在figure中添加子图
参数:nrows: 子图的行数。
ncols: 子图的列数。
index: 子图的位置索引(从1开始,按行优先顺序编号)。
返回值:Axes对象
3.2.2. suptitle
fig.suptitle(t, **kwargs)
功能:在figure图形上添加一个中心对齐的标题,位于所有子图的顶部
参数:t:字符串
3.2.3. add_axes
fig.add_axes(rect, **kwargs)
功能:在figure中任意位置添加一个自定义大小的子图
参数:rect:位置和尺寸,格式通常为 [left, bottom, width, height],值在0到1之间,表示相对于图形尺寸的比例。
left:距figure左边界的比例 bottom:底部边界的比例
width:宽 height:高
**kwargs: 传递给Axes构造函数的额外参数。
返回值:Axes对象
代码:
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import numpy as np
# 创建Figure对象
fig = plt.figure()
# 1.通过fig添加子图
# fig.add_subplot(1,2,1)
# x = np.arange(0, 2*np.pi, 0.1)
# y = np.sin(x)
# plt.plot(x, y)
#
# fig.add_subplot(1, 2, 2)
# y = np.cos(x)
# plt.plot(x, y)
# 2.添加大标题 fontsize:字体大小 color:字体颜色
# fig.suptitle('sin&cos', fontsize=16, color='r')
# 3.自定义子图的位置[左边距,上边距,宽度,高度](0-1之间)
fig.add_axes([0.2, 0.3, 0.5, 0.6])
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
3.2.4. subplots_adjust
该函数允许用户手动调整子图之间的空间,以及子图与图形边缘之间的空间。这个方法提供了比 `tight_layout` 更精细的控制,特别适用于需要精确控制布局的情况。
fig.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
参数:left: 子图区域左边缘位置占图形的比例,范围从 0 到 1。
bottom:子图区域下边缘 位置占图形的比例,范围从 0 到 1。
right:子图区域右边缘位置占图形的比例,范围从 0 到 1。
top:子图区域上边缘位置占图形的比例,范围从 0 到 1。
wspace:子图之间的水平间距,(单位:子图宽度的比例)。
hspace:子图之间的垂直间距,(单位:子图高度的比例)。
1. 边界限制:
left 和 right 的值必须满足 left < right。
bottom 和 top 的值必须满足 bottom < top。
如果设置的间距过大,可能会导致子图之间重叠或超出图形边界。
2. 默认值:
如果不设置某些参数,Matplotlib 会使用默认值。默认情况下,left=0.125,right=0.9,top=0.88,bottom=0.11,wspace=0.2,hspace=0.2
# 创建Figure对象
fig = plt.figure()
fig.add_subplot(1,2,1)
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
fig.add_subplot(1,2,2)
y = np.cos(x)
plt.plot(x, y)
# 手动调整子图位置和间距
fig.subplots_adjust(0.2, 0.3, 0.8, 0.6, wspace=0.5)
plt.show()
区别:
add_axes:对单个子图进行大小和位置的调整
subplots_adjust:修改子图的间距和位置(整体进行操作)
3.2.5. get_size_inches
函数功能为获取图形的大小,以英寸为单位。返回值为获取的大小
3.2.6. set_size_inches
该方法用于设置图形对象的大小,单位为英寸。这个方法允许用户在创建图形后改变其尺寸,从而影响输出图像的大小和显示效果。
fig.set_size_inches(width, height, forward=True)
参数:width, height:浮点数,指定图形的宽度和高度,单位为英寸。
forward:布尔值,默认为True。如果为True,则在调整图形大小时,同时更新所有子图的大小和位置。如果为False,则仅改变图形的大小,而不更新子图。
3.2.7. get_dpi
fig.get_dpi()
功能:获取图像的DPI
返回值:获得到的DPI值
3.2.8. set_dpi
该方法用于设置图形对象的DPI,DPI是每英寸的点数(Dots Per Inch, DPI)。这个方法影响输出图像的质量和文件大小,通常与 `set_size_inches` 方法配合使用来精确控制图形的尺寸和输出质量.
图像在未设置DPI时,DPI的值默认为100
fig.set_dpi(dpi)
3.2.9. clear
在matplotlib的Figure类和Axes类中都含有clear函数,Axes对象主要用于清除该子图上的所有元素(包括线条、标记、文本、图像等),Figure对象是将清除整个图像的所有子图和其他相关的元素
3.3. Axes类中的常用函数
set_xlim(left, right):设置 x 轴的范围。
set_ylim(bottom, top):设置 y 轴的范围。
set_xlabel(label):设置 x 轴的标签。
set_ylabel(label):设置 y 轴的标签。
set_title(label):设置子图的标题。
Axes.text(x, y, s, **kwargs)
参数:x\y:文字的坐标
s:设置的文本内容
kwargs:其他可选的关键字参数,用于控制文本的样式,如
fontsize(字体大小)、
color(颜色)、
horizontalalignment(水平对齐方式,如 ‘left’, ‘center’, ‘right’)、
verticalalignment(垂直对齐方式,如 ‘top’, ‘center’, ‘bottom’)等。
代码:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(1,2,1)
# 设置x轴y轴的范围
ax.set_xlim(-3, 3)
ax.set_ylim(-5, 5)
# 设置x轴y轴的标签
ax.set_xlabel('x')
ax.set_ylabel('y')
# 设置子图标题
ax.set_title('line')
ax.plot([1,2], [3,4])
# 设置文本
ax.text(2, 3, 'y=x+1')
plt.show()
4. 绘制子图的方式
● pyplot中函数subplot绘制子图,返回值为子图对象
● Figure类中的函数add_subplot绘制子图,返回值为子图对象
● pyplot中函数subplots绘制子图,返回值为Figure对象和子图对象数组
fig, ax = plt.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
功能:绘制多个子图,可以一次生成多个
参数:
nrows和ncols:整数,表示子图的行数和列数。
sharex和sharey:布尔值或字符串,表示是否共享x轴或y轴的属性。可选值有True、False、'row'和'col'。
squeeze:布尔值,默认为True。当子图只有一个时,返回一个Axes对象而不是一个数组。False时返回一个二维数组
width_ratios:列宽比例的序列,用于调整各列的宽度比
height_ratios:行高比例的序列,用于调整各行的高度比
subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()来创建每个子图。
gridspec_kw:字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建子图放在网格里(grid)。
**fig_kw:把所有详细的关键字参数传给figure()函数。
返回值:
fig:这是整个图形的对象,可以对其进行全局设置,如标题、大小等。
axes:这是一个数组,包含所有的子图。数组的形状由nrows和ncols决定。例如,如果 nrows=2 和 ncols=3,则 axes 将是一个 2x3 的数组,每个元素都是一个子图对象。
代码:
# 绘制子图,返回值包含Figure对象和Axes对象,Axes对象是一个数组,可以通过下标进行访问子图
fig, ax = plt.subplots(2, 2)
ax[0, 0].plot([2,3], [4,5])
ax[0, 1].plot([1,1], [2,1])
fig.suptitle('sub')
plt.show()
5. pyplot中常用函数
5.1. gcf
功能:获取当前窗口的Figure对象,如果没有活动的图形,这个函数将创建一个新的图形,并将其作为当前活动的图形。通过此函数获取了当前图形的Figure对象后,可以调用Figure类中的相关操作
5.2. gca
功能:获取获取当前图形中的Axes对象
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='sin')
# 获取Figure对象
fig = plt.gcf()
fig.suptitle('sin')
# 获取Axes对象
ax = plt.gca()
ax.set_xlabel('x')
plt.show()
5.3. savefig
matplotlib.pyplot 模块中的 savefig 函数用于将当前图形保存到文件中。
plt.savefig(*args, **kwargs)
参数:fname:字符串或类似文件的对象,指定保存文件的路径或文件名。可以是相对路径或绝对路径。如果文件扩展名缺失,将使用默认格式(通常是 PNG)。
dpi:可选,指定保存图像的dpi(每英寸点数)。默认值是figure.dpi。
format:可选,指定文件格式(如 'png', 'pdf', 'svg', 'ps', 'eps', ...)。如果省略,将使用文件扩展名推断格式。
bbox_inches:可选,指定裁剪框,可以是 'tight'、'standard' 或一个 Bbox 对象。默认为 'standard'。tight:保存的图形文件中不会有不必要的空白边缘,使得图形更加紧凑和整洁
pad_inches:可选,指定边框填充量(以英寸为单位)。默认为 0.1。
facecolor:可选,指定图像的背景颜色。默认为 'w'(白色)。
edgecolor:可选,指定图像边框的颜色。默认为 'w'(白色)。
orientation:可选,指定页面方向('portrait' 或 'landscape'),仅对保存为 PDF 文件时有效。
papertype:可选,指定纸张类型(如 'a4', 'letter'),仅对保存为 PDF 文件时有效。
format_kwargs:可选,其他与格式相关的关键字参数。
metadata:可选,指定要写入文件的元数据。
pil_kwargs 和 pdf_kwargs:可选,特定于 PIL 或 PDF 格式的参数。
代码:
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='sin')
y = np.cos(x)
plt.plot(x, y, label='cos')
# 隐藏坐标轴
plt.axis('off')
# 保存图片
plt.savefig('./sin.png')
5.4. imshow
imshow() 函数是 Matplotlib.pyplot 库中的一个函数,它常用于绘制二维的灰度图像或彩色图像,也可以用于绘制矩阵、热力图、地图等。
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs)
参数:X:图像数据。这通常是一个二维数组(灰度图像)或一个三维数组(彩色图像,其中第三维是颜色通道)。对于二维数组,可以使用 cmap 参数来指定颜色映射
cmap:颜色映射。用于控制图像中不同数值所对应的颜色。默认颜色是'viridis',也可以设置其他颜色,如`gray`、`hot`、`jet`、'binary'等
norm:用于将数据值标准化到 [0, 1] 区间。以便与颜色映射一起使用。如果为 None,则数据将直接用于颜色映射。
aspect:控制图像宽高比,'auto'(默认,根据数据形状自动调整)、'equal'(使像素为正方形)或数字(指定宽高比)
interpolation:插值方法。用于控制图像的平滑程度和细节程度。可以选择`nearest`、`bilinear`、`bicubic`等插值方法。
alpha:图像透明度。取值范围为0~1。
origin:坐标轴原点的位置。可以设置为`upper`或`lower`。
extent:控制显示的数据范围。可以设置为`[xmin, xmax, ymin, ymax]`。
vmin、vmax:控制颜色映射的值域范围。
filternorm 和 filterrad:用于图像滤波的对象。可以设置为`None`、`antigrain`、`freetype`等。
imlim: 用于指定图像显示范围。
resample:用于指定图像重采样方式。
url:用于指定图像链接。
plt.colorbar()
功能:显示颜色柱
5.5. imsave
用于将图像数据保存到磁盘上的函数
matplotlib.pyplot.imsave(fname, arr, **kwargs)
参数:fname:保存图像的文件名,可以是相对路径或绝对路径。
arr:表示图像的NumPy数组。
kwargs:可选参数,用于指定保存的图像格式以及图像质量等参数。
imsave和savefig区别:
savefig可以将绘制的图像保存成文件,包含坐标、标题、图例等
imsave是将二维或三维数据保存成图像文件,不含坐标等,它没法直接保存plot等绘制的图像
代码:
arr = np.array([[1,2,3,1], [2,3,1,2]])
# 绘制二维或三维数据图像,通过cmap进行颜色映射
plt.imshow(arr, cmap='gray')
plt.imsave('./test.png', arr)
plt.show()
5.6. imread
imread() 方法是 Matplotlib 库中的一个函数,用于从图像文件中读取图像数据。
imread() 方法返回一个 numpy.ndarray 对象,其形状是 (nrows, ncols, nchannels),表示读取的图像的行数、列数和通道数:
1. 如果图像是灰度图像,则 nchannels 为 1。
2. 如果是彩色图像,则 nchannels 为 3 或 4,分别表示红、绿、蓝三个颜色通道和一个 alpha 通道;为3时表示红绿蓝,为4时表示红绿蓝、透明度
matplotlib.pyplot.imread(fname, format=None)
参数:fname:指定了要读取的图像文件的文件名或文件路径,可以是相对路径或绝对路径。
format:参数指定了图像文件的格式,如果不指定,则默认根据文件后缀名来自动识别格式。
返回值:numpy.ndarray 对象
代码:
arr = plt.imread('map.png')
plt.imshow(arr)
plt.show()
5.7. close
plt.close(fig=None)
功能:该函数用于关闭一个或多个打开的图形窗口,释放资源
参数:fig:指定要关闭的图形,可以是Figure对象,也可以是图形对应的整数
all:关闭所有图形,如果参数省略,关闭当前图像
5.8. Line2D类函数
概念:
其实就是plot,线条的函数!
在 Matplotlib 库中,plt.plot() 函数的返回值是 **Line2D 对象**(或包含多个 Line2D 对象的列表),这些对象是 matplotlib.lines.Line2D 类的实例,用于表示绘制的线条(如折线图、散点图的连线)。
Line2D 对象支持通过方法动态修改线条属性,无需重新绘图
plt.plot() 返回的 Line2D 对象是 Matplotlib 面向对象绘图的核心,支持对线条属性的精细化控制。
通过 Line2D 的方法可实现动态数据更新、交互式图表及批量属性调整,尤其适合动画、实时监控等场景。
直接操作 Line2D 比重新调用 plt.plot() 更高效,避免重复创建图形对象
plt.plot函数的返回值表示包含一个或多个 Line2D 对象(有多条线时会返回多个Line2D对象)
Line2D 是 Matplotlib 中用于表示二维线条的类。通过返回 Line2D 对象,你可以访问和修改线条的各种属性,例如颜色、线型、标签等。这使得 plt.plot() 不仅仅是绘制图形,还可以让你对绘制的线条进行进一步的定制。
5.8.1. get_label
该方法用于获取图像的标签(参数中指定的label值)。这个方法通常用于获取已经设置好的标签,以便于后续的检查或修改.
5.8.2. set_data
该函数功能为用于动态更新线条的 x 和 y 数据。主要在需要实时更新图形(例如动画)的场景中。
Line2D.set_data(xdata, ydata)
调用该方法后,图形会根据新的数据重新绘制。它不会自动刷新图形,但可以与 plt.draw() 或 plt.pause() 等方法结合使用,以实现动态更新的效果。
5.9. pause
用于在绘图时暂停程序执行,并在指定的时间间隔后继续执行。它常用于动态更新图形或创建简单的动画效果。
函数的作用:
● 暂停程序:plt.pause(interval) 会暂停程序的执行,暂停的时间由参数 interval(单位为秒)决定。
● 刷新图形窗口:在暂停期间,plt.pause() 会强制刷新图形窗口,显示最新的图形内容。这使得它特别适合用于动态更新图形的场景。
函数原型:
pyplot.pause(interval)
参数:interval:时间,秒
代码:
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
ld, = plt.plot(x, y, label='sin')
# 获取图像中label数据
# ret = ld.get_label()
# print(ret)
y = np.cos(x)
# 根据指定的时间暂停程序
plt.pause(5)
# 修改原图像的数据
ld.set_data(x, y)
plt.show()
如需进一步定制复杂图形(如添加形状、子图布局),可结合 matplotlib.patches 或 gridspec 模块扩展功能
6. 绘制子图网格
使用模块gridspec中的函数GridSpec绘制
在 Matplotlib 中,GridSpec 对象提供了一种灵活的方式来创建子图网格(subplots grid),允许子图跨越多个行和列,以及具有不均匀的行高和列宽。
from matplotlib.gridspec import GridSpec
GridSpec(nrows, ncols, figure=None, left=None, right=None, bottom=None, top=None, wspace=None, hspace=None, width_ratios=None, height_ratios=None, w_pad=None, h_pad=None)
参数: nrows: int子图网格的行数。
ncols: int子图网格的列数。
figure: matplotlib.figure.Figure, optional, default: None指定的图形对象。如果未提供,则默认创建一个新的图形对象。
left: float, optional, default: None子图网格左侧的相对位置(0 到 1 的比例)。如果未指定,则使用默认的左边界。
right: float, optional, default: None子图网格右侧的相对位置(0 到 1 的比例)。如果未指定,则使用默认的右边界。
bottom: float, optional, default: None子图网格底部的相对位置(0 到 1 的比例)。如果未指定,则使用默认的底边界。
top: float, optional, default: None子图网格顶部的相对位置(0 到 1 的比例)。如果未指定,则使用默认的顶边界。
wspace: float or None, optional, default: None子图之间的水平间距(以英寸为单位)或作为子图宽度的比例。如果未指定,则使用默认的间距。
hspace: float or None, optional, default: None子图之间的垂直间距(以英寸为单位)或作为子图高度的比例。如果未指定,则使用默认的间距。
width_ratios: list of floats, optional, default: None指定每一列的宽度比例。如果指定,则 ncols 必须与列表长度匹配。
height_ratios: list of floats, optional, default: None指定每一行的高度比例。如果指定,则 nrows 必须与列表长度匹配。
w_pad: float, optional, default: None子图之间的水平填充(以英寸为单位)。如果未指定,则使用默认的填充。
h_pad: float, optional, default: None子图之间的垂直填充(以英寸为单位)。如果未指定,则使用默认的填充。
代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec
# import matplotlib.gridspec as gs
fig = plt.figure()
# 添加子图网格
gs = GridSpec(2, 3)
# 在第一行添加三个子图
fig.add_subplot(gs[0, 0])
fig.add_subplot(gs[0, 1])
fig.add_subplot(gs[0, 2])
# 在第二行添加一个子图
fig.add_subplot(gs[1, :])
plt.show()
补充:
# 设置字体类型能支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 设置显示负数异常
plt.rcParams['axes.unicode_minus'] = False
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2501_92708079/article/details/151724318



