蝶花琉曦头像
关注

Python高级——matplotlib库(2/2)

 

目录

 3.  Figure对象

 3.1.  Figure对象的创建

 3.2.  Figure类中常用函数

 3.2.1.  add_subplot

 3.2.2.  suptitle

 3.2.3.  add_axes

 3.2.4.  subplots_adjust

 3.2.5.  get_size_inches

 3.2.6.  set_size_inches

 3.2.7.  get_dpi

 3.2.8.  set_dpi

 3.2.9.  clear

 3.3.  Axes类中的常用函数

 4.  绘制子图的方式

 5.  pyplot中常用函数

 5.1.  gcf

 5.2.  gca

 5.3.  savefig

 5.4.  imshow

 5.5.  imsave

 5.6.  imread

 5.7.  close

 5.8.  Line2D类函数

 5.8.1.  get_label

 5.8.2.  set_data

 5.9.  pause

 6.  绘制子图网格


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

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--