Python——Matplotlib绘制图形(1)

⭕ Matplotlib的官方网站 : Matplotlib — Visualization with Python


目录

📖1、从一个实例中快速了解Matplotlib

🔖解释一下其中代码的一些含义:

📈2、正态分布密度图 

1️⃣生成绘制图形所需要的数据

2️⃣根据正态分布密度的计算公式,自定义函数normal_density(mu. sigma, x)

3️⃣根据定义的函数计算生成图形Y轴所需要的数据

4️⃣使用Matplotlib的plot()函数绘图

 🔖解释其中代码的一些含义

📊3、美化正态密度分布图

☑️ 3.1 设置图形的曲线从原点开始

☑️ 3.2 设置图形的刻度线朝内,并在图形的上方和右方都有刻度标出

☑️ 3.3 设置图形Y轴的标签水平放置

✔️ 所有的代码如下:

☑️ 3.4 设置标签和刻度,使其不重合


📖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)

  • 用于在指定的起始点和结束点之间生成等间隔的数值序列,具体参数解释见下表
字段名称数据类型含义
startint 或 float序列起始值
stopint 或 float序列的结束值
numint要生成的样本数量,默认为50
endpointbool如果为True,则stop 值包含在输出序列中;如果为False,则stop值不包含在输出序列中
retstepbool如果为True,则返回样本之间的步长以及数值序列
dtypeNumPy 数据类型定义输出数组的数据类型
axisint当生成的是多维数组时,这个参数用来指定在哪个轴上使用 linspace

    使用linspace函数生成等间隔的数值数列时,可以发现x轴中是用“2*np.pi”,np.pi表示的是一个        常数的圆周率π,2*np.pi就等同于2π

(2)sin( ) —— 返回正弦值,数值在 -1 到 1 之间

(3)fig, ax = plt.subplots()是Matplotlib库中经常会用到的一个函数,是用于创建新的图形窗口以及对应的子图。返回的figax对象分别代表了一整个图形和其中对应的子图

(4)matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw)

字段名称数据类型含义
nrowsint设置图表的行数,默认为 1
ncolsint设置图表的列数,默认为 1
sharex、sharey-设置 x、y 轴是否共享属性,默认为 false,可设置为 'none'、'all'、'row' 或 'col'。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 'all':所有子图共享 x 轴或 y 轴,'row' 设置每个子图行共享一个 x 轴或 y 轴,'col':设置每个子图列共享一个 x 轴或 y 轴。
squeezebool默认为 True,表示额外的维度从返回的 Axes(轴)对象中挤出,对于 N*1 或 1*N 个子图,返回一个 1 维数组,对于 N*M,N>1 和 M>1 返回一个 2 维数组。如果设置为 False,则不进行挤压操作,返回一个元素为 Axes 实例的2维数组,即使它最终是1x1。
subplot_kwdict可选,把字典的关键字传递给 add_subplot() 来创建每个子图
gridspec_kwdict可选,把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid)
figsizefloat定义图形的宽度和高度,单位为英寸
facecolorstr定义图形背景的颜色
edgecolorstr定义图形边缘颜色
**kwargs-把详细的关键字参数传给 figure() 函数

(5)plt.plot(x,y,fmt='xxx',linestyle=, marker=, color=, linewidth=,markersize=,label=,)

字段名称数据类型含义
x数组类型(如list、tuple等)或可迭代对象定义绘图数据点的x坐标
y数组类型(如list、tuple等)或可迭代对象定义绘图数据点的y坐标
linestylestr表示线的样式,如:'-':实线、'--':虚线、'-.':点划线、':':点虚线
linewidth数值格表示线的粗细,粗细程度和所定数值大小有关
markerstr点的样式,如:'.':点、',':像素、'o':圆形
markersize数值数值,点的大小
colorstr调节线条还有点的颜色,如:'r' :红色、'g':绿色、 'b':蓝色
labelstr指定图例的标签

 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)

