深度学习--matplotlib语法介绍

matplotlib 使用文档

1.类型目录

  • 绘图类型
函数名称 描述
Bar 绘制条形图
Barh 绘制水平条形图
Boxplot 绘制箱型图
Hist 绘制直方图
his2d 绘制2D直方图
Pie 绘制饼状图
Plot 在坐标轴上画线或者标记
Polar 绘制极坐标图
Scatter 绘制x与y的散点图
Stackplot 绘制堆叠图
Stem 用来绘制二维离散数据绘制(又称为“火柴图”)
Step 绘制阶梯图
Quiver 绘制一个二维按箭头
  • Image函数
函数名称 描述
Imread 从文件中读取图像的数据并形成数组
Imsave 将数组另存为图像文件
Imshow 在数轴区域内显示图像
  • Axis函数
函数名称 描述
Axes 在画布(Figure)中添加轴
Text 向轴添加文本
Title 设置当前轴的标题
Xlabel 设置x轴标签
Xlim 获取或者设置x轴区间大小
Xscale 设置x轴缩放比例
Xticks 获取或设置x轴刻标和相应标签
Ylabel 设置y轴的标签
Ylim 获取或设置y轴的区间大小
Yscale 设置y轴的缩放比例
Yticks 获取或设置y轴的刻标和相应标签
  • figure函数
函数名称 描述
Figtext 在画布上添加文本
Figure 创建一个新画布
Show 显示数字
Savefig 保存当前画布
Close 关闭画布窗口

2.详细介绍

2.1figure图形对象

plt.figure()函数

该函数的参数值,如下所示:

参数 说明
figsize 指定画布的大小,(宽度,高度),单位为英寸。
dpi 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
facecolor 背景颜色。
dgecolor 边框颜色。
frameon 是否显示边框。
from matplotlib import pyplot as plt
#创建一个图形对象
fig=plt.figure()

我们用add_axes()函数方法将轴域 添加到画布fig

ax=fig.add_axes([0,0,1,1]) #实例化轴对象
x=linspace(30,0.1)
y=x**2

add_axes()参数值必须为list,4个值分别对应图形左侧坐标、底部坐标、宽度和高度,且每个数字必须介于[0,1]

设置x,y轴的标签与标题

ax.set_title("sine wave")
ax.set_xlabel("angle")
ax.set_ylabel("sine")

调用axes对象的plot方法,对x、y数组进行绘图操作

ax.plot(x,y)

深度学习--matplotlib语法介绍_第1张图片


2.2.axes类 (轴域对象)

通过add_axes()方法可以将axes对象添加到 figure画布中,对象位置由参数rect决定

rect:4元素float_list,格式为[left,bottom,width,height] 元素∈[0,1],即将figure画布的宽、高作为1个单位

下面介绍axes类其他成员函数,他们在绘图中承担不同的作用

  1. axes类的legend()方法负责绘制画布中的图例

    ax.legend(handle,labels,loc)#legend为axes的方法
    
    • labels字符串list,可以指定label_name

    • loc为图例位置参数,参数值可以用字符串或整数表示

    • handles参数为list,包含所有线型的实例

      ​ 下图为loc参数表示方法

      位置 字符串表示 整数数字表示
      自适应 Best 0
      右上方 upper right 1
      左上方 upper left 2
      左下 lower left 3
      右下 lower right 4
      右侧 right 5
      居中靠左 center left 6
      居中靠右 center right 7
      底部居中 lower center 8
      上部居中 upper center 9
      中部 center 10
  2. axes.plot()

    axes的基本方法,将一个数组的值(x)与另一个数组的值(y)绘制成线或标记,同时具有可选的字符串参数用来指定 线型,标记颜色、样式、大小

    颜色代码如下表:

    ‘b’ 蓝色
    ‘g’ 绿色
    ‘r’ 红色
    ‘c’ 青色
    ‘m’ 品红色
    ‘y’ 黄色
    ‘k’ 黑色
    ‘w’ 白色

    标记符号如下表:

    字符 描述
    ‘-’ 实线
    ‘–’ 虚线
    ‘-.’ 点划线
    ‘:’ 虚线
    ‘H’ 六角标记

    线型表示字符,如下表:

    字符 描述
    ‘-’ 实线
    ‘–’ 虚线
    ‘-.’ 点划线
    ‘:’ 虚线
    ‘H’ 六角标记

    示例:

    import matplotlib.pyplot as plt
    y = [1, 4, 9, 16, 25,36,49, 64]
    x1 = [1, 16, 30, 42,55, 68, 77,88]
    x2 = [1,6,12,18,28, 40, 52, 65]
    fig=plt.figure()#创建画布
    ax=fig.add_axes([0.2,0.2,0.5,0.5])#实例化一个轴域
    #使用简写的形式color/标记符/线型
    l1=ax.plot(x1,y,'ys-')
    l2=ax.plot(x2,y,'go--')
    ax.legend(labels=('tv','Smartphone'),loc='lower right')#legend将出现在右下角
    ax.set_title("ad_effect on products")
    ax.set_xlabel("media")
    ax.set_ylabel("sales")
    plt.show()
    

    深度学习--matplotlib语法介绍_第2张图片

    由上例可以看出,axes轴域基于figure画布对象,而具体画图基于axes对象


