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
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号