字段名称数据类型含义
figsizefolat图形窗口的尺寸,以英寸为单位。第一个值是宽度,第二个值是高度
dpiint设置图形的分辨率,默认值为100
facecolorstr或颜色格式(如:RGB元组)设置图形的背景颜色
edgecolorstr或颜色格式(如:RGB元组)设置图形的边框颜色
linewidthfolat 或 int设置图形边框的线宽
frameonbool设置是否显示图形边框

        代码中,将图形的宽度设置为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与此用法类似

字段名称数据类型含义
tickslist 或 数组 或浮点数序列刻度的位置,可以是一个列表或数组。如果不指定该参数,则默认使用当前图表中的刻度位置
labelslist 或 数组 或字符串序列刻度的标签,可以是一个列表或数组。如果不指定该参数,则默认使用当前图表中的刻度标签
whichstr 用于指定是设置主 x 轴(‘major’)还是次 x 轴(‘mioner)的刻度默认是‘major’
rotationfloat 或 int设置 x 轴刻度标签的旋转角度(以度为单位)
**kwargs-其他可选参数,用于设置刻度标签的字体、颜色等

📍 np.arange([start,] stop[, step,]dtype=None) 

字段名称数据类型含义
startint 或 float可选参数,表示起始值,默认为0
stopint 或 float必需参数,表示终止值,但不包括终止值本身
stepint 或 float可选参数,表示步长,默认为1
dtypestr可选参数,表示所需的数据类型

 plt.xticks(np.arange(-6, 7, 1)) 表示X轴刻度的起始点为-6,终点为7(不包括7),步长为1

📍 plot.xlabel(xlabel, fontdict=None,labelpad=None,**kwargs),ylabel同理

字段名称数据类型含义
xlabelstr标签文本,并且包含字符串值
labelpadfloat标签与坐标轴的距离,默认值为None
rotationfloat 或 int设置标签的方向
**kwargs-这个参数是Text属性,用于控制标签的外观

 plt.xlabel(r'$x$') 表示采用采用斜体输出x

📍 plt.legend(loc,bbox_to_anchor,ncol,title,frameon)

字段名称数据类型含义
locstr 或  int设置图例的位置,如:’best’(自动选择最佳位置,默认值), ‘upper right’(右上角)
bbox_to_anchor元组、列表或BboxBase实例将图例锚定到指定位置的坐标和尺寸,它是一个元组,默认为(None, None)
ncolint设置图例的列数,默认为1。当图例有多个标签时,可以通过设置ncol参数来调整图例的列数,让图例显示得更加整齐
titlestr设置标题
fontsizestr 或 int 或float图例中文字的大小
frameonbool设置图例的是否含有边框
shadowbool是否在图例后面绘制阴影
handlelength、handletextpadfloat分别用于设置图例中标记(handle)的长度和标记与文本之间的间距
labelspacing、columnspacingfloat分别用于设置图例项之间的垂直间距和列之间的水平间距
fancyboxbool是否绘制一个圆角矩形作为图例边框

❓ 从最终绘制得到的图形可发现,与比较常见的图形有些地方不一样,如下:

   (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) —— 更改刻度、刻度标签和网格线的外观
字段名称数据类型含义
axisstr可选参数,设置x轴、y轴以及同时设置。默认值为 ’ both ’可选 {‘ x ‘, ‘ y ‘, ‘ both ‘}
resetbool可选参数,默认为False,若为True,则在处理其他关键字参数之前将所有参数设置为默认值
whichstr可选参数,默认值为“major”,可选{‘major’, ‘minor’, ‘both’}
directionstr可选参数,将刻度置于坐标轴内、轴外,或同时置于两者,可选{‘in’, ‘out’, ‘inout’}
lengthfloat刻度线长度
widthfloat刻度线宽度
color颜色刻度颜色
padfloat刻度和标签之间的距离
labelsizefloat或str刻度标签的字体大小或以字符串,如:“大”
bottom,top,left,rightbool分别表示底部,顶部,左侧,右侧;是否绘制各个方向的刻度线
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()

注意:本文中数据以及内容若有侵权,请第一时间联系删除。

           本文未经作者授权,禁止转载,谢谢配合。

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherry晴

创作不易,多多包涵~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值