2.3.subplot()函数

plt.subplot(nrows,ncols,index)

nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。

如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。

import matplotlib.pyplot as plt
plt.plot([1,2,3])#创建了一个plot折线图
#现在创建一个子图,他表示一个有2行1列的网格的顶部图
#因为这个子图与开始的plot图重叠,所以删除之前的plot图
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(212,facecolor='y')
plt.plot(range(12))

深度学习--matplotlib语法介绍_第3张图片

上述表明,若subplot()中的第一个参数行列相同,则在该子图划分区域基础上进行画图,若不同,则如所示

import matplotlib.pyplot as plt
plt.plot([1,2,3])#创建了一个plot折线图
#现在创建一个子图,他表示一个有2行1列的网格的顶部图
#因为这个子图与开始的plot图重叠,所以删除之前的plot图
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(222,facecolor='y')
plt.plot(range(12))

深度学习--matplotlib语法介绍_第4张图片

之前创建的子图格式(2行1列)被删除,变成了如上图所示的2行2列

如果不想覆盖之前的图,可以如下措施

  • 采取add_subplot()函数
import matplotlib.pyplot as plt
fig=plt.figure()#创建画布
ax1=fig.add_subplot(111)
ax1.plot([1,2,3])
ax2=fig.add_subplot(221,face_color='y')
ax2.plot([1,2,3])
#上述画布同时存在了两种不同的子图格式

深度学习--matplotlib语法介绍_第5张图片

结果表明,通过add_subplot()方法,可以在同一画布同时存在多种不同的子图格式

  • 采用axes对象实现
import matplotlib.pyplot as plt
import numpy as np
import math
x=np.arange(0,math.pi*2,0.05)
fig=plt.figure()#创建画布
axes1=fig.add_axes([0.1,0.1,0.8,0.8])#main axes
axes2=fig.add_axes([0.55,0.55,0.3,0.3])#inset axes
y=np.sin(x)
axes1.plot(x,y,'b')
axes2.plot(x,np.cos(x),'r')
axes1.set_title('sine')
axes2.set_title('cosine')
plt.show()

深度学习--matplotlib语法介绍_第6张图片

操作区别:

画布
plot折线图
axes轴对象

2.4.subplots()函数

区别:subplots函数既创建了一个包含子图区域的画布,又创建了一个figure图形对象,而subplot()只创建一个包含子图区域的画布

subplots函数格式:

fig,ax=plt.subplots(nrow,ncols)

返回值是tuple,包含一个图形对象和所有的axes对象。axes数量=nrows*ncols,且每个axes对象均可以通过索引值访问(从1开始)

import matplotlib.pyplot as plt
fig,a =  plt.subplots(2,2) #a相当于轴区域数组  fig为figure画布
import numpy as np
x = np.arange(1,5)
#绘制平方函数
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
#绘制平方根图像
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('square root')
#绘制指数函数
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
#绘制对数函数
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()

2.5.subplot2grid()函数

subplot2grid()与subplots()和subplot()函数不同,该函数可以非等分切分画布

语法:

plt.subplot2grid(shape,location,rowspan,colspan)

参数含义如下:

  • shape:把该参数值规定的网格区域作为绘图区域;
  • location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
  • rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。

