Python常用绘图布局函数的使用简介

📑 用到的Python函数:

  • matplotlib.grid.GridSpec():创建和配置复杂的子图网格布局,以便在一个图形窗口中放置多个子图
  • matplotlib.gridspec.subplotSpec:用于定义和控制子图在网格布局中的位置和大小
  • matplotlib.pyplot.contour():绘制等高线图
  • matplotlib.pyplot.contourf():绘制填充等高线图
  • matplotlib.pyplot.figure():创建一个心的图形窗口或图表对象,以便在其上进行绘图操作
  • matplotlib.pyplot.rcParams:获取或设置全局绘图参数的默认值,如图形尺寸、字体大小、线条样式等
  • matplotlib.pyplot.scatter():绘制散点图
  • matplotlib.pyplot.subplot():用于在当前图形窗口中创建一个子图,并定位该子图在整个图形窗口中的位置
  • matplotlib.pyplot.subplots():一次性创建一个包含多个子图的图形窗口,并返回一个包含子图对象的元组
  • numpy.linspace():在指定的间隔内,返回固定步长的数据
  • numpy.meshgrid():产生网格化数据
  • numpy.random.multivariate_normal():用于生成多元正态分布的随机样本
  • numpy.vstack():返回竖直堆叠后的数组
  • scipy.stats.gaussian_kde():高斯核密度估计
  • statsmodels.api.nonparametric.KDEUnivariate():构造一元 KDE

一、图形对象

1.1 大小尺寸

matplotlib中默认图形尺寸为:宽6.4英尺,高4.8英尺(1英尺约为2.54厘米),即默认图片尺寸为宽约16厘米,高约12厘米。可使用 figure函数,并指定 figsize参数来设置图像的宽度和高度,figsize参数接受一个元组(宽度,高度),单位为英尺。

1.2 分辨率

默认图片以一个 dpidots per inch,每英尺点数)为100的分辨率显示。比如将分辨率设置为 300的代码如下所示:

import maptplotlib.pyplot as plt

plt.rcParams['figure.dpi'] = 300

如果想保存图像到文件,可使用 savefig函数,并通过设置 dpi参数来指定分辨率。例如,保存图像为 300dpi的高质量 PNG文件,可使用如下指令来实现:

import maptplotlib.pyplot as plt

plt.savefig('plot_name.png', dpi=300)

对于 Seaborn,可通过如下指令来修改图像的分辨率:

import seaborn as sns

sns.set(rc={"figure.dpi":300, "savefig.dpi":300})

1.3 边距

一张图片的边距(margin)即为其上线左右的留白。在 matplotlib默认情况下,图像的边距为:

figure.subplot.left: 0.125
figure.subplot.right: 0.9
figure.subplot.top: 0.88
figure.subplot.bottom: 0.11

如图 1所示,这些参数的值为 0~1之间的浮点数,相当于图像的宽度或高度的百分比。

默认情况下,在宽度方向上,left = 0.125表示左边距相对于图像宽度的 12.5%right = 0.9表示右边距相对于图像宽度的 90%

高度方向来看,top = 0.88表示图像顶边位于图像高度的 88%。而 bottom = 0.1表示底边距相对于图像高度的 10%

注意:(0, 0)表示图形左下角,(1, 1)表示图形右上角。

图1 图片宽度、高度百分比

二、使用 subplot

matplotlib中,matplotlib.pyplot.subplot为一个函数(后续使用 subplot表示),其用于创建和管理图形中的子图。其基本语法为:

import matplotlib.pyplot as plt

plt.subplot(nrows, ncols, index)

其中,nrows表示子图的行数,ncols表示子图的列数,index表示子图的索引。

注意💥:比较 plt.plot()ax.plot()的区别 <br>

  • 以绘制二维线图为例,plt.plot()相当于“提笔就画”,即其以一种简便的方式来创建图形并进行快速绘画。当只需创建一个简单的图形时,可使用该函数来自动创建一个图形窗口并在窗口中绘制图形。
  • ax.plot()是基于 Axes对象来绘制图形,Axes对象是一个图形窗口中的一个独立坐标系。使用面向对象接口时,需要显式地创建一个 Figure对象和一个或多个 Axes对象,并在指定的 Axes对象上调用 plot()方法进行绘图。ax.plot()适合更为复杂的绘图需求,并且具有更高的灵活性。

