matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形
基本绘图
- 绘制折线图
import numpy as np
import matplotlib.pyplot as mp
# xarray: <序列> 水平坐标序列
xarray = np.array{[1,2,3,4,5,6,7,8])
#yarray: <序列> 垂直坐标序列
yarray = np.array([6,17,3,41,36,1,53,12])
mp.plot(xarray,yarray)
mp.show()
- 绘制水平线和垂直线
import numpy as np
import matplotlib.pyplot as mp
# vertical 绘制垂直线::p.vlines(vval, ymin, ymax, ...)
#参数:vval:与x相交的值,ymin:水平线的最低点对应y轴上的值,ymax:水平线的最高点对应y轴的值
mp.vlines(30,2,7)
#绘制多条垂直线,第一个数组为vval,第二个数组为ymin,第三个数组为ymax
mp.vlines([2,3,4,5,6],
[10,20,30,40],
[40,50,60,70]
)
# horizotal 绘制水平线:mp.hlines(xval, xmin, xmax, ...)
#参数:xval:与y相交的值,xmin:水平线的最低点对应x轴上的值,xmax:水平线的最高点对应x轴的值
mp.hlines(30,2,7)
#显示图表
mp.show()
- 绘制正弦曲线和余弦曲线
import numpy as np
import matplotlib.pyplot as mp
#从起始值到终止值按等比例拆1000个元素,所组成的一个数组
#x = np.linespace(起始点,结束点,中间有多少个连成这条曲线)
x = np.linespace(-np.pi,np.pi,1000)
#将数组中的每个元素拿出来求正弦函数值,封装成一个数组
sinx = np.sin(x)
cosx = np.cos(x)
mp.plot(x,sinx)
mp.plot(x,cosx)
mp.show()
- 线型、线宽、颜色
mp.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5)
#参数:
#linestyle:线型:'-' '--' '-.' ':'
#linewidth:线宽:英文颜色单词 或 常见颜色英文单词首字母或css设置颜色方式 或(1,1,1) 或(1,1,1,1)
#color:颜色
#alpha:透明度
- 设置坐标轴刻度
mp.xticks(x_val_list[,x_text_list])
#参数:x_val_list:x轴刻度值序列,x轴标签文本序列(刻度上显示的内容)
mp.yticks(y_val_list[,y_text_list])
#参数:y_val_lsit:y轴刻度值序列,y_text_list:y轴刻度标签文本序列
示例
import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi,np.pi,1000) #设置起始点和终止点,由1000个点组成
sinx = np.sin(x)
cosx = np.cos(x)
mp.plot(x,sinx,linestyle='--',linewidth=2,color='dodgerblue',alpha=0.8)
mp.plot(x,cosx,linestyle='-.',linewidth=2,color='orangered',alpha=0.8)
mp.show()
#设置坐标轴刻度
vals = [-np.pi,-np.pi/2,0,np.pi/2,np.pi]
texts = [r'$-\pi$',r'$-\frac{\pi}{2}$','0',r'$-\frac{\pi}{2}$',r'$-\pi$'] #latex语法,依次表示:pi,pi/2 ,0,pi/2,pi
mp.xticks(vals,texts)
mp.show()
- 设置坐标轴
- 图形窗口设置
mp.plot()默认会创建一个窗口
import matplotlib.pyplot as mp
#手动构建matplotlib窗口,可以构建多个窗口
mp.figure(
'Figure A' #窗口标题
facecolor='gray')
mp.plot([1,2],[3,4]) #对第一个窗口进行绘制
#构建第二个
mp.figure('Figure B',facecolor='lightgray')
mp.plot([1,2],[4,3]) #对第二个窗口进行绘制
#重新调用Figure A窗口,把A窗口置为当前窗口
mp.figure('Figure A')
#设置当前窗口的参数
mp.title(title,fontsize=12)
mp.show()
- 设置当前窗口的参数
# 设置图表标题(和窗口标题区别开) 显示在图表上方
mp.title(title, fontsize=12)
# 设置水平轴的文本(水平轴的主体)
mp.xlabel(x_label_str, fontsize=12)
# 设置垂直轴的文本(垂直轴的主体)
mp.ylabel(y_label_str, fontsize=12)
# 设置刻度参数 labelsize设置刻度字体大小
mp.tick_params(..., labelsize=8, ...)
# 设置图表网格线 linestyle设置网格线的样式
# - or solid 粗线
# -- or dashed 虚线
# -. or dashdot 点虚线
# : or dotted 点线
mp.grid(linestyle='')
# 设置紧凑布局(整理下窗口),把图表相关参数都显示在窗口中,窗口利用率提高
mp.tight_layout()
- 刻度定位器
专门用于管理刻度显示
#获取当前坐标轴
ax = mp.gca()
#设置水平坐标轴的主刻度定位器
#参数:set_major_locator主刻度定位器
#mp.NullLocator:设置不显示主刻度定位器
#mp.MultipleLocator(1)设置主刻度显示为每隔1显示一次
ax.xaxis.set_major_locator(mp.NullLocator())
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
#set_minor_locator:此刻度定位器(小刻度)
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
- 子图(子窗口)
矩阵式布局
绘制矩阵式布局相关API
#手动构建一个matplotlib窗口
mp.figure('Subplot Layout',facecolor='lightgray')
#第一个参数为标题,第二个参数为表面颜色
#绘制子图
mp.subplot(rows,cols,num)
#参数:
#rows:将当前窗口拆成几行
#cols:将当前窗口拆成几列
#num:想画的是第几副图
案例:绘制9宫格矩阵式子图,每个子图中写一个数字
mp.figure('Subplot',facecolor='lightgray')
for i in range(9):
mp.subplot(3,3,i+1) #绘制3*3矩阵格式的子图窗口,每次迭代对第i+1个子图操作
mp.text(
0.5,0.5,i, #在坐标位置(.5,.5)处(就是中点写i
ha = 'center', #水平居中
va = 'center', #垂直居中
size = 36, #i的大小
alpha = 0.5, #透明度
)
mp.xticks([]) #修改横坐标刻度显示为空
mp.yticks([]) #修改横坐标刻度显示为空
mp.tight_layout()
mp.show()
- 图例
在图表中某个位置显示出一个小框,用来显示每根图表线条(曲线)的含义
#绘制曲线时定义曲线的label,否则无法使用图例
mp.plot(xarray,yarray,label='xxx')
#显示图例
mp.legend(loc='')
#参数:
#loc设置图例的显示位置,默认位置为'best',也可以设置其他的
- 特殊点
在图表中绘制出点
#绘制特殊点的API0
# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
mp.scatter(xarray, yarray,
marker='', #点形,有'o''*''D''s'等
s='', #大小
edgecolor='', #边缘色
facecolor='', #填充色
zorder=3, #绘制图层编号(编号越大,图层越靠上)
)
等高线图
组成等高线需要网格点坐标矩阵(用矩阵表示每个点的x,y,z),也需要每个点的高度。所以等高线属于3D数学模型范畴。
#绘制等高线的API
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(
x, #网格坐标矩阵的x坐标 (2维数组)
y, #网格坐标矩阵的y坐标 (2维数组)
z, #网格坐标矩阵的z坐标 (2维数组)
8, # 把等高线绘制成8部分
colors='black', # 等高线的颜色
linewidths=0.5 # 线宽
案例:生成网格坐标矩阵,并且绘制等高线
n = 500
#生成网格化坐标矩阵
x, y = np.meshgrid(np.linspace(-3, 3, n),np.linspace(-3, 3, n))
#参数:
#第一个参数:给出x和y在x轴上的范围,n为生成x和y的数量
#第二个参数:给出x和y在y轴上的范围,n为生成x和y的数量
# 通过x与y,根据以下公式计算z(坐标高度)
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
#画图
#构造窗口
mp.figure('Contour',facecolor='lightgray')
mp.title('Contour', fontsize=20)+
#设置x,y轴标签文本名
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
#设置窗口的刻度的参数,labelsize设置刻度字体大小
mp.tick_params(labelsize=10)
#设置图标网格线 linestyle设置网格线的样式,:为点线
mp.grid(linestyle=':')
#绘制等高线图,参数8为等高线的数量
cntr = mp.contourf(x, y, z, 8, colors='black',linewidths=0.5)
# 为等高线图添加高度标签
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',fontsize=10)
#参数:
#inline_spacing:高度标签文本两侧空格空间
#fmt:高度标签的输出数据格式
mp.show()
散点图
作用:当我们看到整个样本空间是怎样分布的时候,对接下来选择哪种模型是非常有帮助的
通过每个点的坐标、颜色、大小和形状表示不同的特征值(每一个点都是一个样本)
cmap颜色映射条
cmap=‘jet’:数越小越蓝,越大越红
绘制散点图相关API:
mp.sactter(
x, #x轴坐标数组
y, #y轴坐标数组
marker='', #点型
s=10, # 大小
color='', # 颜色
edgecolor='', # 边缘颜色
facecolor='', # 填充色
zorder='' # 图层序号
)
散点图案例
用散点图呈现每个样本的身高、体重,颜色映射条使用jet
import numpy as np
import matplotlib.pyplot as mp
n = 200
#生成200个期望值为175,标准差为7的身高样本数据
x = np.random.normal(175,7,n)
#生成200个体重样本数据
y = np.random.normal(65,10,n)
#创建matplotlib窗口,名字为Pointchart 前景色为ligthgray
mp.figure('Points Chart',facecolor='lightgray')
#给出图表标题和字体大小
mp.title('Point Chart',fontsize=14)
mp.xlabel('Height',fontsize=14)
mp.ylabel('weight',fontsize=14)
mp.grid(linestyle=':')
#定义d数组,存储200个数字,以每个数字的大小去给每个样本点设置颜色,cmap='jet'时数越小越偏蓝,数越大越偏红
d = np.sqrt((x - 175)**2 + (y - 65)**2)
mp.scatter(x,y,marker='o',s=80,alpha=0.8,c=d,cmap='jet',label='Points')
#显示图例
mp.legend()
mp.show()
热成像图
本质:shape为:(xx,xx,1),1(页)表示热度(替代彩图中的3(rgb)),所以热成像图的shape可看作是二维列表(因为第三维就是1(想象是一页纸),和二维能存放的数据量是一样的)
每个像素点表示那个地方的温度(用红外线热成像仪采集)
颜色显示通过cmap参数显示
import numpy as np
import matplotlib.pyplot as mp
#API
mp.imshow(z,cmap='jet',origin='low')
#功能:把矩阵Z图形化
#参数:
#cmap:数值大小的颜色映射
#origin:坐标轴方向
#z:二维数组
3D图像绘制
from mpl_toolkits.mplot3d import axes3d
#使用axes3d提供的3d坐标系
#拿当前坐标系的时候给个参数projection='3d'
ax3d = mp.gca(projection='3d') #class axes3d
matplotlib支持绘制三维点阵(三维散点图),三维曲面(3d平面图),三维线框图
ax3d.scatter(..) # 绘制三维点阵
ax3d.plot_surface(..) # 绘制三维曲面
ax3d.plot_wireframe(..) # 绘制三维线框图
- 3d散点图的绘制API:
ax3d.scatter(
x, # x轴坐标数组
y, # y轴坐标数组
z, # z轴坐标数组
marker='', # 点型
s=10, # 大小
zorder='', # 图层序号
color='', # 颜色
edgecolor='', # 边缘颜色
facecolor='', # 填充色
c=v, # 颜色值 根据cmap映射应用相应颜色
cmap='' #
)
案例:绘制3d散点图
from mpl_toolkits.mplot3d import axes3d
import numpy as np
import matplotlib.pyplot s mp
#x,y,z轴分别生成正态分布的随机数,期望值为0,随机数相对0的标准差为1,随机数数量为300
n = 300
x = np.random.normal(0,1,n)
y = np.random.normal(0,1,n)
z = np.random.normal(0,1,n)
#手动构建matplotlib窗口,窗口名为'3D Scatter',窗口颜色为lightgray
mp.figure('3D Scatter',facecolor='lightgray')
#创建3d坐标系
ax3d = mp.gca(projection='3d')
#设置坐标轴的标签文本名称
ax3d.set_xlabel('x',fontsize=14)
ax3d.set_ylabel('y',fontsize=14)
ax3d.set_zlabel('z',fontsize=14)
#绘制
ax3d.scatter(x,y,z,
marker='o', #点型
s=100, #大小
color='dodgerblue',
alpha=0.5
)
#紧凑显示窗口图表
mp.tight_layout()
#显示
mp.show()
- 3d平面图的绘制API
ax3d.plot_surface(
x, # 网格坐标矩阵的x坐标 (2维数组)
y, # 网格坐标矩阵的y坐标 (2维数组)
z, # 网格坐标矩阵的z坐标 (2维数组)
rstride=30, # 行跨距
cstride=30, # 列跨距
camp='jet' # 颜色映射,jet:数越小越偏蓝越大越红
)
案例:绘制3d平面图
import numpy as np
import matplotlib.pyplot s mp
from mpl_toolkits.mplot3d import axes3d
#生成网格化坐标矩阵
#x在x轴上从-3~3拆n个点,在y轴上从-3~3拆n个点,y也一样
n = 500
x,y =np.meshgrid(np.linspace(-3,3,n),
np.linspace(-3,3,n))
#通过x与y(x与y合起来就是一个个网格点),通过下面的公式(举例子的,可替换)得到每个坐标点的高度z
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
#画图
#创建窗口
mp.figure('3D', facecolor='lightgray')
#创建3d坐标轴
ax3d = mp.gca(projection='3d')
#给出图表标题
mp.title('3D', fontsize=20)
#设置坐标轴的标签文本名
ax3d.set_xlabel('x', fontsize=14)
ax3d.set_ylabel('y', fontsize=14)
ax3d.set_zlabel('z', fontsize=14)
#设置坐标轴的刻度,labelsize设置大小
mp.tick_params(labelsize=10)
#绘制三d平面图
ax3d.plot_surface(x,y,z,rstride=30,cstride=30, cmap='jet')