下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:

import matplotlib.pyplot as plt
#使用 colspan指定列,使用rowspan指定行
a1 = plt.subplot2grid((3,3),(0,0),colspan = 2)
a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
import numpy as np
x = np.arange(1,10)
a2.plot(x, x*x)
a2.set_title('square')
a1.plot(x, np.exp(x))
a1.set_title('exp')
a3.plot(x, np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()

深度学习--matplotlib语法介绍_第7张图片


2.6.grid()设置网格格式

grid()函数可以 1.开启/关闭画布网格 2.设置网格颜色、线型、线宽等属性

使用格式:

grid(color='b',Is='-',lw=0.25)

参数含义如下:

  • color:表示网格线的颜色;
  • ls:表示网格线的样式;
  • lw:表示网格线的宽度;

网格默认关闭,若调用上述函数,网格会自动打开,如果只想开启网格不需要格式调整,使用grid(True)

import matplotlib.pyplot as plt
import numpy as np
#fig画布,axes子图区域
fig,axes=plt.subplots(1,3,figsize=(12,4))
x=np.arange(1,11)
#开启axes[0]的轴域网格
axes[0].grid(True)
axes[0].set_title('default grid')
axes[0].plot(x,x**3,'g',lw=2)
axes[1].plot(x,np.exp(x),'r')
#设置axes[1]轴域的网格颜色、线型、线宽
axes[1].grid(color='b',ls='-',lw=0.25)
axes[1].set_title('custom grid')
axes[2].plot(x,x)
axes[2].set_title('no grid')
fig.tight_layout()#自动调整子图大小,使之充满整个图像区域,部分情况下不工作
plt.show()

深度学习--matplotlib语法介绍_第8张图片


2.7.设置坐标轴格式

1.axes.set_xscale() or axes.set_yscale()

有时x与y是指数对应关系,这时候需要将坐标轴刻度设置为对数刻度

上述通过axes对象中的 xscale或 yscale属性实现对坐标轴的格式设置

示例:下面左侧子图显示标量刻度,右侧子图显示对数刻度

import matplotlib.pyplot as plt
import numpy as np
frg,axes=plt.subplots(1,2,figsize=(10,4))
x = np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title("Normal scale")
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
#设置y轴
axes[1].set_yscale('log')#将y的刻度设为log型
axes[1].set_title('Logarithmic scale(y)')
#设置label
axes[0].set_xlabel('x axis',labelpad=10)#labelpad用于设置label显示位置
axes[0].set_ylabel('y axis')
axes[1].set_xlabel('x axis')
axes[1].set_ylabel('y axis')
plt.tight_layout()
plt.show()

深度学习--matplotlib语法介绍_第9张图片

2.axes.spines[‘’].set_color() or axes.spines[‘’].set_linewidth()

在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。可以指定轴的宽度和颜色(None为无色,即不显示轴)

以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:

import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
#为 左侧、底部轴添加颜色
ax.spines['buttom'].set_color('blue')
ax.spines['left'].set_color('red')
ax.spines['left'].set_linewidth(2)
#将右侧、顶部轴设为None
ax.spines['right'].set_color(None)
ax.spines['top'].set_color(None)
ax.plot([1,2,3,4,5])
plt.show()

深度学习--matplotlib语法介绍_第10张图片


2.8.坐标轴范围

matplotlib可以根据x、y范围自动设置轴的范围大小,但我们也可以通过set_xlim()、set_ylim()对进行轴的范围自定义设置

  1. matplotlib自动设置
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
a1=fig.add_axes([0.1,0.1,0.7,0.7])
x=np.arange(1,10)
a1.plot(x,np.exp(x))
a1.set_title('exp')
plt.show()

深度学习--matplotlib语法介绍_第11张图片

​ 2.自定义设置 set_xlim()将范围设到(0,10)、set_ylim()将范围设到(0,10000)

import matplotlib.pyplot as plt
fig=plt.figure()
a1=fig.add_axes([0,0,1,1])
import numpy as np
x=np.arange(1,10)
a1.plot(x,np.exp(x),'r')
a1.set_title('exp')
#设置x,y轴
a1.set_xlim(1,10)
a1.set_ylim(0,10000)
plt.show()

深度学习--matplotlib语法介绍_第12张图片


2.9.设置刻度和刻度标签

刻度指 轴上数据点的标记,Matplotlib可以自动在x、y轴上绘制出刻度(得益于内置的刻度定位器和格式化器

xticks()和yticks()函数参数:list,list中的元素表示对应数轴上要显示的刻度

ax.set_xticks[(2,4,6,8,10)]

此时x轴的刻度标签分别为(2,4,6,8,10),我们也可以采取set_xticklabels()和set_yticklabels()函数重新需设置刻度标签,但刻度不会改变

下面的示例对刻度和刻度标签的使用方法进行说明

import matplotlib.pyplot as plt
import numpy as np
import math
x=np.arange(0,math.pi*2,0.05)
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.7,0.7])
y=np.sin(x)
ax.plot(x,y)
#设置x轴标签
ax.set_xlabel('angle')
ax.set_title('sine')
ax.set_xticks([0,2,4,6])#x刻度为[0,2,4,6]
ax.set_xticklabels(['zero','two','four','six'])#只修改刻度相应的label
#设置y轴标签
ax.set_yticks([-1,0,1])
plt.show()