三、使用 add_subplot

add_subplot()函数用于在图形中添加子图,其基本语法如下所示:

fig.add_subplot(nrows, ncols, index)

其中,figfig = plt.figure()产生的 Figure对象,nrows为子图的行数,ncols为子图的列数,index为当前子图的索引(从 1开始,先行后列顺序递增)。

add_subplot()返回一个 AxesSubplot对象,其表示创建的子图。我们可使用此对象进行进一步的图形操作,比如绘制数据、设置坐标轴标签和标题等。

注意💥:比较 add_subplot()subplot()的区别,总的来说,两者在功能是相似的,都可以用于创建和管理图形中的子图,其主要区别表现为使用的方式和语法 <br>

  • add_subplot()Figure对象的方法,用于在特定的 Figure是那个添加子图。使用 add_subplot()方法时,首先需要创建一个 Figure对象,然后调用该方法来添加子图,并将子图对象存储在变量中以进行后续操作。
  • subplot()pyplot模块的函数,用于在当前的图形中添加子图。subplot()语法为 plt.subplot(nrows, ncols, index)。使用 subplot()函数时,不需要显式地创建 Figure对象。可以直接调用 subplot()函数,并在同一个代码块中添加多个子图。

图1 自定义图片尺寸

四、使用 subplots

matplotlib中,subplots函数用于创建一个包含多个子图的图形布局,并返回一个包含子图对象的元组。以下是使用 subplots函数的基本步骤:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows, ncols)
axes[i, j]表示在第i行和第j列的位置上的子图对象

下面给出使用 subplots可视化极坐标和直角坐标转化。

如图 X所示,\(O\)是极坐标的极点pole),从\(O\)向右引一条射线作为极轴polar axis)规定逆时针角度为正。这样,平面上任意一点\(P\)的位置可以由线段\(OP\)的长度\(r\)和极轴到\(OP\)的角度\(\theta\)来确定。\((r, \theta)\)就是\(P\)点的极坐标。

图X 从极坐标系到平面直角坐标系

一般,\(r\)极径radial coordinateradial distance),\(\theta\)极角angular coordinatepolar angleazimuth)。

如图 X所示,平面上,极坐标\((r, \theta)\)可转化为直角坐标系坐标\((x, y)\)

下面通过一段绘制单位圆的代码来理解上述内容,示例代码用到的函数及其内涵如下所示:

  • 利用 matplotlib.pyplot.cm.hsv()可生成满足 hsv颜色映射的一组颜色。
  • 利用 matplotlib.pyplot.subplots()可创建图形对象 fig、轴对象 ax。其中,figsize=(6, 6)参数指定了图像的大小为 6 × 6英尺。
  • 在轴对象 ax上,用 plot()方法绘制线图:
    • cos_ysin_y分别表示 x轴和 y轴上的坐标。
    • zorder = 1指定了图形的层次顺序。zorder值越大,图形就越靠前。
    • color = 'k'指定了线的颜色为黑色。
    • lw = 0.25指定线条的粗细程度。
  • 在轴对象 ax上,用 scatter()方法绘制散点图:
    • marker = '.'指定用于标记散点的符号类型。
    • s = 88表示散点的大小。
    • c = colors表示散点的颜色参数,指定了每个散点的颜色。
    • edgecolor = 'w'指定了散点边缘的颜色,这里使用的是白色 w
    • zorder = 2将散点图置于线图之上。
  • 使用 axhline()在轴对象 ax上绘制水平参考线。
  • 使用 axvline()在轴对象 ax上绘制竖直参考线。

绘制单位圆的代码如下所示:

# 导入包
import numpy as np
import matplotlib.pyplot as plt

