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 mplimport matplotlib.pyplot as plt 这两条语句看起来很相似,但它们实际上涉及了 Matplotlib 库的不同部分。

  1. import matplotlib as mpl

这条语句导入了整个 Matplotlib 库,并将其命名为 mpl。Matplotlib 是一个相当庞大的库,包括许多不同的模块和功能。导入整个库通常用于访问一些全局设置和配置,例如更改全局字体、颜色方案等。

例如,你可以通过以下方式更改全局字体大小:

import matplotlib as mpl

mpl.rcParams['font.size'] = 12
  1. import matplotlib.pyplot as plt

这条语句导入了 Matplotlib 的 pyplot 模块,并将其命名为 pltpyplot 是 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()
  1. 区别与联系
  • 区别
    • mpl 是整个 Matplotlib 库的引用,可以用于访问全局设置和配置。
    • plt 是 Matplotlib 库中 pyplot 子模块的引用,专门用于绘图和图表定制。 
  • 联系
    • plt 实际上是 mpl 的一部分,是整个库的子模块。
    • 通常,你会将 pltmpl 一起使用,以便在创建图表的同时更改全局设置。

总的来说,mpl 用于访问库的全局特性和设置,而 plt 用于执行具体的绘图任务。在大多数情况下,你将主要使用 plt,但在需要更改全局设置时,你可能还需要使用 mpl

快速开始

fig, ax = plt.subplots()  
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) 
plt.show()

  1. fig, ax = plt.subplots()

这一行创建了一个新的 Figure 和一个新的 Axes(子图)。plt.subplots() 函数返回两个对象:

  • fig:整个图形,包括所有的子图、标题等。
  • ax:单个的子图(或绘图区域),你可以在其中绘制线条、散点图等。
  1. 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)

  1. plt.show()

这一行负责显示整个图形。当你在脚本中使用 Matplotlib 时,通常需要调用 plt.show() 来打开一个窗口并显示图形。如果你在 Jupyter Notebook 中工作,则可能不需要此行,因为图表通常会自动显示。

  1. 总结

整个代码段的工作流程是:

  1. 创建一个包含单个子图的图形。
  2. 在子图上绘制一条线。
  3. 显示图形。

图形(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()

 

更多高级参数和用法

  1. ncol:图例中的列数。
  2. shadow:布尔值,表示图例是否具有阴影。
  3. borderpad:图例边框的内边距。
  4. labelspacing:图例中的标签之间的垂直间距。
  5. handlelength:图例句柄的长度(例如线)。
  6. handletextpad:图例句柄和文本之间的间距。
  7. borderaxespad:图例和坐标轴之间的间距。
  8. bbox_to_anchor:微调图例的位置。

这只是legend方法的一部分参数。为了完整地了解它的功能,建议查看官方文档。

ncol

ncollegend 函数中的一个参数,它表示图例中的列数。

默认情况下,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),其中 xy 是图例框左上角的坐标。
  • 使用方法:
  1. 默认坐标系:如果没有任何其他的坐标系参数(如 bbox_transform)被指定,那么这些坐标将相对于 loc 参数所定义的位置。例如,loc='upper right'bbox_to_anchor=(1, 1) 是相同的。
  2. 轴坐标系:如果您想要在轴的特定位置放置图例,可以使用轴的坐标系统。在这个坐标系统中,(0, 0) 是轴的左下角,(1, 1) 是右上角。
  3. 图坐标系:如果您想要在整个图的特定位置放置图例,可以使用图的坐标系统。在这个坐标系统中,(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()

 

在上述例子中,我们使用了 xticksrotationha 参数来旋转和对齐x轴的刻度标签。这在处理长标签时非常有用。

 

Matplotlib绘图指南-3-属性设置(2)

坐标轴范围xlim、ylim

xlimylimmatplotlib 中分别用于获取或设置x轴和y轴的范围。

xlim

这个函数主要用于获取或设置x轴的范围。

用法:

  • 获取当前x轴的范围
    xmin, xmax = plt.xlim()

    xminxmax 分别是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 中,xlabelylabel 分别用于为图形的 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)

  • nrowsncols用于指定图纸将被分成多少行和列。
  • 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提供了更多的灵活性,允许创建不规则的子图布局。

基本用法涉及以下步骤:

  1. 创建一个GridSpec对象。
  2. 使用这个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),其中:

  • nrowsncols 分别指定要将图形划分成的行数和列数。
  • index 指定子图的索引,从1开始,从左到右,从上到下。

例如,add_subplot(2, 2, 1) 将创建一个2x2的布局中的第一个子图。

图形嵌套

除了上述基本用法外,add_subplot还允许为图形添加嵌套的子图。这是通过传递一个4元素的列表来实现的,该列表定义了子图的位置和大小:[left, bottom, width, height]

其中:

  • leftbottom 是子图左下角的x和y坐标。
  • widthheight 是子图的宽度和高度。

所有这些值都是相对于图形大小的比例,范围在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()

如上图所示:

  • 主子图:占据了整个图形的大部分,显示了一个蓝色的线图。
  • 嵌套的子图:位于图形的右下角,显示了一个红色的线图。

这是通过以下方式完成的:

  1. 使用 add_subplot(1, 1, 1) 添加主子图。
  2. 使用 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_subplotadd_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]
    • leftbottom 是子图左下角的坐标。
    • widthheight 是子图的宽度和高度。
    • 所有这些值都是相对于图形大小的比例,范围在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中用于手动定义子图位置和大小的工具。与subplotgridspec

相比,这为您提供了更多的灵活性,但同时也需要更多的注意力来确保子图之间没有重叠。

可以使用add_axes来创建不规则或自定义的子图布局,或在图形上添加嵌套或叠加的子图。

axes函数

matplotlibaxes函数是用于在图形上添加子图的工具,它提供了一种手动定义子图位置和大小的方法。与add_subplotadd_axes相比,axes函数允许更直观地定义子图的位置。

基本语法

axes([left, bottom, width, height], **kwargs)

其中:

  • leftbottom 是子图左下角的坐标。
  • widthheight 是子图的宽度和高度。
  • 所有这些值都是相对于图形大小的比例,范围在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_axesaxes:当需要手动控制子图的位置和大小、创建不规则的子图布局或嵌套子图时,这两种方法都很有用。add_axesFigure对象的方法,而axespyplot的函数。

 

posted @ 2025-10-30 20:45  emanlee  阅读(202)  评论(0)    收藏  举报