深度学习--matplotlib语法介绍_第13张图片


3.图像种类介绍

①双轴图

有时候需要两个x轴或两个y轴表述数据关系,采用twinx()和twiny()函数实现

twinx()和twiny()函数除了绘制双轴,还可以用不同的单位来绘制曲线,比如一个y轴为对函数,一个y轴为指数函数

下面示例具有两个y轴的图像,左侧为exp(x),右侧为log(x)

import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
a1=fig.add_axes([0.1,0.1,0.7,0.7])
x=np.arange(1,11)
a1.plot(x.np.exp(x))
a1.set_ylabel('exp')
#添加双轴
a2=a1.twinx()#在a1的轴域内进行轴的添加
#'ro'代表红色圆点
#绘制对数函数
a2.plot(x,np.log(x),'ro-')
#设置y2的label
a2.set_ylabel('log')
#绘制legend图例
fig.legend(labels=('exp','log'),loc=0)
plt.show()
#此处只有fig.legend才能两个都显示在图例中

深度学习--matplotlib语法介绍_第14张图片

②折线图(line chart)

  1. 绘制单条折线
import matplotlib.pyplot as plt
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x,y,'g',marker='D',markersize=5,label='周活')
#绘制坐标轴标签
plt.xlabel('loaded_time')
plt.ylabel('user_activity')
plt.title('the website activity')

plt.legend('loc=lower right')

#下面,我们可以调用 plt.text()函数在图像上绘制注释文本
#x1,y1 代表文本坐标位置 ha参数控制水平对齐方式,va控制垂直对齐方式,str(y1)表示绘制的

for x1,y1 in zip(x,y):
    plt.text(x1,y1,str(y1),ha='center',va='bottom',fontsize=10)
plt.show()

深度学习--matplotlib语法介绍_第15张图片

上面例子的legend 通过plt.plot(label)直接实现

2.绘制多条折线图

下面给出两天同一时刻,天气T随time变化的折线图:

import matplotlib.pyplot as plt
#对比两天内同一时刻温度的变化情况
x = [5, 8, 12, 14, 16, 18, 20]
y1 = [18, 21, 29, 31, 26, 24, 20]
y2 = [15, 18, 24, 30, 31, 25, 24]

# * 表示绘制五角星;此处也可以不设置线条颜色,matplotlib会自动为线条添加不同的颜色
plt.plot(x,y1,'r',marker='*',markersize=10,label='frist day')
plt.plot(x,y2,'b',marker='*',markersize=10,label='next day')
plt.title('Tem_difference')
plt.xlabel('time(h)')
plt.ylabel('T(℃)')

#绘制注释
for x,y in zip(x,y1):
    plt.text(x,y,y,ha='center',va='bottom',fontsize=10)
    
for x,y in zip(x,y2):
    plt.text(x,y,y,ha='center',va='bottom',fontsize=10)

plt.show()

深度学习--matplotlib语法介绍_第16张图片

此处结果图借用 Matplotlib折线图(绘图实例+代码详解) (biancheng.net) ,自行实现时,zip()出错,原因暂时不明

③等高线图

等高线图(水平图) 是一种 在2D上显示3D图像的方法

