⭕ Matplotlib的官方网站 : Matplotlib — Visualization with Python
目录
2️⃣根据正态分布密度的计算公式,自定义函数normal_density(mu. sigma, x)
☑️ 3.2 设置图形的刻度线朝内,并在图形的上方和右方都有刻度标出
📖1、从一个实例中快速了解Matplotlib
# 1.在使用Matplotlib绘制图形时,必须先导入pyplot模块
import matplotlib.pyplot as plt
# 2.导入nympy库
import numpy as np
# 3.生成x,y轴的数据
x = np.linspace(0, 2 * np.pi, 200)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
-
🔖解释其中代码的一些含义:
(1)np.linspace(start,stop,num,endpoint,retstep,dtype,axis)
- 用于在指定的起始点和结束点之间生成等间隔的数值序列,具体参数解释见下表
字段名称 | 数据类型 | 含义 |
start | int 或 float | 序列起始值 |
stop | int 或 float | 序列的结束值 |
num | int | 要生成的样本数量,默认为50 |
endpoint | bool | 如果为True,则stop 值包含在输出序列中;如果为False,则stop值不包含在输出序列中 |
retstep | bool | 如果为True,则返回样本之间的步长以及数值序列 |
dtype | NumPy 数据类型 | 定义输出数组的数据类型 |
axis | int | 当生成的是多维数组时,这个参数用来指定在哪个轴上使用 linspace |
使用linspace函数生成等间隔的数值数列时,可以发现x轴中是用“2*np.pi”,np.pi表示的是一个 常数的圆周率π,2*np.pi就等同于2π
(2)sin( ) —— 返回正弦值,数值在 -1 到 1 之间
(3)fig, ax = plt.subplots()是Matplotlib库中经常会用到的一个函数,是用于创建新的图形窗口以及对应的子图。返回的fig和ax对象分别代表了一整个图形和其中对应的子图
(4)matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw)
字段名称 | 数据类型 | 含义 |
nrows | int | 设置图表的行数,默认为 1 |
ncols | int | 设置图表的列数,默认为 1 |
sharex、sharey | - | 设置 x、y 轴是否共享属性,默认为 false,可设置为 'none'、'all'、'row' 或 'col'。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 'all':所有子图共享 x 轴或 y 轴,'row' 设置每个子图行共享一个 x 轴或 y 轴,'col':设置每个子图列共享一个 x 轴或 y 轴。 |
squeeze | bool | 默认为 True,表示额外的维度从返回的 Axes(轴)对象中挤出,对于 N*1 或 1*N 个子图,返回一个 1 维数组,对于 N*M,N>1 和 M>1 返回一个 2 维数组。如果设置为 False,则不进行挤压操作,返回一个元素为 Axes 实例的2维数组,即使它最终是1x1。 |
subplot_kw | dict | 可选,把字典的关键字传递给 add_subplot() 来创建每个子图 |
gridspec_kw | dict | 可选,把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid) |
figsize | float | 定义图形的宽度和高度,单位为英寸 |
facecolor | str | 定义图形背景的颜色 |
edgecolor | str | 定义图形边缘颜色 |
**kwargs | - | 把详细的关键字参数传给 figure() 函数 |
(5)plt.plot(x,y,fmt='xxx',linestyle=, marker=, color=, linewidth=,markersize=,label=,)
字段名称 | 数据类型 | 含义 |
x | 数组类型(如list、tuple等)或可迭代对象 | 定义绘图数据点的x坐标 |
y | 数组类型(如list、tuple等)或可迭代对象 | 定义绘图数据点的y坐标 |
linestyle | str | 表示线的样式,如:'-':实线、'--':虚线、'-.':点划线、':':点虚线 |
linewidth | 数值 | 格表示线的粗细,粗细程度和所定数值大小有关 |
marker | str | 点的样式,如:'.':点、',':像素、'o':圆形 |
markersize | 数值 | 数值,点的大小 |
color | str | 调节线条还有点的颜色,如:'r' :红色、'g':绿色、 'b':蓝色 |
label | str | 指定图例的标签 |
ax.plot(x, y)传递x,y轴数据,其实就是让x,y轴联系起来,形成二维坐标轴
(6)plt.show()——显示所创建的图形
📈2、正态分布密度图
1️⃣生成绘制图形所需要的数据
# 1.使用linspace函数创建等差数列样本,共100个样本数,数据开始点是-6,结束点是6
x_values = np.linspace(-6, 6, 100)
# 2.查看生成得到的数据
x_values
# 3.得到的结果为
array([-6. , -5.87878788, -5.75757576, -5.63636364, -5.51515152,
-5.39393939, -5.27272727, -5.15151515, -5.03030303, -4.90909091,
-4.78787879, -4.66666667, -4.54545455, -4.42424242, -4.3030303 ,
-4.18181818, -4.06060606, -3.93939394, -3.81818182, -3.6969697 ,
-3.57575758, -3.45454545, -3.33333333, -3.21212121, -3.09090909,
-2.96969697, -2.84848485, -2.72727273, -2.60606061, -2.48484848,
-2.36363636, -2.24242424, -2.12121212, -2. , -1.87878788,
-1.75757576, -1.63636364, -1.51515152, -1.39393939, -1.27272727,
-1.15151515, -1.03030303, -0.90909091, -0.78787879, -0.66666667,
-0.54545455, -0.42424242, -0.3030303 , -0.18181818, -0.06060606,
0.06060606, 0.18181818, 0.3030303 , 0.42424242, 0.54545455,
0.66666667, 0.78787879, 0.90909091, 1.03030303, 1.15151515,
1.27272727, 1.39393939, 1.51515152, 1.63636364, 1.75757576,
1.87878788, 2. , 2.12121212, 2.24242424, 2.36363636,
2.48484848, 2.60606061, 2.72727273, 2.84848485, 2.96969697,
3.09090909, 3.21212121, 3.33333333, 3.45454545, 3.57575758,
3.6969697 , 3.81818182, 3.93939394, 4.06060606, 4.18181818,
4.3030303 , 4.42424242, 4.54545455, 4.66666667, 4.78787879,
4.90909091, 5.03030303, 5.15151515, 5.27272727, 5.39393939,
5.51515152, 5.63636364, 5.75757576, 5.87878788, 6. ])
2️⃣根据正态分布密度的计算公式,自定义函数normal_density(mu. sigma, x)
- normal_density(mu,sigma, x) —— 计算X中的元素在参数mu、sigma指定的正态分布下的概率密度函数值
mu | 均值 |
sigma | 标准差 |
x | 所求的数据 |
# 1.定义正态分布的函数
def normal_density(mu, sigma, x):
# 2.# 正态分布函数的计算公式
return (1./(np.sqrt(2*np.pi)*sigma))*np.exp(-(x - mu)**2/(2*sigma**2))
3️⃣根据定义的函数计算生成图形Y轴所需要的数据
# 1.计算生成图形Y轴所需要的数据
y1 = normal_density(0, 1, x_values)
y2 = normal_density(0, 0.4, x_values)
y3 = normal_density(-3, 0.5, x_values)
# 2.查看y1的数据
print(y1)
# 3.y1的数据为
[6.07588285e-09 1.24815786e-08 2.52667171e-08 5.04019459e-08
9.90752028e-08 1.91911861e-07 3.66317652e-07 6.89021948e-07
1.27710748e-06 2.33260402e-06 4.19830294e-06 7.44604587e-06
1.30135811e-05 2.24123358e-05 3.80361541e-05 6.36099797e-05
1.04826986e-04 1.70231576e-04 2.72412055e-04 4.29567786e-04
6.67507686e-04 1.02211560e-03 1.54227900e-03 2.29321647e-03
3.36005466e-03 4.85139698e-03 6.90250079e-03 9.67754721e-03
1.33703665e-02 1.82028969e-02 2.44206312e-02 3.22843794e-02
4.20578610e-02 5.39909665e-02 6.82989777e-02 8.51385964e-02
1.04582242e-01 1.26592680e-01 1.51000512e-01 1.77487359e-01
2.05577517e-01 2.34640505e-01 2.63906165e-01 2.92492859e-01
3.19448006e-01 3.43798736e-01 3.64609139e-01 3.81039507e-01
3.92402391e-01 3.98210276e-01 3.98210276e-01 3.92402391e-01
3.81039507e-01 3.64609139e-01 3.43798736e-01 3.19448006e-01
2.92492859e-01 2.63906165e-01 2.34640505e-01 2.05577517e-01
1.77487359e-01 1.51000512e-01 1.26592680e-01 1.04582242e-01
8.51385964e-02 6.82989777e-02 5.39909665e-02 4.20578610e-02
3.22843794e-02 2.44206312e-02 1.82028969e-02 1.33703665e-02
9.67754721e-03 6.90250079e-03 4.85139698e-03 3.36005466e-03
2.29321647e-03 1.54227900e-03 1.02211560e-03 6.67507686e-04
4.29567786e-04 2.72412055e-04 1.70231576e-04 1.04826986e-04
6.36099797e-05 3.80361541e-05 2.24123358e-05 1.30135811e-05
7.44604587e-06 4.19830294e-06 2.33260402e-06 1.27710748e-06
6.89021948e-07 3.66317652e-07 1.91911861e-07 9.90752028e-08
5.04019459e-08 2.52667171e-08 1.24815786e-08 6.07588285e-09]
4️⃣使用Matplotlib的plot()函数绘图
# 1.图形的大小,(宽度,高度)
plt.figure(figsize = (10, 6))
# 2.绘制三条密度曲线
plt.plot(x_values, y1, 'green', label = r'$\mathcal{N}(0, 1)$') ## 这里的'$\mathcal{N}(0,1)$ 中$\mathcal{N}$ 表示的是高斯分布,采用花样字体显示
plt.plot(x_values, y2, 'blue', label = r'$\mathcal{N}(0, 0.2)$') ## \mathcal 表示花样字体
plt.plot(x_values, y3, 'orange', label = r'$\mathcal{N}(-3, 0.5)$')
# 3.指定刻度
plt.yticks(np.arange(0, 1.1, 0.1)) ## 表示Y轴刻度的起始点为0,终点为1.1(不包括1.1),步长为0.1
plt.xticks(np.arange(-6, 7, 1)) ## 表示X轴刻度的起始点为-6,终点为7(不包括7),步长为1
# 4.X轴和Y轴的标签
plt.xlabel(r'$x$') ## 表示采用采用斜体输出x
plt.ylabel(r'$f(x)$') ## 表示采用采用斜体输出f(x)
# 5.添加图例
plt.legend()
# 6.显示图形
plt.show()
🔖解释其中代码的一些含义
📍 plt.figure(figsize,dpi,facecolor,edgecolor,linewidth,frameon)
字段名称 | 数据类型 | 含义 |
figsize | folat | 图形窗口的尺寸,以英寸为单位。第一个值是宽度,第二个值是高度 |
dpi | int | 设置图形的分辨率,默认值为100 |
facecolor | str或颜色格式(如:RGB元组) | 设置图形的背景颜色 |
edgecolor | str或颜色格式(如:RGB元组) | 设置图形的边框颜色 |
linewidth | folat 或 int | 设置图形边框的线宽 |
frameon | bool | 设置是否显示图形边框 |
代码中,将图形的宽度设置为10英寸高,6英寸宽
📍 plt.plot(x_values, y1, 'green', label = r'$\mathcal{N}(0, 1)$')
传入x,y轴数据 ➡️ 将该线条的颜色设置为绿色 ➡️ 设置便签为r'$\mathcal{N}(0, 1)$',这表示 标签采用花样字体显示
📍 plt.xticks(ticks, labels=None, **kwargs) ,yticks与此用法类似
字段名称 | 数据类型 | 含义 |
ticks | list 或 数组 或浮点数序列 | 刻度的位置,可以是一个列表或数组。如果不指定该参数,则默认使用当前图表中的刻度位置 |
labels | list 或 数组 或字符串序列 | 刻度的标签,可以是一个列表或数组。如果不指定该参数,则默认使用当前图表中的刻度标签 |
which | str | 用于指定是设置主 x 轴(‘major’)还是次 x 轴(‘mioner)的刻度默认是‘major’ |
rotation | float 或 int | 设置 x 轴刻度标签的旋转角度(以度为单位) |
**kwargs | - | 其他可选参数,用于设置刻度标签的字体、颜色等 |
📍 np.arange([start,] stop[, step,]dtype=None)
字段名称 | 数据类型 | 含义 |
start | int 或 float | 可选参数,表示起始值,默认为0 |
stop | int 或 float | 必需参数,表示终止值,但不包括终止值本身 |
step | int 或 float | 可选参数,表示步长,默认为1 |
dtype | str | 可选参数,表示所需的数据类型 |
plt.xticks(np.arange(-6, 7, 1)) 表示X轴刻度的起始点为-6,终点为7(不包括7),步长为1
📍 plot.xlabel(xlabel, fontdict=None,labelpad=None,**kwargs),ylabel同理
字段名称 | 数据类型 | 含义 |
xlabel | str | 标签文本,并且包含字符串值 |
labelpad | float | 标签与坐标轴的距离,默认值为None |
rotation | float 或 int | 设置标签的方向 |
**kwargs | - | 这个参数是Text属性,用于控制标签的外观 |
plt.xlabel(r'$x$') 表示采用采用斜体输出x
📍 plt.legend(loc,bbox_to_anchor,ncol,title,frameon)
字段名称 | 数据类型 | 含义 |
loc | str 或 int | 设置图例的位置,如:’best’(自动选择最佳位置,默认值), ‘upper right’(右上角) |
bbox_to_anchor | 元组、列表或BboxBase实例 | 将图例锚定到指定位置的坐标和尺寸,它是一个元组,默认为(None, None) |
ncol | int | 设置图例的列数,默认为1。当图例有多个标签时,可以通过设置ncol参数来调整图例的列数,让图例显示得更加整齐 |
title | str | 设置标题 |
fontsize | str 或 int 或float | 图例中文字的大小 |
frameon | bool | 设置图例的是否含有边框 |
shadow | bool | 是否在图例后面绘制阴影 |
handlelength、handletextpad | float | 分别用于设置图例中标记(handle)的长度和标记与文本之间的间距 |
labelspacing、columnspacing | float | 分别用于设置图例项之间的垂直间距和列之间的水平间距 |
fancybox | bool | 是否绘制一个圆角矩形作为图例边框 |
❓ 从最终绘制得到的图形可发现,与比较常见的图形有些地方不一样,如下:
(1)图形的曲线应从原点开始,现在有空白,不美观
(2)图形的刻度线应该朝内,并在图形的上方和右方都有刻度标出
(3)图形Y轴的标签应该水平放置
接下来,将一个个解决这些问题
📊3、美化正态密度分布图
1️⃣ 3.1 设置图形的曲线从原点开始
- 使用xlim()和ylim()重新指定双轴的刻度范围
- plot.xlim(*args, **kwargs) —— 获取或设置当前轴的x限制
字段名称 | 数据类型 | 含义 |
left | 数值 | 将xlim设置为左,返回新的x轴限制的元组 |
right | 数值 | 将xlim设置为右,返回新的x轴限制的元组 |
**kwargs: | - | 这个参数是Text属性,用于控制标签的外观 |
plt.xlim(-6, 6) —— 可以理解为严格按设定的长度来显示x轴的作图范围
plt.ylim(0, 1) —— 可以理解为严格按设定的长度来显示y轴的作图范围
2️⃣ 3.2 设置图形的刻度线朝内,并在图形的上方和右方都有刻度标出
- 可以通过tick_params()函数来修改图形刻度的细节
- plot.tick_params(axis='both', **kwargs) —— 更改刻度、刻度标签和网格线的外观
字段名称 | 数据类型 | 含义 |
axis | str | 可选参数,设置x轴、y轴以及同时设置。默认值为 ’ both ’可选 {‘ x ‘, ‘ y ‘, ‘ both ‘} |
reset | bool | 可选参数,默认为False,若为True,则在处理其他关键字参数之前将所有参数设置为默认值 |
which | str | 可选参数,默认值为“major”,可选{‘major’, ‘minor’, ‘both’} |
direction | str | 可选参数,将刻度置于坐标轴内、轴外,或同时置于两者,可选{‘in’, ‘out’, ‘inout’} |
length | float | 刻度线长度 |
width | float | 刻度线宽度 |
color | 颜色 | 刻度颜色 |
pad | float | 刻度和标签之间的距离 |
labelsize | float或str | 刻度标签的字体大小或以字符串,如:“大” |
bottom,top,left,right | bool | 分别表示底部,顶部,左侧,右侧;是否绘制各个方向的刻度线 |
labelbottom、labeltop、labelleft、labelright | bool | 代表设置绘图区四个边框线上的刻度线标签是否显示 |
plt.tick_params(top = True, right = True, direction = 'in') —— 表示坐标轴的顶部和右侧均绘制坐 标线,且刻度置于坐标轴内
3️⃣ 3.3 设置图形Y轴的标签水平放置
- 可以在ylabel()中指定参数rotation的值,来旋转Y轴标签
- 在上面已经提及此函数的用法,这里不再赘述
plt.ylabel(r'$f(x)$', rotation = 0) —— 表示将y轴标签的旋转角度设为0,即不旋转
✔️所有的代码如下:
# 1.图形的大小,(宽度,高度)
plt.figure(figsize = (10, 8))
# 2.绘制三条密度曲线
plt.plot(x_values, y1, 'green', label = r'$\mathcal{N}(0, 1)$') ## 这里的'$\mathcal{N}(0, 1)$ 中$\mathcal{N}$ 表示的是高斯分布,采用花样字体显示
plt.plot(x_values, y2, 'blue', label = r'$\mathcal{N}(0, 0.2)$') ## \mathcal 表示花样字体
plt.plot(x_values, y3, 'orange', label = r'$\mathcal{N}(-3, 0.5)$')
# 3.指定刻度
plt.yticks(np.arange(0, 1.1, 0.1)) ## 表示Y轴刻度的起始点为0,终点为1.1(不包括1.1),步长为0.1
plt.xticks(np.arange(-6, 7, 1)) ## 表示X轴刻度的起始点为-6,终点为7(不包括7),步长为1
# 4.解决第一个问题
plt.xlim(-6, 6) # 可以理解为严格按设定的长度来显示x轴的作图范围
plt.ylim(0, 1) # 可以理解为严格按设定的长度来显示y轴的作图范围
# 5.解决第二个问题
plt.tick_params(top = True, right = True, direction = 'in')
# 6.添加参数rotation,解决第三个问题
plt.xlabel(r'$x$')
plt.ylabel(r'$f(x)$', rotation = 0)
# 7.添加图例
plt.legend()
# 8.显示图形
plt.show()
❓ 旋转Y轴标签之后,发现标签和刻度有重合,需要继续调整
4️⃣ 3.4 设置标签和刻度,使其不重合
- 可以通过调整ylabel()函数的参数labelpad的取值来解决
plt.ylabel(r'$f(x)$', rotation = 0 , labelpad = 15)
目前为止,我们基本上呈现了一维正态分布的密度图。在此基础上,可以继续添加图形的标题,以及解决图形中添加中文的问题。
✔️最终的代码如下:
# 1.图形的大小,(宽度,高度)
plt.figure(figsize = (10, 6))
# 2.绘制三条密度曲线
plt.plot(x_values, y1, 'green', label = r'$\mathcal{N}(0, 1)$') ## 这里的'$\mathcal{N}(0, 1)$ 中$\mathcal{N}$ 表示的是高斯分布,采用花样字体显示
plt.plot(x_values, y2, 'blue', label = r'$\mathcal{N}(0, 0.2)$') ## \mathcal 表示花样字体
plt.plot(x_values, y3, 'orange', label = r'$\mathcal{N}(-3, 0.5)$')
# 3.指定刻度
plt.yticks(np.arange(0, 1.1, 0.1)) ## 表示Y轴刻度的起始点为0,终点为1.1(不包括1.1),步长为0.1
plt.xticks(np.arange(-6, 7, 1)) ## 表示X轴刻度的起始点为-6,终点为7(不包括7),步长为1
# 4.解决第一个问题
plt.xlim(-6, 6) # 可以理解为严格按设定的长度来显示x轴的作图范围
plt.ylim(0, 1) # 可以理解为严格按设定的长度来显示y轴的作图范围
# 5.解决第二个问题
plt.tick_params(top = True, right = True, direction = 'in') # direction : 'in'、'out'、'inout',分别代表刻度线显示在绘图区内侧、外侧以及同时显示
# 6.添加参数rotation,解决第三个问题
plt.xlabel(r'$x$')
plt.ylabel(r'$f(x)$', rotation = 0 , labelpad = 15)
# 7.添加图例
plt.legend()
# 8.显示图形
plt.show()
注意:本文中数据以及内容若有侵权,请第一时间联系删除。
本文未经作者授权,禁止转载,谢谢配合。