人工智能入门--Matplotlib

@(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()

二 图形对象

  1. 具体写法:

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()
  1. 图型

    1. 子图

      ​ 创建子图 ,大图里创建子图

      1. 缺省( 默认 ) 布局

      ​ mp.subplot( 行数,列数,图号 )

      ​ 列: mp.subplot( 2 , 3 , 1) 或mp.subplot( 231)

      ​ 1.1 子图显示文字

      ​ mp.text(对应中心位置的比例,对应中心位置的比例,数值,ha=水平对齐方式居中,va=水平 对齐方式居中,size=尺寸大小,alpha=透明度)

      ​ mp.tight_layout() #让刻度紧凑,不空很多格,边距变窄

      1. 栅格布局

      ​ import matplotlib.gridspec as mg

      ​ gs = mg.GridSpec( 行数,列数 ) #栅格布局器

      ​ mp.subplot(gs[ 行,列 ])

      1. 自由布局

      ​ 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()
    2. 坐标刻度定位器

      定位器对象 = 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()
    3. 散点图

      散点图的意义:

      ​ 可以让一个点附带跟多信息

      ​ 总是要两个坐标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='dodgerblue',alpha=0.5)
      mp.fill_between(x,cos_y,sin_y,cos_y>sin_y,color='orangered',alpha=0.5)
      mp.legend()
      mp.show()
    4. 柱状图(条形图)

      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=标签文本 )

    5. 饼图

      mp.pie( 值,间隙,标签,颜色,格式,shadow=是否带阴影,startangle=起始角度 )

    6. 等高线图

      用途:用二维的图形来展示三维的数据,多用在地理中
      mp.contour(x,y,z,线数,colors=颜色,linewidths=线宽) :一根根线
      mp.contourf(x,y,z,线数,cmap=颜色映射):一根根色带
      注:n个线数,n个间隔,间隔越多,色带越密集
      import numpy as np
      import matplotlib.pyplot as mp

      n=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]])]
      '''

猜你喜欢

转载自www.cnblogs.com/clove7/p/11536401.html