等高线有时也成为 “Z切片”

通过numpy.meshgrid()函数将x、y数组构造成一个网格点矩阵

matplotlib API 提供了绘制等高线(contour) 与 **填充等高线 (contourf)**的函数。这两个函数都需要三个参数,分别是(X,Y,Z),表示x范围的颜色柱 基于contour定义的对象实现

import numpy as np
import matplotlib.pyplot as plt
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X,Y=np.meshgrid(xlist,ylist)
#定义Z与X、Y的关系
Z=np.sqrt(X**2+Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线
cp=ax.contourf(X,Y,Z)
fig.colorbar(cp)#右侧添加表示x取值的颜色柱
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x(cm)')
ax.set_ylabel('y(cm)')
#绘制等高线
plt.contour(X,Y,Z)#绘制等高线,减少边界锐化程度?
plt.show()

左侧图像绘制了两个变量 X、Y ,右侧的颜色柱(colorbar)则表示 X 的取值,颜色越深表示值越小,中间深色部分的圆心点表示 x=0,y=0,z=0。

1.ax.contourf(X,Y,Z)、2.plt.contour(X,Y,Z)的区别通过下图展示:

1.深度学习--matplotlib语法介绍_第17张图片

2.深度学习--matplotlib语法介绍_第18张图片

④绘制文本(文字、箭头、图形等)

text 在绘图区域的任意位置添加文本。
annotate 在绘图区域的任意位置添加带有可选箭头的注释
xlabel 在绘图区域的 x 轴上添加标签。
ylabel 在绘图区域的 y 轴上添加标签。
title 为绘图区域添加标题。
figtext 在画布的任意位置添加文本。
suptitle 为画布中添加标题。
  1. text()函数绘制文本
plt.text(x,y,string,weight='bold',color='b')
#weight:注释文本内容的粗细风格

​ 2.annotate()函数 用于绘制箭头

​ xy为箭头终端,xytext()为箭头起始 arrowprops为dict,用于设置箭头的格式

深度学习--matplotlib语法介绍_第19张图片

可以设置箭头的形状等

深度学习--matplotlib语法介绍_第20张图片

connectionstyle的属性值有

深度学习--matplotlib语法介绍_第21张图片

ax.annotate(string, xy = (,), xytext = (, ),arrowprops = dict(facecolor = string, shrink =,addrowstyle="箭头形状",connectionstyle="例如arc3"))

例子:

import matplotlib.pyplot as plt
fig = plt.figure()
#添加绘图区域
ax = fig.add_axes([0.1,0.1,0.7,0.7])
#设置格式
ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
# 3,8 表示x,y的坐标点;style设置字体样式为斜体;bbox用来设置盒子的属性,比如背景色
ax.text(3, 8, 'i am here', style='italic',bbox = {'facecolor': 'yellow'},fontsize=15)
#绘制数学表达式,用$符包裹
ax.text(2, 6, r'an equation: $E = mc^2$', fontsize = 15)
#添加文字,并设置样式
ax.text(4, 0.05, 'now i am here',verticalalignment = 'bottom', color = 'green', fontsize = 15)
ax.plot([2], [1], 'o')#绘制一个圆
#xy为点的坐标;xytext为注释内容坐标;arrowprops设置箭头的属性
ax.annotate('circle', xy = (2, 1), xytext = (3, 4),arrowprops = dict(facecolor = 'blue', shrink = 0.1))
#设置坐标轴x,y
ax.axis([0, 10, 0, 10])
plt.show()

深度学习--matplotlib语法介绍_第22张图片

⑤数学表达式

数学表达式语法:

plt.title(r'$\alpha>\beta$')

绘制小标和上标需要使用’_‘,’^'示例

#绘制表达式 r'$\alpha_i>\beta_i$'
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
plt.plot(t,s)
#设置标题
plt.title(r'$\alpha_i>\beta_i$',fontsize=20)
#设置数学表达式
plt.text(0.6,0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)
#设置数学表达式
plt.text(0.1,-0.5, r'$\sqrt{2}$', fontsize=10)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

深度学习--matplotlib语法介绍_第23张图片


结语:如有错误,望指正

你可能感兴趣的:(matplotlib,动手学深度学习,matplotlib,深度学习,python)