• 数据分析(绘图)


    matplotlib概述

      matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形。

    matplotlib基本功能

      (一)基本绘图 (在二维平面坐标系中绘制连续的线)

      1.设置线型、线宽和颜色

    import numpy as np
    import matplotlib.pyplot as mp
    
    # xarray: <序列> 水平坐标序列
    # yarray: <序列> 垂直坐标序列
    mp.plot(xarray, yarray)
    #显示图表
    mp.show()

      (1)绘画折线图,水平线/垂直线

    import numpy as np
    import matplotlib.pyplot as mp
    
    # vertical 绘制垂直线
    mp.vlines(vval, ymin, ymax)#列的位置,起点坐标y,终点坐标y
    # horizotal 绘制水平线
    mp.hlines(xval, xmin, xmax)#行的位置,起点坐标x,终点坐标x
    #显示图表
    mp.show()

      

    #基本绘图
    
    import numpy as np
    import matplotlib.pyplot as mp
    
    xarray = np.arange(8)
    yarray = np.array([64,89,12,36,49,80,45,34])
    #绘制折线图
    mp.plot(xarray,yarray)
    #绘制水平线
    mp.hlines(40,1,7)
    # mp.hlines([10,20,30,50],1,7)
    mp.hlines([10,20,30,50],[1,2,4,5],[7,5,4,3])#行的位置  起点位置 终点位置
    #绘制垂直线
    mp.vlines(4,20,80)
    mp.show()

      (2)画一条正弦曲线,余弦曲线

    #linestyle: 线型   "-"  "--"  ":"  ".-"
    #line 线宽
        #    数字
    #color: <关键字参数> 颜色
        #    英文颜色单词 或 常见颜色英文单词首字母 或 #495434 或 (1,1,1) 或 (1,1,1,1)
    #alpha: <关键字参数> 透明度
        #    浮点数值
    mp.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5)

      

    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    mp.plot(x, sinx)
    mp.plot(x, cosx)
    
    mp.show()

      2.设置坐标轴范围

    #x_limt_min:    <float> x轴范围最小值
    #x_limit_max:    <float> x轴范围最大值
    mp.xlim(x_limt_min, x_limit_max)
    #y_limt_min:    <float> y轴范围最小值
    #y_limit_max:    <float> y轴范围最大值
    mp.ylim(y_limt_min, y_limit_max)
    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    #设置可视区间
    mp.xlim(0, np.pi+0.1)
    mp.ylim(0, 1+0.1)
    
    mp.plot(x, sinx)
    mp.plot(x, cosx)
    
    mp.show()

      3.设置坐标刻度

    #x_val_list:     x轴刻度值序列
    #x_text_list:    x轴刻度标签文本序列 [可选]
    mp.xticks(x_val_list , x_text_list )
    #y_val_list:     y轴刻度值序列
    #y_text_list:    y轴刻度标签文本序列 [可选]
    mp.yticks(y_val_list , y_text_list )

      案例:把横坐标的刻度显示为:0, π/2, π, 3π/2, 2π

    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    # 设置刻度文本
    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$']
    mp.xticks(vals, texts)
    mp.yticks([-1.0, -0.5, 0.5, 1])
    
    mp.plot(x, sinx)
    mp.plot(x, cosx)
    
    mp.show() 

      4.设置坐标轴

      坐标轴名:left / right / bottom / top

    # 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
    ax = mp.gca()
    # 获取其中某个坐标轴
    axis = ax.spines['坐标轴名']
    # 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
    # type: <str> 移动坐标轴的参照类型  一般为'data' (以数据的值作为移动参照值)
    # val:  参照值
    axis.set_position(('data', val))
    # 设置坐标轴的颜色
    # color: <str> 颜色值字符串
    axis.set_color(color)

      案例:设置坐标轴至中心。

    #设置坐标轴
    ax = mp.gca()
    axis_b = ax.spines['bottom']
    axis_b.set_position(('data', 0))
    axis_l = ax.spines['left']
    axis_l.set_position(('data', 0))
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    # 设置刻度文本
    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$']
    mp.xticks(vals, texts)
    mp.yticks([-1.0, -0.5, 0.5, 1])
    
    # 设置坐标轴(移动)
    axis = mp.gca()
    axis.spines['top'].set_color('none')
    axis.spines['right'].set_color('none')
    axis.spines['left'].set_position(('data', 0))
    axis.spines['bottom'].set_position(('data', 0))
    
    mp.plot(x, sinx)
    mp.plot(x, cosx)
    
    mp.show()

      5.图例

      显示两条曲线的图例,并测试loc属性。

    # 再绘制曲线时定义曲线的label
    # label: <关键字参数 str> 支持LaTex排版语法字符串
    mp.plot(xarray, yarray ... label='', ...)
    # 设置图例的位置
    # loc: <关键字参数> 制定图例的显示位置 (若不设置loc,则显示默认位置)
    #     ===============   =============
    #    Location String   Location Code
    #    ===============   =============
    #    '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
    #    ===============   =============
    mp.legend(loc='')

      

    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    # 设置刻度文本
    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$']
    mp.xticks(vals, texts)
    mp.yticks([-1.0, -0.5, 0.5, 1])
    
    # 设置坐标轴(移动)
    axis = mp.gca()
    axis.spines['top'].set_color('none')
    axis.spines['right'].set_color('none')
    axis.spines['left'].set_position(('data', 0))
    axis.spines['bottom'].set_position(('data', 0))
    
    mp.plot(x, sinx, linestyle='--', linewidth=2,
        color='dodgerblue', alpha=0.8,
        label=r'$y=sin(x)$')
    mp.plot(x, cosx, linestyle='-.', linewidth=2,
        color='orangered', alpha=0.8,
        label=r'$y=frac{1}{2}cos(x)$')
    
    mp.show()

      6.特殊点

    # xarray: <序列> 所有需要标注点的水平坐标组成的序列
    # yarray: <序列> 所有需要标注点的垂直坐标组成的序列
    mp.scatter(xarray, yarray, 
               marker='',         #点型 ~ matplotlib.markers
               s=50,             #大小
               edgecolor='',     #边缘色
               facecolor='',    #填充色
               zorder=3            #绘制图层编号 (编号越大,图层越靠上)

      案例:绘制当x=π/2时两条曲线上的特殊点。

    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    # 设置刻度文本
    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$']
    mp.xticks(vals, texts)
    mp.yticks([-1.0, -0.5, 0.5, 1])
    
    # 设置坐标轴(移动)
    axis = mp.gca()
    axis.spines['top'].set_color('none')
    axis.spines['right'].set_color('none')
    axis.spines['left'].set_position(('data', 0))
    axis.spines['bottom'].set_position(('data', 0))
    
    mp.plot(x, sinx, linestyle='--', linewidth=2,
        color='dodgerblue', alpha=0.8,
        label=r'$y=sin(x)$')
    mp.plot(x, cosx, linestyle='-.', linewidth=2,
        color='orangered', alpha=0.8,
        label=r'$y=frac{1}{2}cos(x)$')
    
    # 绘制特殊点
    xs = [np.pi/2, np.pi/2]
    ys = [1, 0]
    mp.scatter(xs, ys, marker='o', edgecolor='red',
        facecolor='green', s=100, label='Points',
        zorder=3)
    
    mp.show() 

      7.备注

    # 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
    mp.annotate(
        r'$frac{pi}{2}$',            #备注中显示的文本内容
        xycoords='data',            #备注目标点所使用的坐标系(data表示数据坐标系)
        xy=(x, y),                     #备注目标点的坐标
        textcoords='offset points',    #备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
        xytext=(x, y),                #备注文本的坐标
        fontsize=14,                #备注文本的字体大小
        arrowprops=dict()            #使用字典定义文本指向目标点的箭头样式
    )

      arrowprops参数使用字典定义指向目标点的箭头样式

    #arrowprops字典参数的常用key
    arrowprops=dict(
        arrowstyle='',        #定义箭头样式
        connectionstyle=''    #定义连接线的样式
    )

      箭头样式(arrowstyle)字符串如下

    ============   =============================================
    Name           Attrs
    ============   =============================================
      '-'          None
      '->'         head_length=0.4,head_width=0.2
      '-['         widthB=1.0,lengthB=0.2,angleB=None
      '|-|'        widthA=1.0,widthB=1.0
      '-|>'        head_length=0.4,head_width=0.2
      '<-'         head_length=0.4,head_width=0.2
      '<->'        head_length=0.4,head_width=0.2
      '<|-'        head_length=0.4,head_width=0.2
      '<|-|>'      head_length=0.4,head_width=0.2
      'fancy'      head_length=0.4,head_width=0.4,tail_width=0.4
      'simple'     head_length=0.5,head_width=0.5,tail_width=0.2
      'wedge'      tail_width=0.3,shrink_factor=0.5
    ============   =============================================

      连接线样式(connectionstyle)字符串如下

    ============   =============================================
    Name           Attrs
    ============   =============================================
      'angle'         angleA=90,angleB=0,rad=0.0
      'angle3'         angleA=90,angleB=0`   
      'arc'            angleA=0,angleB=0,armA=None,armB=None,rad=0.0
      'arc3'         rad=0.0
      'bar'         armA=0.0,armB=0.0,fraction=0.3,angle=None
    ============   =============================================

      案例:为在某条曲线上的点添加备注,指明函数方程与值。

    import numpy as np
    import matplotlib.pyplot as mp
    
    # 绘制正弦曲线  y=sin(x)
    x = np.linspace(-np.pi, np.pi, 1000)
    sinx = np.sin(x)
    # 绘制余弦曲线  y=cos(x) / 2
    cosx = np.cos(x) / 2
    
    #设置可视区间
    # mp.xlim(0, np.pi+0.1)
    # mp.ylim(0, 1+0.1)
    
    # 设置刻度文本
    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$']
    mp.xticks(vals, texts)
    mp.yticks([-1.0, -0.5, 0.5, 1])
    # 移动坐标轴
    axis = mp.gca()
    axis.spines['top'].set_color('none')
    axis.spines['right'].set_color('none')
    axis.spines['left'].set_position(('data', 0))
    axis.spines['bottom'].set_position(('data', 0))
    
    mp.plot(x, sinx, linestyle='--', linewidth=2,
        color='dodgerblue', alpha=0.8,
        label=r'$y=sin(x)$')
    mp.plot(x, cosx, linestyle='-.', linewidth=2,
        color='orangered', alpha=0.8,
        label=r'$y=frac{1}{2}cos(x)$')
    
    # 绘制特殊点
    xs = [np.pi/2, np.pi/2]
    ys = [1, 0]
    mp.scatter(xs, ys, marker='o', edgecolor='red',
        facecolor='green', s=100, label='Points',
        zorder=3)
    
    # 添加备注信息
    mp.annotate(r'$[frac{pi}{2},1]$',
                xycoords='data', xy=(np.pi / 2, 1),
                textcoords='offset points', xytext=(30, 30),
                fontsize=14,
                arrowprops=dict(
                  arrowstyle='->',
                  connectionstyle='angle3'))
    mp.annotate(r'$[frac{pi}{2},0]$',  # 备注的内容
                xycoords='data',  # 会让你的箭头指向这个点
                xy=(np.pi / 2, 0),  # 备注的坐标点
                textcoords='offset points',  # 你传进去的那个字符串会基于你第一步画出来的那个点的基础上x轴上减30,y轴上减30的位置进行打印。
                xytext=(-60, -60),  # 离原坐标的距离
                fontsize=14,  # 备注字的大小
                arrowprops=dict(
                  arrowstyle='->',  # 描绘了箭头的样式
                  connectionstyle='angle3'))  # 就是描绘箭头的样式的,例如箭头的一个弧度之类的
    
    mp.legend(loc='best')
    mp.show()

      (二)图形对象(图形窗口)

      案例:绘制两个窗口,一起显示。

    # 手动构建 matplotlib 窗口
    mp.figure(
        'A',                #窗口标题栏文本 
        facecolor=''        #图表背景色
    )
    mp.figure('B')
    mp.figure('A')  # 把A创建置为当前窗口
    mp.plot(....) # 将会作用在A窗口中
    mp.show()
    import matplotlib.pyplot as mp
    
    # 为figureA添加图形
    mp.figure('Figure A', facecolor='gray')
    mp.title('Figure A')
    # 为figureB添加图形
    mp.figure('Figure B', facecolor='lightgray')
    mp.title('Figure B')
    
    mp.tight_layout()#紧凑布局
    mp.show()

      mp.figure方法不仅可以构建一个新窗口,如果已经构建过title='xxx'的窗口,又使用figure方法构建了title='xxx' 的窗口的话,mp将不会创建新的窗口,而是把title='xxx'的窗口置为当前操作窗口。 

      设置当前窗口的参数 

      案例:测试窗口相关参数

    # 设置图表标题 显示在图表上方
    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() 
    import numpy as np
    import matplotlib.pyplot as mp
    
    # 为figureA添加图形
    mp.figure('Figure A', facecolor='gray')
    mp.title('Figure A')
    # 为figureB添加图形
    mp.figure('Figure B', facecolor='lightgray')
    mp.title('Figure B')
    
    # 把FigureA 置为当前窗口
    mp.figure('Figure A')
    mp.title('Figure A', fontsize=18)
    mp.tick_params(labelsize=14)
    mp.xlabel('X', fontsize=16)
    mp.xlabel('Y', fontsize=16)
    mp.grid(linestyle=":")
    
    mp.tight_layout()#紧凑布局
    mp.show()

     1.子图  

    import matplotlib.pyplot as mp
    
    mp.figure('Subplot', facecolor='lightgray')
    for i in range(1, 10):
      mp.subplot(3, 3, i)
      mp.text(0.5, 0.5, i, ha="center", va='center', size=36, alpha=0.8)
      mp.xticks([])
      mp.yticks([])
    mp.tight_layout()
    mp.show()

      网络式布局

    # 网格式布局
    import matplotlib.gridspec as mg
    import matplotlib.pyplot as mp
    
    mp.figure('Grid Layout', facecolor='lightgray')
    mp.title('Grid Layout')
    gs = mg.GridSpec(3, 3)
    
    # 1
    mp.subplot(gs[0, :2])
    mp.text(0.5, 0.5, 1, size=36, alpha=0.7,
            ha='center', va='center')
    mp.xticks([])
    mp.yticks([])
    
    # 2
    mp.subplot(gs[0:2, -1])
    mp.text(0.5, 0.5, 2, size=36, alpha=0.7,
            ha='center', va='center')
    mp.xticks([])
    mp.yticks([])
    
    # 3
    mp.subplot(gs[1:3, 0])
    mp.text(0.5, 0.5, 3, size=36, alpha=0.7,
            ha='center', va='center')
    mp.xticks([])
    mp.yticks([])
    
    # 4
    mp.subplot(gs[1, 1])
    mp.text(0.5, 0.5, 4, size=36, alpha=0.7,
            ha='center', va='center')
    mp.xticks([])
    mp.yticks([])
    
    # 5
    mp.subplot(gs[2, 1:3])
    mp.text(0.5, 0.5, 5, size=36, alpha=0.7,
            ha='center', va='center')
    mp.xticks([])
    mp.yticks([])
    mp.tight_layout()
    mp.show()

      自由式布局

    #自由布局
    import matplotlib.pyplot as mp
    
    mp.figure('Free Style',facecolor='lightgray')
    mp.axes([0.1,0.1,0.2,0.5])#x左底部,y左底部,宽度,高度
    mp.text(0.5, 0.5, 1, ha='center', va='center', size=36)
    mp.xticks([])
    mp.yticks([])
    mp.axes([0.4,0.1,0.5,0.2])
    mp.text(0.5, 0.5, 2, ha='center', va='center', size=36)
    mp.xticks([])
    mp.yticks([])
    mp.axes([0.1,0.7,0.5,0.2])
    mp.text(0.5, 0.5, 3, ha='center', va='center', size=36)
    mp.xticks([])
    mp.yticks([])
    mp.axes([0.7,0.4,0.2,0.5])
    mp.text(0.5, 0.5, 4, ha='center', va='center', size=36)
    mp.xticks([])
    mp.yticks([])
    mp.axes([0.4,0.4,0.2,0.2])
    mp.xticks([])
    mp.yticks([])
    mp.text(0.5, 0.5, 5, ha='center', va='center', size=36)
    
    mp.show()

      2.刻度定位器

    # 获取当前坐标轴
    ax = mp.gca()
    # 设置水平坐标轴的主刻度定位器
    ax.xaxis.set_major_locator(mp.NullLocator())
    # 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
    ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))

      案例:绘制一个数轴。

    import matplotlib.pyplot as mp
    
    # 刻度定位器
    mp.figure('Locator', facecolor='lightgray')
    axis = mp.gca()
    axis.spines['top'].set_color('none')
    axis.spines['right'].set_color('none')
    axis.spines['left'].set_color('none')
    mp.xlim(0, 10)
    mp.ylim(-1, 1)
    mp.yticks([])
    
    axis.spines['bottom'].set_position(('data', 0))
    maj_loc = mp.MultipleLocator(1)  # 每隔1一个刻度
    axis.xaxis.set_major_locator(maj_loc)
    min_loc = mp.MultipleLocator(0.1)  # 每隔0.1一个刻度
    axis.xaxis.set_minor_locator(min_loc)
    mp.tight_layout()
    mp.show()

     

      案例:使用for循环测试刻度器样式

    import matplotlib.pyplot as mp
    
    locators = ['mp.NullLocator()',
                'mp.MaxNLocator(nbins=4)',
                'mp.AutoLocator()',
                'mp.FixedLocator([2.5,5,7.5,10])']
    
    # 刻度定位器
    mp.figure('Locator', facecolor='lightgray')
    for i, locator in enumerate(locators):
      mp.subplot(len(locators), 1, i+1)     # rows:行数 cols:列数 num:编号
      axis = mp.gca()
      axis.spines['top'].set_color('none')
      axis.spines['right'].set_color('none')
      axis.spines['left'].set_color('none')
      mp.xlim(0, 10)
      mp.ylim(-1, 1)
      mp.yticks([])
      #
      axis.spines['bottom'].set_position(('data', 0))
      maj_loc = eval(locator)  # mp.MultipleLocator(1)  # 每隔1一个刻度
      axis.xaxis.set_major_locator(maj_loc)
      min_loc = mp.MultipleLocator(0.1)  # 每隔0.1一个刻度
      axis.xaxis.set_minor_locator(min_loc)
    mp.tight_layout()
    mp.show() 

      常用刻度器如下

    # 空定位器:不绘制刻度
    mp.NullLocator()
    # 最大值定位器:
    # 最多绘制nbins+1个刻度
    mp.MaxNLocator(nbins=3)
    # 定点定位器:根据locs参数中的位置绘制刻度
    mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])
    # 自动定位器:由系统自动选择刻度的绘制位置
    mp.AutoLocator()
    # 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔
    mp.IndexLocator(offset=0.5, base=1.5)
    # 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
    mp.MultipleLocator()
    # 线性定位器:等分numticks-1份,绘制numticks个刻度
    mp.LinearLocator(numticks=21)
    # 对数定位器:以base为底,绘制刻度
    mp.LogLocator(base=2)

      3.刻度网格线

    ax = mp.gca()
    #绘制刻度网格线
    ax.grid(
        which='',        # 'major'/'minor' <-> '主刻度'/'次刻度' 
        axis='',        # 'x'/'y'/'both' <-> 绘制x或y轴
        linewidth=1,     # 线宽
        linestyle='',     # 线型
        color='',        # 颜色
        alpha=0.5        # 透明度
    )

      案例:绘制曲线 [1, 10, 100, 1000, 100, 10, 1],然后设置刻度网格线,测试刻度网格线的参数。

    import matplotlib.pyplot as mp
    
    y = [1, 10, 100, 2000, 100, 10, 1]
    mp.figure('GridLine', facecolor='lightgray')
    mp.title('GridLine')
    ax = mp.gca()
    ma_loc = mp.MultipleLocator(1)
    ax.xaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(0.1)
    ax.xaxis.set_minor_locator(mi_loc)
    
    ma_loc = mp.MultipleLocator(250)
    ax.yaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(50)
    ax.yaxis.set_minor_locator(mi_loc)
    
    # 绘制刻度网格线
    ax.grid(which='major', axis='both',
            linewidth=0.75, color='orange',
            alpha=0.8)
    ax.grid(which='minor', axis='both',
            linewidth=0.25, color='orange',
            alpha=0.8)
    mp.plot(y, 'o-', color='dodgerblue')
    
    mp.show()

       4.半对数坐标

    mp.figure('Grid', facecolor='lightgray')
    y = [1, 10, 100, 1000, 100, 10, 1]
    mp.semilogy(y)
    mp.show()
    import matplotlib.pyplot as mp
    
    
    y = [1, 10, 100, 2000, 100, 10, 1]
    mp.figure('GridLine', facecolor='lightgray')
    mp.title('GridLine')
    mp.subplot(211)
    ax = mp.gca()
    ma_loc = mp.MultipleLocator(1)
    ax.xaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(0.1)
    ax.xaxis.set_minor_locator(mi_loc)
    
    ma_loc = mp.MultipleLocator(250)
    ax.yaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(50)
    ax.yaxis.set_minor_locator(mi_loc)
    
    # 绘制刻度网格线
    ax.grid(which='major', axis='both',
            linewidth=0.75, color='orange',
            alpha=0.8)
    ax.grid(which='minor', axis='both',
            linewidth=0.25, color='orange',
            alpha=0.8)
    mp.plot(y, 'o-', color='dodgerblue')
    
    
    mp.subplot(212)
    # 定义刻度定位器
    ax = mp.gca()
    ma_loc = mp.MultipleLocator(1)
    ax.xaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(0.1)
    ax.xaxis.set_minor_locator(mi_loc)
    
    ma_loc = mp.MultipleLocator(250)
    ax.yaxis.set_major_locator(ma_loc)
    mi_loc = mp.MultipleLocator(50)
    ax.yaxis.set_minor_locator(mi_loc)
    
    # 绘制刻度网格线
    ax.grid(which='major', axis='both',
            linewidth=0.75, color='orange',
            alpha=0.8)
    ax.grid(which='minor', axis='both',
            linewidth=0.25, color='orange',
            alpha=0.8)
    
    mp.semilogy(y, 'o-', color='dodgerblue')
    mp.show()
    semilogy

      5.散点图

    mp.scatter(
        x,                     # x轴坐标数组
        y,                    # y轴坐标数组
        marker='',             # 点型
        s=10,                # 大小
        color='',            # 颜色
        edgecolor='',         # 边缘颜色
        facecolor='',        # 填充色
        zorder=''            # 图层序号
    )

      numpy.random提供了normal函数用于产生符合 正态分布 的随机数

    n = 100
    # 172:    期望值
    # 10:    标准差
    # n:    数字生成数量
    x = np.random.normal(172, 20, n)
    y = np.random.normal(60, 10, n)

      案例:绘制平面散点图。

    mp.figure('scatter', facecolor='lightgray')
    mp.title('scatter')
    mp.scatter(x, y)
    mp.show()

      设置点的颜色

    mp.scatter(x, y, c='red')            #直接设置颜色
    d = (x-172)**2 + (y-60)**2
    mp.scatter(x, y, c=d, cmap='jet')    #以c作为参数,取cmap颜色映射表中的颜色值

      cmap颜色映射表参照附件:cmap颜色映射表

    import matplotlib.pyplot as mp
    import numpy as np
    #生成一组服从正态分布的随机数
    n=300
    
    x=np.random.normal(173,4.5,n)#身高
    y=np.random.normal(60,10,n)#体重
    d=(x-173)**2+(y-60)**2
    mp.figure('Scatter',facecolor='lightgray')
    mp.title('Persons',fontsize=16)
    mp.xlabel('Height',fontsize=14)
    mp.ylabel('Weight',fontsize=14)
    mp.scatter(x,y,c=d,cmap='jet_r',label='Persons',s=60)
    mp.legend()
    mp.show()

      6.填充

      以某种颜色自动填充两条曲线的闭合区域。

    mp.fill_between(
        x,                # x轴的水平坐标
        sin_x,            # 下边界曲线上点的垂直坐标
        cos_x,            # 上边界曲线上点的垂直坐标
        sin_x<cos_x,     # 填充条件,为True时填充
        color='',         # 填充颜色
        alpha=0.2        # 透明度
    )

     案例:绘制两条曲线: sin_x = sin(x) cos_x = cos(x / 2) / 2 [0-8π]

    #填充
    import numpy as np
    import matplotlib.pyplot as mp
    
    x=np.linspace(0,8*np.pi,1000)
    sinx=np.sin(x)
    cosx=np.cos(x)
    
    mp.figure('Fill',facecolor='lightgray')
    mp.title('Fill',fontsize=16)
    mp.grid(linestyle=':')
    mp.plot(x,sinx,color='blue',label='sinx')
    mp.plot(x,cosx,color='red',label='cosx')
    #填充
    mp.fill_between(x,sinx,cosx,sinx<cosx,
                    color='dodgerblue',alpha=0.2)
    mp.fill_between(x,sinx,cosx,sinx>cosx,
                    color='red',alpha=0.2)
    
    mp.legend()
    mp.show()

      7.条形图

    mp.figure('Bar', facecolor='lightgray')
    mp.bar(
        x,                # 水平坐标数组
        y,                # 柱状图高度数组
        width,            # 柱子的宽度
        bottom,           # 柱子的底部基准位置
        color='',         # 填充颜色
        label='',         #
        alpha=0.2         #
    )

    柱状图与折线图的区别:柱状图可以进行排序,折线图则不能排序

    折线图的优势:体现的量比较大 比柱状图多

    案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

    # 柱状图
    import numpy as np
    import matplotlib.pyplot as mp
    
    apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
    oranges = np.array([24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])
    
    mp.figure('Bar', facecolor='lightgray')
    mp.title('Bar', fontsize=16)
    mp.xlabel('Mouth', fontsize=14)
    mp.ylabel('Valume', fontsize=14)
    mp.grid(linestyle=':', axis='x')
    x = np.arange(apples.size)
    mp.bar(x-0.2, apples, 0.4, color='dodgerblue',
           label='Apple',align='center')
    
    x = np.arange(oranges.size)
    mp.bar(x+0.2,oranges, 0.4, color='red',
           label='Orange',align='center')
    
    mp.xticks(x, [
        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
    mp.legend()
    mp.show()

      柱状图排序

    # 柱状图排序
    import numpy as np
    import matplotlib.pyplot as mp
    
    apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
    
    mp.figure('Bar', facecolor='lightgray')
    mp.title('Bar', fontsize=16)
    mp.xlabel('Mouth', fontsize=14)
    mp.ylabel('Valume', fontsize=14)
    mp.grid(linestyle=':', axis='x')
    x = np.arange(apples.size)
    x1 = x[np.argsort(apples)]
    y = apples[np.argsort(apples)]
    
    mp.xticks(np.arange(len(x)), x1, fontsize =18)
    mp.bar(np.arange(len(x)),y)
    
    mp.legend()
    mp.show()

     

      8.饼图

    mp.pie(
        values,         # 值列表        
        spaces,         # 扇形之间的间距列表
        labels,         # 标签列表
        colors,         # 颜色列表
        '%d%%',         # 标签所占比例格式
        shadow=True,    # 是否显示阴影
        startangle=90   # 逆时针绘制饼状图时的起始角度
        radius=1        # 半径
    )

       案例:绘制饼状图显示5门语言的流行程度:

    # 饼状图
    import matplotlib.pyplot as mp
    #整理数据
    values = [26, 15, 20, 5, 18]
    spaces = [0.01,0.01,0.05,0.01,0.01]
    labels = ['Java', 'Javascript', 'Python', 'PHP', 'C++']
    colors = ['dodgerblue','orangered','limegreen','violet','gold']
    #饼状图
    mp.figure('Pie',facecolor='lightgray')
    mp.title('Pie',fontsize=16)
    #等轴比例
    mp.axis('equal')
    mp.pie(
        values,         # 值列表
        spaces,         # 扇形之间的间距列表
        labels,         # 标签列表
        colors,         # 颜色列表
        '%.2f%%',       # 标签所占比例格式
        shadow=True,    # 是否显示阴影
        startangle=90,  # 逆时针绘制饼状图时的起始角度
        radius=1        # 半径
    )
    mp.legend()
    mp.show()

      9.等高线图

    组成等高线需要网格点坐标矩阵,也需要每个点的高度。所以等高线属于3D数学模型范畴。

    cntr = mp.contour(
        x,                     # 网格坐标矩阵的x坐标 (2维数组)
        y,                     # 网格坐标矩阵的y坐标 (2维数组)
        z,                     # 网格坐标矩阵的z坐标 (2维数组)
        8,                     # 把等高线绘制成8部分
        colors='black',        # 等高线的颜色
        linewidths=0.5         # 线宽
    )
    #为等高线添加标签 mp.clabel(cntr, inline_spacing
    =1, fmt='%.1f', fontsize=10) mp.contourf(x, y, z, 8, cmap='jet')

    案例:生成网格坐标矩阵,并且绘制等高线:

    #等高线图
    import matplotlib.pyplot as mp
    import numpy as np
    n = 500
    #生成二维数组
    x,y = np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))
    # print(x,y)
    z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2)
    # print(z)
    #生成等高线矩阵
    mp.figure('Contour',facecolor='lightgray')
    mp.title('Contour',fontsize=16)
    cntr = mp.contour(x,y,z,colors='black',
               linewidths=0.75)
    mp.clabel(cntr,fmt='%.2f',inline_spacing=1,fontsize=8)
    #填充等高线
    mp.contourf(x,y,z,8,cmap='jet')
    mp.show()

      10.热成像图

    用图形的方式显示矩阵及矩阵中值的大小

    1 2 3

    4 5 6

    7 8 9

    # 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小
    # origin: 坐标轴方向
    #    upper: 缺省值,原点在左上角
    #    lower: 原点在左下角
    mp.imshow(z, cmap='jet', origin='lower')

    使用颜色条显示热度值:

    mp.colorbar() 

    #热成像图
    import matplotlib.pyplot as mp
    import numpy as np
    n = 500
    #生成二维数组
    x,y = np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))
    # print(x,y)
    z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2)
    # print(z)
    #绘制热成像图
    mp.figure('Imshow',facecolor='lightgray')
    mp.title('Imshow',fontsize=16)
    mp.imshow(z,cmap='jet',origin='lower')
    mp.colorbar()#颜色条
    mp.show()

     

      11.极坐标系

    与笛卡尔坐标系不同,某些情况下极坐标系适合显示与角度有关的图像。例如雷达等。极坐标系可以描述极径ρ与极角θ的线性关系。

    mp.figure("Polar", facecolor='lightgray')
    mp.gca(projection='polar')
    mp.title('Porlar', fontsize=20)
    mp.xlabel(r'$	heta$', fontsize=14)
    mp.ylabel(r'$
    ho$', fontsize=14)
    mp.tick_params(labelsize=10)
    mp.grid(linestyle=':')
    mp.show()

    在极坐标系中绘制曲线:

    #准备数据
    t = np.linspace(0, 4*np.pi, 1000)
    r = 0.8 * t
    mp.plot(t, r)
    mp.show()
    #极坐标系
    import  numpy as np
    import matplotlib.pyplot as mp
    
    t = np.linspace(0,4*np.pi,1000)
    r = 0.8*t
    mp.figure('Polar',facecolor='lightgray')
    mp.gca(projection='polar')
    mp.title('Polar',fontsize=16)
    mp.xlabel(r'$	heta$')
    mp.ylabel(r'$
    ho$')
    mp.grid(linestyle=":")
    mp.plot(t,r)
    mp.show()

     

    #极坐标系
    import  numpy as np
    import matplotlib.pyplot as mp
    
    t = np.linspace(0,4*np.pi,1000)
    r = 0.8*t
    mp.figure('Polar',facecolor='lightgray')
    mp.gca(projection='polar')
    mp.title('Polar',fontsize=16)
    
    x=np.linspace(0,6*np.pi,1000)
    y= 3 * np.sin(6*x)
    mp.plot(x,y)
    mp.show()

      12.3D散点图

    matplotlib支持绘制三维曲面。若希望绘制三维曲面,需要使用axes3d提供的3d坐标系。

    from mpl_toolkits.mplot3d import axes3d
    ax3d = mp.gca(projection='3d')   # class axes3d

     matplotlib支持绘制三维点阵、三维曲面、三维线框图:

    ax3d.scatter(..)        # 绘制三维点阵
    ax3d.plot_surface(..)    # 绘制三维曲面
    ax3d.plot_wireframe(..)    # 绘制三维线框图

     

    ax3d.scatter(
        x,                 # x轴坐标数组
        y,                # y轴坐标数组
        z,              # z轴坐标数组
        marker='',         # 点型
        s=10,            # 大小
        zorder='',        # 图层序号
        color='',        # 颜色
        edgecolor='',     # 边缘颜色
        facecolor='',    # 填充色
        c=v,            # 颜色值 根据cmap映射应用相应颜色
        cmap=''            # 
    )

    案例:随机生成3组坐标,程标准正态分布规则,并且绘制它们。

    #三维散点图
    
    import  numpy as np
    import matplotlib.pyplot as mp
    from mpl_toolkits.mplot3d import axes3d
    
    n=300
    x = np.random.normal(0,1,n)
    y = np.random.normal(0,1,n)
    z = np.random.normal(0,1,n)
    
    mp.figure('3D Points',facecolor='lightgray')
    ax3d = mp.gca(projection='3d')
    ax3d.set_xlabel('x')
    ax3d.set_ylabel('y')
    ax3d.set_zlabel('z')
    d=x**2+y**2+z**2
    ax3d.scatter(x,y,z,s=70,alpha=0.7,c=d,cmap='jet')
    mp.tight_layout()#紧凑布局
    mp.show()

      3D曲面图

    ax3d.plot_surface(
        x,                     # 网格坐标矩阵的x坐标 (2维数组)
        y,                     # 网格坐标矩阵的y坐标 (2维数组)
        z,                     # 网格坐标矩阵的z坐标 (2维数组)
        rstride=30,            # 行跨距
        cstride=30,         # 列跨距
        cmap='jet'            # 颜色映射
    )

      案例:绘制3d平面图

    #3D曲面图
    import matplotlib.pyplot as mp
    import numpy as np
    from mpl_toolkits.mplot3d import axes3d
    n = 500
    #生成三维数组
    x,y = np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))
    # print(x,y)
    z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2)
    # print(z)
    #绘制3D曲面图
    mp.figure('3D Surface',facecolor='lightgray')
    ax3d = mp.gca(projection='3d')
    ax3d.plot_surface(x,y,z,cstride=30,rstride=30,cmap='jet')
    mp.tight_layout()
    mp.show() 

     

      3D线框图的绘制

    # 绘制3D线框图 
    # rstride: 行跨距
    # cstride: 列跨距 
    ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30, 
        linewidth=1, color='dodgerblue')
    #3D线框图
    import matplotlib.pyplot as mp
    import numpy as np
    from mpl_toolkits.mplot3d import axes3d
    n = 500
    #生成二维数组
    x,y = np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))
    # print(x,y)
    z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2)
    # print(z)
    #绘制3D线框图
    mp.figure('3D WireFrame',facecolor='lightgray')
    ax3d = mp.gca(projection='3d')
    ax3d.plot_wireframe(x,y,z,cstride=20,rstride=20,linewidth=0.5,color='orangered')
    mp.tight_layout()
    mp.show()

     

      13.简单动画

    动画即是在一段时间内快速连续的重新绘制图像的过程。

    matplotlib提供了方法用于处理简单动画的绘制。定义update函数用于即时更新图像。

    import matplotlib.animation as ma
    #定义更新函数行为
    def update(number):
        pass
    # 每隔10毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象
    # mp.gcf():    获取当前窗口
    # update:    更新函数
    # interval:    间隔时间(单位:毫秒)
    anim = ma.FuncAnimation(mp.gcf(), update, interval=10)
    mp.show()

     案例:随机生成各种颜色的100个气泡。让他们不断的增大。

    import numpy as np
    import matplotlib.pyplot as mp
    import matplotlib.animation as ma
    
    # 自定义一种可以存放在ndarray里的类型,用于保存一个球
    ball_type = np.dtype([
      ('position', float, 2),  # 位置(水平和垂直坐标)
      ('size', float, 1),  # 大小
      ('growth', float, 1),  # 生长速度
      ('color', float, 4)])  # 颜色(红、绿、蓝和透明度)
    
    # 随机生成100个点对象
    n = 100
    balls = np.zeros(100, dtype=ball_type)
    balls['position'] = np.random.uniform(0, 1, (n, 2))
    balls['size'] = np.random.uniform(40, 70, n)
    balls['growth'] = np.random.uniform(10, 20, n)
    balls['color'] = np.random.uniform(0, 1, (n, 4))
    
    mp.figure("Animation", facecolor='lightgray')
    mp.title("Animation", fontsize=14)
    mp.xticks
    mp.yticks(())
    
    sc = mp.scatter(
      balls['position'][:, 0],
      balls['position'][:, 1],
      balls['size'],
      color=balls['color'], alpha=0.5)
    
    
    # 定义更新函数行为
    def update(number):
      balls['size'] += balls['growth']
      # 每次让一个气泡破裂,随机生成一个新的
      boom_ind = number % n
      balls[boom_ind]['size'] = np.random.uniform(40, 70, 1)
      balls[boom_ind]['position'] = np.random.uniform(0, 1, (1, 2))
      # 重新设置属性
      sc.set_sizes(balls['size'])
      sc.set_offsets(balls['position'])
    
    
    # 每隔30毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象
    # mp.gcf():    获取当前窗口
    # update:        更新函数
    # interval:    间隔时间(单位:毫秒)
    anim = ma.FuncAnimation(mp.gcf(), update, interval=30)
    mp.show()

     

     案例:绘制信号曲线:y=sin(2 * π * t) * exp(sin(0.2 * π * t)),数据通过生成器函数生成,在update函数中绘制曲线。

     

    import matplotlib.pyplot as mp
    import matplotlib.animation as ma
    import numpy as np
    mp.figure("Signal", facecolor='lightgray')
    mp.title("Signal", fontsize=14)
    mp.xlim(0, 10)
    mp.ylim(-3, 3)
    mp.grid(linestyle='--', color='lightgray', alpha=0.5)
    pl = mp.plot([], [], color='dodgerblue', label='Signal')[0]
    
    x = 0
    
    
    def update(data):
      t, v = data
      x, y = pl.get_data()
      x = np.append(x, t)
      y = np.append(y, v)
      # 重新设置数据源
      pl.set_data(x, y)
      # 移动坐标轴
      if (x[-1] > 10):
        mp.xlim(x[-1] - 10, x[-1])
    
    
    def y_generator():
      global x
      y = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x))
      yield (x, y)
      x += 0.05
    
    
    anim = ma.FuncAnimation(mp.gcf(), update, y_generator, interval=20)
    mp.tight_layout()
    mp.show()

     

     

     

     

     

     

     

     

  • 相关阅读:
    解决.net core 3.1 json日期带T的问题
    C# 将指定得时间转换成秒
    WPF Button按钮的按下和抬起分别触发的事件
    WPF Image图片后台绑定图片,不对图片照成占用
    WPF Textbox漂亮的文本控件框封装
    WPF Slider实现可拖动的时间轴
    .net mvc 下显示PDF文件
    .net core 3.1使用命令自动生成MySQL表对应的实体类
    .net core A generic error occurred in GD 已解决
    WPF 模拟Button按钮事件触发
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11448701.html
Copyright © 2020-2023  润新知