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 分辨率
默认图片以一个 dpi
(dots 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)
其中,fig
为 fig = 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 coordinate
或 radial distance
),\(\theta\)为极角(angular coordinate
或 polar angle
或 azimuth
)。
如图 X所示,平面上,极坐标\((r, \theta)\)可转化为直角坐标系坐标\((x, y)\)。
下面通过一段绘制单位圆的代码来理解上述内容,示例代码用到的函数及其内涵如下所示:
- 利用
matplotlib.pyplot.cm.hsv()
可生成满足hsv
颜色映射的一组颜色。 - 利用
matplotlib.pyplot.subplots()
可创建图形对象fig
、轴对象ax
。其中,figsize=(6, 6)
参数指定了图像的大小为6 × 6
英尺。 - 在轴对象
ax
上,用plot()
方法绘制线图:cos_y
和sin_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()
创建图形对象fig
与2 × 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)
,其中nrows
和ncols
是整数,分别表示行和列的数量。 - 最后可以使用
GridSpec
对象创建子图,gs[i, j]
表示在第i
行和第j
列的位置创建一个子图,可使用切片语法来指定多个位置。
在使用 add_gridspec
函数绘制子图时,可设定轴的类型,比如三维、极坐标等。另外,在 subgridspec
函数可用于创建一个更细粒度的子图网格布局,即嵌套子图,其可实现在一个更大的图形布局中创建具有不同大小和位置的子图。
本文来自博客园,作者:人工智能技术栈,转载请注明原文链接:https://www.cnblogs.com/metafullstack/p/17977250