目录
- 一 matplotlib库 (数学绘图库)
- mat 数学 plot 绘图 lib 库
- 定制化绘图:
- 看手册功能:
- 引十字坐标
- 显示图例和位置
- 标记一些特殊的点
- 图上做注释
- 二 图形对象
@(Matplotlib之数据可视化)
一 matplotlib库 (数学绘图库)
mat 数学 plot 绘图 lib 库
.matplotlib.pyplot( 缩写mp )
.mp.plot( 水平坐标 ,垂直坐标数组 )
X : [ 1 2 3 4 ]
Y : [ 5 6 7 8 ]
. mp.plot( X , Y )
定制化绘图:
.mp.plot( xxx , linestyle=线型 , linewidth = 线宽 , color = 颜色)
看手册功能:
设置图标范围:
.mp . xlim( 左边界 , 右边界 )
.mp . ylim( 底边界 , 顶边界 )
如果设置最大最小值,则全部填满
显示弧度值:
.mp.xticks( 刻度位置数组 , 刻度文本数组 )
.mp.yticks( 刻度位置数组 , 刻度文本数组 )
刻度文本数组转义字符串写法:
[ r'$-\pi$', r'$-\frac{分子}{分母}$', r'$0$']
引十字坐标
作用: 拿到框线的轴
ax=mp.gca( ) #获取当前坐标轴
ax.spines [ 'left' ].set_position( ( 'data',0 ) ) #设置位置
ax.spines [ 'left' ].set_color( 颜色 ) #设置位置边框颜色
显示图例和位置
mp.plot( ''' , laber=r'$y=sin(x)$' ) #显示图例
mp.legend(loc='upper left') #左上
标记一些特殊的点
散点图(不连线)
mp.scatter( 水平坐标数组,垂直坐标数组,marker=点型 ,s=大小,edgecolor=勾边色,facecolor=填充色,zorder=Z 序 )
Z 序就是绘图的顺序 ,zerder数越大,点越晚压在线上
Matplotlib绘图顺序是先画点 再画线
图上做注释
mp.annotate( 备注文本,xy=目标位置, xycoords=目标坐标系, xytext=文本位置,Textcoords=文本坐标系 , fontsize = 字体大小, arrowprops = 箭头属性 )
import numpy as np
import matplotlib.pyplot as mp
x=np.linspace(-np.pi,np.pi,1000) # 线性空间的划分
cos_y = np.cos(x)/2
sin_y = np.sin(x)
xo = np.pi*3/4
yo_cos = np.cos(xo)/2
yo_sin = np.sin(xo)
mp.xlim(x.min(),x.max()) # 最小值做左边界 最大值做右边界
mp.ylim(sin_y.min(),sin_y.max())
mp.xticks([-np.pi,-np.pi / 2,0,np.pi/2,np.pi*3/4,np.pi],[r'$-\pi$',r'$-\frac{\pi}{2}$',
r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$'])
mp.yticks([-1,-0.5,0,0.5,1])
ax=mp.gca() #得到边框 ↓对边框的设置
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
ax.spines['right'].set_color(('none'))
ax.spines['top'].set_color(('none'))
# linestyle='-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
mp.scatter([xo,xo],[yo_cos,yo_sin],s=60,edgecolors='limegreen',facecolor='white',zorder=3)
mp.annotate(r'$\frac{1}{2}cos(\frac{3\pi}{4})= -\frac{\sqrt{2}}{4}$',xy=(xo,yo_cos),xycoords='data',
xytext=(-90,-40),textcoords='offset points',fontsize=14,arrowprops=dict(arrowstyle='->',
connectionstyle='arc3,rad=.2')) #rad 控制备注线条的弯度
mp.annotate(r'$sin(\frac{3\pi}{4})=-\frac{\sqrt{2}}{2}$',xy=(xo,yo_sin),xycoords='data',
xytext=(20,20),textcoords='offset points',fontsize=14,arrowprops=dict(arrowstyle='->',
connectionstyle='arc3,rad=.2'))
mp.plot([xo,xo],[yo_cos,yo_sin],linestyle='-',linewidth=1,color='dodgerblue')
mp.plot(x,cos_y,linestyle='-.',linewidth=2,color='dodgerblue',label=r'$y=cos(x)$')
mp.plot(x,sin_y,linestyle='--',linewidth=2,color='green',label=r'$y=sin(x)$')
mp.legend(loc='upper left')
mp.show()
二 图形对象
具体写法:
mp.figure( 图像对象名 , figsize = 窗口大小, dpi= 分辨率, facecolor = 填充色 )
mp.figure()方法: 第一次调用是创建,第二次创建为再次置为当前窗口
mp.title( ' 标题名 ',fontsize=20 ) 写标题
mp.xlaber('x',fontsize=12) 坐标轴的标签 前半部分为标签名字,后半部分为字体大小
mp.ylabel('y',fontsize=12)
mp.tick_params( labelsize = 10) 设置刻度参数 刻度值两个间隔为10
mp.grid( linestyle=' : ' )设置格线
linestyle= '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
例:
import numpy as np
import matplotlib.pyplot as mp
x=np.linspace(-np.pi,np.pi,1000)
cos_y = np.cos(x)/2
sin_y = np.sin(x)
mp.figure('Figure Object1',figsize=(6,4),dpi=120,facecolor='lightgray') #宽 8 高 6
mp.title('Figure Object1',fontsize='16')
mp.xlabel('x',fontsize=18)
mp.ylabel('y',fontsize=18)
mp.tick_params(labelsize=10) #设置刻度参数 刻度值两个间隔为10
mp.grid(linestyle=':')
mp.figure('Figure Object1')
mp.plot(x,cos_y,label=r'$y=\frac{1}{2}cos(x)$')
mp.legend()
mp.figure('Figure Object2',figsize=(6,4),dpi=120,facecolor='lightgray') #宽 8 高 6
mp.title('Figure Object2',fontsize='16')
mp.xlabel('x',fontsize=18)
mp.ylabel('y',fontsize=18)
mp.tick_params(labelsize=10) #设置刻度参数 刻度值两个间隔为10
mp.grid(linestyle=':')
mp.figure('Figure Object2')
mp.plot(x,sin_y,label=r'$y=sin(x)$')
mp.legend()
mp.show()
图型
子图
创建子图 ,大图里创建子图
- 缺省( 默认 ) 布局
mp.subplot( 行数,列数,图号 )
列: mp.subplot( 2 , 3 , 1) 或mp.subplot( 231)
1.1 子图显示文字
mp.text(对应中心位置的比例,对应中心位置的比例,数值,ha=水平对齐方式居中,va=水平 对齐方式居中,size=尺寸大小,alpha=透明度)
mp.tight_layout() #让刻度紧凑,不空很多格,边距变窄
- 栅格布局
import matplotlib.gridspec as mg
gs = mg.GridSpec( 行数,列数 ) #栅格布局器
mp.subplot(gs[ 行,列 ])
- 自由布局
mp.axes( [ 左下角水平坐标,左下角垂直坐标,宽度,高度] )
优点: 所以尺寸参数都是相对比例
缺点: 同时输入几个,最后一张图能在另一张里面
import matplotlib.pyplot as mp # ====方式一========= mp.figure(facecolor='lightgray') for i in range(2): #2代表2行 for j in range(3): # 3 代表3 列 k =i*3+j+1 # mp.subplot(2, 3, 1) 2行3列 1张 mp.subplot(2,3,k) mp.xticks(()) #不带刻度线值 mp.yticks(()) mp.text(0.5,0.5,str(k),ha='center',va='center', #ha水平 居中 ,va 垂直 居中 size=36,alpha=0.5) mp.tight_layout() #让刻度紧凑,不空很多格,边距变窄 mp.show() # =====方式二====== 栅格布局 import matplotlib.gridspec as mg mp.figure(facecolor='blue') gs = mg.GridSpec(3,3) #栅格布局器 3行3列 mp.subplot(gs[0,:2]) # 0 代表第0行 :2 代表前2列 mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'1',ha='center',va='center',size=36,alpha=0.5) #ha水平 居中 ,va 垂直 居中 mp.subplot(gs[1:,0]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'2',ha='center',va='center', size=36,alpha=0.5) #ha水平 居中 ,va 垂直 居中 mp.subplot(gs[:2,2]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'3',ha='center',va='center',size=36,alpha=0.5) #ha水平 居中 ,va 垂直 居中 mp.subplot(gs[2,1:]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'4',ha='center',va='center', size=36,alpha=0.5) #ha水平 居中 ,va 垂直 居中 mp.subplot(gs[1,1]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'s',ha='center',va='center', size=36,alpha=0.5) #ha水平 居中 ,va 垂直 居中 mp.tight_layout() mp.show() # ======方式三=======自由布局 mp.figure(facecolor='blue') mp.axes([0.3,0.3,0.8,0.9]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'1',ha='center',va='center', size=36,alpha=0.5) mp.axes([0.001,0.001,0.7,0.7]) mp.xticks(()) mp.yticks(()) mp.text(0.5,0.5,'2',ha='center',va='center', size=36,alpha=0.5) mp.show()
坐标刻度定位器
定位器对象 = mp.xxxLocator(''')
ax = mp.gca()
主刻度: ax.xaxis.set_major_locator( 定位器对象 ) # x轴,让定位器对象帮我们定义刻度
次刻度: ax.xaxis.set_minor_locator( 定位器对象 ) # x轴,让定位器对象帮我们定义刻度
import numpy as np import matplotlib.pyplot as mp mp.figure() locators=['mp.NullLocator()', #空定位器. 不需要参数 'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])',#最多分三段,从后续列表中选一个等分的点 'mp.FixedLocator(locs=[0,2,5,5,7.6,10])', #固定定位器 等价于直接调用xticks 'mp.AutoLocator()', #自动定位器, 特点:间隔不太密 也不太稀疏,自动匹配 'mp.IndexLocator(offset=0.5,base=1.5)', #索引定位器.offset起始点,base是间隔 'mp.MultipleLocator()', #次刻度定位器 'mp.LinearLocator(numticks=21)', #线性均分定位器, 等分21-1份 'mp.LogLocator(base=2,subs=[1.0])' #指数定位器, base倍数 是2 间隔是 1 ] n_locators=len(locators) #查看有多少个刻度定位器 # 循环放在不同的图里 for i,locator in enumerate(locators): mp.subplot(n_locators,1,i+1) mp.xlim(0,10) mp.ylim(-1,1) mp.xticks(()) mp.yticks(()) ax = mp.gca() ax.spines['left'].set_color('red') ax.spines['top'].set_color('red') ax.spines['right'].set_color('red') ax.spines['bottom'].set_position(('data',0))# 底轴放中间因为 从 1 到-1 0 在中间 ax.xaxis.set_major_locator(eval(locator)) #eval函数解释执行 产生类的对象,主刻度执行器 ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1)) #次刻度定位 0.1为间隔 mp.plot(np.arange(11),np.zeros(11),c='none') #zeros是全零 ,y坐标 mp.text(5,0.3,locator[3:],ha='center',size=16) mp.tight_layout() mp.show()
散点图
散点图的意义:
可以让一个点附带跟多信息
总是要两个坐标x,y来表示
x=np.random.normal(0,1,n) #这是正态分布规律的随机数
0 平均值μ
1 标准差σ σ值越大越集中,平坦 σ值越小越瘦高
n 个数
import numpy as np import matplotlib.pyplot as mp n=1000 x=np.random.normal(0,1,n) y=np.random.normal(0,1,n) d=np.sqrt(x **2 +y**2) #距离正下方的点 mp.figure('Scatter',facecolor='lightgray') mp.title('Scatter',fontsize=20) mp.xlabel('x',fontsize=14) mp.ylabel('y',fontsize=14) mp.tick_params(labelsize=10) #标签文本字体大小 mp.grid(linestyle='-.') #设置网格线 mp.scatter(x,y,s=60,c=d,cmap='jet_r',alpha=0.5) #c=d,cmap='jctr'是用距离来做颜色,cmap是颜色映射,颜色和距离对应 s是尺寸60 mp.show()
区域填充
mp.fill_between( 水平坐标数组,垂直坐标数组, 垂直坐标终点数组, 条件, color=颜色, alpha=透明度 )
import numpy as np import matplotlib.pyplot as mp n=1000 x=np.linspace(0,8*np.pi,n) sin_y=np.sin(x) cos_y=np.cos(x/2)/2 mp.figure('Fill',facecolor='lightgray') mp.title('Fill',fontsize=20) mp.xlabel('x',fontsize=14) mp.ylabel('y',fontsize=14) mp.tick_params(labelsize=10) #标签文本字体大小 mp.grid(linestyle='-.') #设置网格线 mp.plot(x,sin_y,c='dodgerblue',label=r'$y=sin(x)$') mp.plot(x,cos_y,c='orangered',label=r'$y=\frac{1}{2}cos(\frac{x}{2})$') mp.fill_between(x,cos_y,sin_y,cos_y
sin_y,color='orangered',alpha=0.5) mp.legend() mp.show() 柱状图(条形图)
mp.bar( 水平坐标数组,高度数组,ec=边缘颜色,fc=填充颜色,label=标签文本,alpha=透明度 )
y1=np.random.uniform( 0.5,1.0,n ) #在0.5到1.0之间产生n个随机数
import numpy as np import matplotlib.pyplot as mp n = 12 x = np.arange(n) y1 = (1 - x / n) * np.random.uniform(0.5, 1.0, n) y2 = (1 - x / n) * np.random.uniform(0.5, 1.0, n) mp.figure('Bar', facecolor='lightgray') mp.title('Bar', fontsize=20) mp.ylim(-1.25, 1.25) mp.xlabel('x', fontsize=14) mp.ylabel('y', fontsize=14) mp.xticks(x, x + 1) mp.tick_params(labelsize=10) # 标签文本字体大小 mp.grid(axis='y', linestyle='-.') # 设置网格线 只有水平方向的 for _x, _y in zip(x, y1): # 取矩形条的位置和宽度,显示文字,两位小数精度的浮点数来表示格式化占位符 mp.text(_x, _y, '%.2f' % _y, ha='center', va='bottom') for _x, _y in zip(x, y2): mp.text(_x, -_y - 0.015, '%.2f' % _y, ha='center', va='bottom') mp.bar(x,y1,ec='white',fc='dodgerblue',label='Sample 1') mp.bar(x,-y2,ec='white',fc='yellow',alpha=0.5,label='Sample 2') mp.legend() mp.show()
方式二: mp.bar( 水平坐标,高度,宽度,color=颜色,alpha=透明度,label=标签文本 )
饼图
mp.pie( 值,间隙,标签,颜色,格式,shadow=是否带阴影,startangle=起始角度 )
等高线图
用途:用二维的图形来展示三维的数据,多用在地理中
mp.contour(x,y,z,线数,colors=颜色,linewidths=线宽) :一根根线
mp.contourf(x,y,z,线数,cmap=颜色映射):一根根色带
注:n个线数,n个间隔,间隔越多,色带越密集
import numpy as np
import matplotlib.pyplot as mpn=1000
x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n)) #meshgrid把网格线分成999份,每行在-3到3之间
z=(1-x/2+x5+y3)*np.exp(-x2-y2) #结果是一个空间曲面mp.figure('Contour',facecolor='lightgray')
mp.title('Contour',fontsize=20)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')颜色填充等高线
mp.contourf(x,y,z,8,cmap='jet')
cntr=mp.contour(x,y,z,8,colors='black',linewidths=0.5)
mp.clabel(cntr,inline_spacing=1,fmt='%.1f',fontsize=10) #填数字
mp.show()meshgrid函数:适用于网格型数据,它可接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对
meshgrid作用是根据传入的两个一维数组参数生成两个数组元素的列表二维坐标中,x轴取三个值1,2,3,y轴取两个值7,8
可以获得(1,7) (2,7) (3,7) (1,8) (2,8) (3,8)
import numpy as np
坐标向量
a=np.array([1,2,3])
b=np.array([7,8])从坐标向量中返回坐标矩阵
返回一个list,第一个元素就是x轴的取值,第二个元素就是y轴的取值
res=np.meshgrid(a,b)
print(res)
a=np.arange(5) b=np.arange(6) datalist=np.meshgrid(a,b) print(datalist) ''' [array([[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]), array([[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]])] '''