# 设置图片参数
p = plt.rcParams
p["font.sans-serif"] = ["Roboto"]
# p["font.sans-serif"] = ["Times New Roman"]
p["font.weight"] = "normal"
p["font.size"] = 14
p["figure.subplot.left"] = 0.15
p["figure.subplot.right"] = 0.95
p["figure.subplot.top"] = 1
p["figure.subplot.bottom"] = 0.05
p["ytick.minor.visible"] = True
p["xtick.minor.visible"] = True
p["axes.grid"] = True
p["grid.color"] = "0.3"
p["grid.linewidth"] = 0.5
p["text.usetex"] = True         # 允许设置latex字体

# 生成数据
theta_arr = np.linspace(0, 2*np.pi, 120, endpoint = False)
sin_y = np.sin(theta_arr)
cos_y = np.cos(theta_arr)

# 使用hsv色谱生成一组渐变色,颜色种类和散点数相同
colors = plt.cm.hsv(np.linspace(0, 1, len(cos_y)))

# 设置图片大小
fig, ax = plt.subplots(figsize=(6, 6))

# 绘制正圆,横轴坐标为cos,纵坐标为sin
ax.plot(cos_y, sin_y, zorder=1, color='k', lw=0.25)
ax.scatter(cos_y, sin_y, marker='.', s=88, c=colors, edgecolor='w', zorder=2)
ax.axhline(0, c='k', zorder=1)
ax.axvline(0, c='k', zorder=1)
ax.set_xlabel(r'$x = cos(\theta)$', fontproperties="Times New Roman", fontsize=16)
ax.set_ylabel(r'$y = sin(\theta)$', fontproperties="Times New Roman",fontsize=16)

# 设置横轴与纵轴范围
ax.set_xlim(-1.25, 1.25)
ax.set_ylim(-1.25, 1.25)
ax.grid(True, ls='--')

# 横纵轴采用相同的scale
ax.set_aspect('equal')

plt.savefig('./img/单位圆.png', dpi=300)

代码执行结果如下图所示:

图 X 单位圆

五、使用 GridSpec

matplotlib中,GridSpec是一个用于灵活布局子图的工具,其允许在绘图区域中创建规则的网格,并指定每个子图的大小、位置和跨越的行列数。

使用 GrideSpec,可实现更为高级的方式组织和排列多个子图,而不是使用默认的单行单列布局。这对于创建复杂的图形布局非常有用,例如在一个绘图区域中显示多个子图,并使得它们具有不同的大小与位置。

图 X为 4 × 4网格中两种子图布局,其中蓝色子图为主图。

图 X 4 × 4网格中两种子图布局

如图 X所示,通过 GridSpec还可以定义子图的宽度比例与高度比例。

图 X 2 × 2网格中两种子图布局以及宽高比例调整

如图 X所示,有四个子图,下面给出每个子图对应的代码。首先给出代码中主要的代码细节。

  • 使用 matplotlib.pyplot.subplots()创建图形对象 fig2 × 2子图对象 axes

六、使用 add_gridspec

Matplotlib中,add_gridspec函数可以用来创建复杂的图形布局。它允许你在图形中创建多个子图,并指定他们的位置和大小。使用 add_gridspec函数的基本步骤如下所示:

  • 首先导入 import matplotlib.pyplot as plt
  • 然后创建一个 Figure对象 fig = plt.figure()
  • 再创建一个 GridSpec对象 gs = fig.add_gridspec(nrows, ncols),其中 nrowsncols是整数,分别表示行和列的数量。
  • 最后可以使用 GridSpec对象创建子图,gs[i, j]表示在第 i行和第 j列的位置创建一个子图,可使用切片语法来指定多个位置。

在使用 add_gridspec函数绘制子图时,可设定轴的类型,比如三维、极坐标等。另外,在 subgridspec函数可用于创建一个更细粒度的子图网格布局,即嵌套子图,其可实现在一个更大的图形布局中创建具有不同大小和位置的子图。

posted @ 2024-01-20 22:27  人工智能技术栈  阅读(28)  评论(0编辑  收藏  举报