Python库2——Matplotlib2
上一篇文章主要介绍了Matplotlib库中的Pyplot模块中几大常见图像的绘制,包括自行修改图像的属性,在绘制图像时会自动创建一个图形窗口来展现这些图像。本节内容继续讲讲这个(Figure)图像窗口即其一些常见用法。
其他python库链接:python函数库_Gu_shiwww的博客-CSDN博客
Matplotlib1:Python库2——Matplotlib1-CSDN博客
3 Figure对象
在Matplotlib中,Figure对象用于表示整个图形窗口,包括所有的子图(Axes)、标题、图例等。
其中子图Axes是进行数据绘制和设置坐标轴等操作的核心区域,它与Figure对象密切相关,共同构建了完整的绘图体系;其中Figure相当于是一个画框,axes相当于是画板上的一个子图。
3.1 Figure对象的创建
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=2重用原有的窗口,dpi分辨率,facecolor:背景色,clear:清除图像
fig = plt.figure(num=2, dpi=100, facecolor='g', 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对象
import matplotlib.pyplot as plt
import numpy as npfig = plt.figure()
# 通过add_subplot添加子图
fig.add_subplot(1, 2, 1)
x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)# 通过add_subplot函数添加第二幅子图
fig.add_subplot(1, 2, 2)
y = np.cos(x)
plt.plot(x, y)plt.show()
注意:add_subplot函数可以将整个figure画布分割成n行m列,每一块都是一个子图,但是该函数也只能分割成n行m列,若想将被分割后的某一行融合成一个子图进行使用,需要利用另一个函数(后续会学到)(add_subplot函数存在返回值,可以通过一个变量接受该返回值,之后便可以通过该变量访问到该子图)
图例:
3.2.2 suptitle
fig.suptitle(t, **kwargs)功能:在figure图形上添加一个中心对齐的标题,位于所有子图的顶部
参数:t:字符串
import matplotlib.pyplot as plt
import numpy as np# 添加大标题,fontsize:字体大小,color:字体颜色
fig.suptitle('sin&cos', fontsize=16, color='g')
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
import numpy as np# 自定义子图的位置[左边距,上边距,宽度,高度](0-1之间)
fig = plt.figure()
fig.add_axes([0.2, 0.2, 0.7, 0.7])
x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x,y)plt.show()
图例:可以看到该图像并不在整个画布的正中央,左上边距我们可以自行设置,宽度和高度也可自行设置,需要注意的点是,这四个值都必须是大于0小于1的值,可以理解为占整个画布的百分比,0.2就代表左边与整个画布左边框的空白面积占整个画布长的20%。
3.2.4 subplots_adjust
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:子图之间的垂直间距,(单位:子图高度的比例)。
注意一些限制条件:
left 和 right 的值必须满足 left < right。
bottom 和 top 的值必须满足 bottom < top。
如果设置的间距过大,可能会导致子图之间重叠或超出图形边界。
默认值:
如果不设置某些参数,Matplotlib 会使用默认值。默认情况下,left=0.125,right=0.9,top=0.88,bottom=0.11,wspace=0.2,hspace=0.2
import matplotlib.pyplot as plt
import numpy as np# 创建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.4, 0.9, 0.8, wspace=0.5)
plt.show()
注意:在subplots_adjust函数中right和top两个形参,要大于left和bottom两个形参,两个形参对应的比例实际是分别从左边框和下边框算起,0.8占的是左边框到有边框80%的面积,以下给带分别设置right属性为0.9(左)和0.4(右)的图例,可以更加直观感受到该比例
3.2.* add_axes和subplots_adjust的区别
add_axes只能对单个子图进行大小和位置的调整,而subplots_adjust可以修改子图之间的间距和位置,是对整个子图集进行操作
3.2.5 get_size_inches和get_dpi
fig.get_size_inches功能:获取图形的大小,以英寸为单位返回值:获取到的大小值fig.get_dpi()功能:获取图像的DPI
返回值:获得到的DPI值
以上两个函数无任何形参,返回值为对应的画布的属性
3.2.6 set_size_inches和set_dpi
fig.set_size_inches(width, height, forward=True)参数:width, height:浮点数,指定图形的宽度和高度,单位为英寸。
forward:布尔值,默认为True。如果为True,则在调整图形大小时,同时更新所有子图的大小和位置。如果为False,则仅改变图形的大小,而不更新子图
图像在未设置DPI时,DPI的值默认为100
fig.set_dpi(dpi)
3.2.7 clear
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 npfig = plt.figure()
# 用变量ax接受分割的子图
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([-3, -2, -1, 0, 1, 2], [-2, -1, 0, 1, 2, 3])
# 设置文本
ax.text(2, 3, 'y=x+1')plt.show()
将整个画布分割为两边,对左子图进行的修改,利用test可以在指定位置添加文本
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 的数组,每个元素都是一个子图对象。
import matplotlib.pyplot as plt# 绘制子图,返回值包含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
5.2 gca
import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='sin')
plt.legend()
# 获取Figure对象
fig = plt.gcf()
fig.suptitle('sin')
# 获取Axes对象
ax = plt.gca()
ax.set_xlabel('x')plt.show()
上图中最中心的sin标题是通过fig.suptitle添加的,而右上角的sin是在调用plot时设置的默认label为'sin',利用legend函数可以使这一标题显现,若无该函数默认隐藏
5.3 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 格式的参数。
import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='sin')
plt.legend()y = np.cos(x)
plt.plot(x, y, label='cos')
plt.legend()
# 隐藏坐标轴
plt.axis('off')
# 保存图片
plt.savefig('./sin.png')
5.4 inshow
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:可选参数,用于指定保存的图像格式以及图像质量等参数。
5.* imsave和savefig的区别
imsave是将二维或三维数据保存成图像文件,不含坐标等,它没法直接保存plot等绘制的图像
import matplotlib.pyplot as plt
import numpy as nparr = 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() 方法返回一个 numpy.ndarray 对象,其形状是 (nrows, ncols, nchannels),表示读取的图像的行数、列数和通道数:
- 如果图像是灰度图像,则 nchannels 为 1。
- 如果是彩色图像,则 nchannels 为 3 或 4,分别表示红、绿、蓝三个颜色通道和一个 alpha 通道;为3时表示红绿蓝,为4时表示红绿蓝、透明度
matplotlib.pyplot.imread(fname, format=None)参数:fname:指定了要读取的图像文件的文件名或文件路径,可以是相对路径或绝对路径。
format:参数指定了图像文件的格式,如果不指定,则默认根据文件后缀名来自动识别格式。
返回值:numpy.ndarray 对象
import matplotlib.pyplot as plt# map为在当前文件路径下博主自己导入的一幅图片,返回一个ndarray数组被arr接收
arr = plt.imread('map.png')
plt.imshow(arr)
plt.show()
5.7 close
plt.close(fig=None)功能:该函数用于关闭一个或多个打开的图形窗口,释放资源
参数:fig:指定要关闭的图形,可以是Figure对象,也可以是图形对应的整数
all:关闭所有图形,如果参数省略,关闭当前图像
5.8 Line2D类函数
Line2D 是 Matplotlib 中用于表示二维线条的类。通过返回 Line2D 对象,你可以访问和修改线条的各种属性,例如颜色、线型、标签等。这使得 plt.plot() 不仅仅是绘制图形,还可以让你对绘制的线条进行进一步的定制。
5.8.1 get_label
5.8.2 get_data
Line2D.set_data(xdata, ydata)
5.9 pause
- 暂停程序:plt.pause(interval) 会暂停程序的执行,暂停的时间由参数 interval(单位为秒)决定。
- 刷新图形窗口:在暂停期间,plt.pause() 会强制刷新图形窗口,显示最新的图形内容。这使得它特别适合用于动态更新图形的场景。
函数原型:
pyplot.pause(interval)参数:interval:时间,秒
import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
# plot函数返回的是Line2D对象的列表,用于进一步操作和定制图形中的线条,这些数据属于一个元素,因此在接收时会返回一个含有一个元素的列表
# Line2D对象作为元素存在与列表中,想要获取该元素需要对列表进行序列解包(ld,的过程便是执行这一操作)
# 此时ld内部存储的是plot函数操作后返回的Line2D对象
ld, = plt.plot(x, y, label='sin')# 获取图像中label数据
ret = ld.get_label()
print(ret)y = np.cos(x)
# 根据指定的时间暂停程序,5秒后执行下一步,即去修改ld中的数据
plt.pause(5)
# 修改原图像的数据
ld.set_data(x, y)plt.show()
6 绘制子图网格
在 Matplotlib 中,GridSpec 对象提供了一种灵活的方式来创建子图网格(subplots grid),允许子图跨越多个行和列,以及具有不均匀的行高和列宽。
from matplotlib.gridspec import GridSpecGridSpec(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 npimport matplotlib.gridspec as gs
fig = plt.figure()# 添加子图网格
gs = 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()