• 数据分析第二篇:matplotlib 常用的几个绘图方法


    Matplotlib

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

    matplotlib的基本功能

    1.基本绘图

    1.1 绘制坐标系中连续的线,设置线型/线宽/颜色

    绘制一条线的相关API

    import numpy as np
    import matplotlib.pyplot as plt
    # xarray:散点的x坐标数组
    # yarray:散点的y坐标数组
    plt.plot(xarray, yarray)
    plt.show()
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(1,10)
    y = np.arange(1,10)
    plt.plot(x, y)
    plt.show()

    绘制水平线和垂直线相关API

    # 绘制一条垂直x轴的线,需要给定x坐标值的value,指定y坐标范围
    plt.vlines(value, ymin, ymax,..)
    # 绘制一条垂直y轴的线,需要给定y坐标值的value,指定x坐标范围
    plt.hlines(value, xmin, xmax,..)
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(1,10)
    y = np.arange(1,10)
    plt.plot(x, y)
    plt.vlines(5, 3, 8)
    plt.hlines(5, 3, 8)
    plt.show()

     

    线型/线宽/颜色

    plt.plot(x,y,
            linestyle='',  # 线型
            linewidth=1,   # 线宽
            color='',   # 颜色
            alpha=0.5   # 透明度
            )
    • r 红色
    • g 绿色
    • b 蓝色
    • c cyan
    • m 紫色
    • y 土黄色
    • k 黑色
    • w 白色

    1.2 设置坐标轴的范围

    plt.xlim(x_lim_min, x_lim_max)
    plt.ylim(y_lim_min, y_lim_max)

    1.3 设置坐标刻度

    # 设置x轴的坐标刻度
    # x_val_list:坐标值列表
    # x_text_list:坐标刻度列表
    plt.xticks(x_val_list, x_text_list)
    plt.yticks(y_val_list, y_text_list)
    
    # 设置坐标刻度[-π,-π/2, 0, π/2, π]
    ---------------方法一------------
    x_val_list= [-np.pi, -np.pi/2, 0, np.pi/2, np.pi]
    x_text_list = ['','-π/2','0','π/2','π']
    plt.xticks(x_val_list, x_text_list)
    
    --------------方法二-------------
    x_text_list = [r'$-pi$',r'$-frac{pi}{2}$',r'0',r'$frac{pi}{2}$',r'${pi}$']

    刻度文本的特殊语法 - LaTeX排版语法规范

    设置坐标轴

    坐标轴包含四个:left/right/bottom/top
    
    # getCurrentAxis() 获取当前坐标轴对象
    ax = plt.gca()
    ax1 = ax.spines['left']
    axr = ax.spines['right']
    
    # 设置坐标轴的颜色
    axl.set_color('none')  # 设置坐标轴颜色为透明
    # 设置坐标轴的位置
    axl.set_position((type,val))
    
    # 设置坐标轴颜色与位置
    ax = plt.gca()
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    ax.spines['left'].set_position(('data',0))
    ax.spines['bottom'].set_position(('data',0))

    1.4 显示图例

    # 自动在窗口中某个位置添加图例
    # 添加图例需要在调用plt.plot()绘制曲线时设置label参数
    通过loc参数设置图例的位置
    plt.legend(loc='')

    # 实例

    plt.plot(x, cos_x, linestyle='--', linewidth=3, color='y', label=r'$y =frac{1}{2}cos(x)$')
    plt.plot(x, sin_x, linestyle='-.', linewidth=1, color='m', label=r'$y=sin(x)$')
    plt.legend()

    1.5 绘制特殊点

    plt.scatter(x,y,
               marker='',   # 点型
               s=3,       # 点的大小
               edgecolor='',  # 边缘色
               facecolor='',   # 填充色
               zorder=3)      # 绘制顺序

    1.6 为图像添加备注

    plt.annotate(
        '',             # 备注内容
        xycoords='',   # 备注目标点使用的坐标系
        xy=(x,y),      # 备注目标点的坐标
        textcoords= '',  # 备注文本使用的坐标系
        xytext = (x,y),   # 备注文本的坐标
        fontsize = 14,    # 备注文本字体大小
        arrowprops = dict()   # 提示箭头属性
    )
    
    arrowprops参数使用字典定义只想目标点的箭头样式
    
    arrowprops = dict(
        arrowstyle = '',   # 定义箭头样式
        connectionstyle = '' # 定义连接线样式
    )
    # 可设置箭头的弧度
    connectionstyle='arc3, rad=0.1',

    2.高级绘图

    2.1 绘制子图

    一次绘制两个窗口

    plt.figure(
    '',       # 窗口标题
        figsize=(4,3),    # 窗口大小
        facecolor = ''    # 窗口颜色
    )
    plt.show()    # 展示窗口
    
    # 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上
    #,如果希望修改已经创建过的窗口,可以通过plt.figure(
    'figure1')方法把该窗口设置为当前窗口。 plt.figure('figure1', figsize=(4,3), facecolor='lightgray') plt.figure('figure2', figsize=(4,3), facecolor='lightgray')

    设置当前窗口的常用参数

    plt.title('', fontsize=18) # 设置标题
    plt.xlabel('', fontsize=12) # 设置窗口中x坐标轴的文本及y坐标轴的文本
    plt.ylabel('', fontsize=12)
    plt.tick_params(label=8) #
    plt.grid() # 设置图表网格线
    plt.tight_layout() # 设置紧凑布局

    矩阵式布局

    
    

    plt.figure('')
    # 开始绘制一个子图
    # 通过参数rows与cols拆分当前窗口,每个子窗口都将分配一个序号, 1-x
    plt.subplot(rows, cols, num)
    plt.subplot(2,3,2)
    plt.subplot(233)
    plt.show()

    
    

    绘制九宫格子图

    
    

    import numpy as np
    import matplotlib.pyplot as mp

    
    

    mp.figure('Sub Layout', facecolor='gray')
    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
    mp.figure('')
    # 该方法将会返回子图的二维数组
    gs = mg.GridSpec(3, 3)
    # 通过subplot对子图进行合并
    # gs[0, :2]->合并0行中的0/1列作为1个子图进行绘制
    mp.subplot(gs[0, :2])
    mp.show()

    
    

     

    自由布局

    plt.figure(
    '',       # 窗口标题
        figsize=(4,3),    # 窗口大小
        facecolor = ''    # 窗口颜色
    )
    plt.show()    # 展示窗口
    
    # 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
    plt.figure('figure1', figsize=(4,3), facecolor='lightgray')
    plt.figure('figure2', figsize=(4,3), facecolor='lightgray')
    
     

    2.2散点图

    plt.scatter(x,y,marker='', s=10,color='',edgecolor='',facecolor='',zorder=3)

    随机生成一堆点身高期望在1.72 体重在60kg

    import numpy as np
    import matplotlib.pyplot as plt
    
    n = 100
    x= np.random.normal(172, 20, n)
    y= np.random.normal(60, 10, n)
    
    plt.figure('Persons', facecolor='lightgray')
    plt.title('Persons')
    plt.xlabel('height')
    plt.ylabel('weight')
    d = (x-172)**2 + (y-60)**2
    # 颜色映射
    plt.scatter(x, y, c=d, s=40)
    plt.show()

    2.6 图像填充

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

    plt.fill_between(
        x,     # x轴水平坐标
        sinx,   # sinx曲线的y坐标
        cosx,    # cosx曲线的y坐标
        sinx<cosx,   # 填充条件为TRUE时,填充
        color='',    # 颜色
        alpha=0.3    # 透明度
    )

    实例:sinx>cosx的部分进行填充

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 8*np.pi,1000)
    sinx = np.sin(x)
    cosx = np.cos(x/2)/2
    
    plt.figure('Fill', facecolor='lightgray')
    plt.title('Fill')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.tick_params(labelsize=10)
    plt.plot(x,sinx,color='y', label='y=sin(x)')
    plt.plot(x, cosx,color='b', label='y=cos(x/2)/2')
    
    plt.fill_between(
        x,     # x轴水平坐标
        sinx,   # sinx曲线的y坐标
        cosx,    # cosx曲线的y坐标
        sinx>cosx,   # 填充条件为TRUE时,填充
        color='dodgerblue',    # 颜色
        alpha=0.5    # 透明度
    )
    plt.tight_layout()
    plt.legend()
    plt.show()

    2.7 条形图(柱状图)

    plt.bar(
    x,      # 水平坐标数组
        y,      # 柱状图高度数组
        width,    # 柱子的宽度
        color='',    # 填充颜色
        label='',    # 标签
        alpha=0.5
    )

    案例:绘制苹果12个月的销量,绘制橘子的销量

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    
    apples = [42, 35, 34, 56, 47, 45, 75, 23, 45, 23, 42, 34]
    oranges = [21, 43, 25, 46, 58, 74, 52, 12, 43, 54, 65, 46]
    
    plt.figure('Bar', facecolor='lightgray')
    plt.title('Bar', fontsize=18)
    plt.xlabel('month', fontsize=14)
    plt.ylabel('Price', fontsize=14)
    plt.tick_params(labelsize=10)
    plt.grid(linestyle=':', axis='y')
    
    x = np.arange(len(apples))
    plt.bar(x - 0.2, apples, 0.4, color='y', label='Apple')
    plt.bar(x + 0.2, oranges, 0.4, color='b', label='Orange')
    
    plt.xticks(x, ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月',
                   '十月', '十一月', '十二月'])
    plt.legend()
    plt.show()

     

    2.8 饼图

    功能:统计出占所有总量的百分比

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

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

    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    
    plt.figure('Pie', facecolor='lightgray')
    plt.title('Pie', fontsize=18)
    
    values = [23, 24, 46, 57, 87]
    spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
    labels = ['Python', 'Javascript', 'C++', 'Java', 'PHP']
    colors = ['r', 'g', 'b', 'y', 'c']
    plt.pie(values, spaces, labels, colors,'%d%%', shadow=False)
    
    plt.legend()
    plt.show()

     

    2.9 等高线图

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

    mp.contourf(
        x,    # 网格坐标矩阵
        y,
        z,    # 坐标矩阵中每个点的值
        8,    # 把整个模型的高度等分为8份
        cmap='jet'   # 颜色映射
    )
    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  #解决坐标轴负号的显示问题
    n = 1000
    x, y = np.meshgrid(np.linspace(-3,3,n),
                       np.linspace(-3,3,n))
    z = (1-x/2+x**5+y**3)*np.exp(-x**2 - y**2)
    plt.figure('Contour', facecolor='lightgray')
    plt.title('Contour', fontsize=18)
    plt.xlabel('x', fontsize=14)
    plt.ylabel('y', fontsize=14)
    plt.tick_params(labelsize=10)
    plt.grid(linestyle=':')
    plt.contourf(x,y,z,8,cmap='jet')
    cntr = plt.contour(x,y,z,8,colors='black', linewidths=0.5)
    
    # 设置等高线的标签文本
    plt.clabel(cntr, inline_spacing=1, fmt='%.1f', fontsize=10)
    
    plt.legend()
    plt.show()

     

    2.10 热成像图

    用图像的方式显示矩阵集矩阵中值的大小

    # origin的可选值:
    # 'upper':默认值 y轴方向向下,原点在上方
    # 'lower':原点在下方
    plt.imshow(z, cmap='jet',origin='lower')

    实例:热成像图

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  #解决坐标轴负号的显示问题
    n = 1000
    x, y = np.meshgrid(np.linspace(-3,3,n),
                       np.linspace(-3,3,n))
    z = (1-x/2+x**5+y**3)*np.exp(-x**2 - y**2)
    plt.figure('Hot', facecolor='lightgray')
    plt.title('Hot', fontsize=18)
    plt.xlabel('x', fontsize=14)
    plt.ylabel('y', fontsize=14)
    plt.tick_params(labelsize=10)
    plt.grid(linestyle=':')
    plt.imshow(z, cmap='jet', origin='lower')
    plt.show()

     

    2.11 3D图像绘制

    matplotlib支持绘制三维曲面,但需要使用axis3d提供的3D坐标轴进行绘制。
    
    from mpl_toolkits.mplot3d import axes3d
    ax3d = plt.gca(projection='3d')
    # 使用ax3d对象绘制3维图形
    ax3d.scatter()         # 3维散点图
    ax3d.plot_surface()    # 3维平面图
    ax3d.plot_wireframe()  # 3维线框图

    三维散点图的绘制

    ax3d.scatter(
    x,y,z,   # 点的位置坐标点
        marker,
        s=30,
        zorder=3,
        color='',
        edgecolor='',
        facecolor='',
        c=v,
        cmap=''
    )

    案例:生成三维散点数组,显示在三维坐标中。

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
    n = 1000
    # 期望是0, 标准差是1
    x = np.random.normal(0, 1, n)
    y = np.random.normal(0, 1, n)
    z = np.random.normal(0, 1, n)
    
    plt.figure('Scatter', facecolor='lightgray')
    plt.title('Scatter', fontsize=18)
    plt.grid(linestyle=':')
    
    ax = plt.gca(projection='3d')
    ax.set_xlabel('X', fontsize=12)
    ax.set_ylabel('Y', fontsize=12)
    ax.set_zlabel('Z', fontsize=12)
    plt.tick_params(labelsize=8)
    
    # v的值用于设置散点的颜色
    v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
    ax.scatter(x, y, z, c=v, cmap='jet')
    
    plt.show()

     

    三维平面图的绘制

    ax3d.plot_surface(
    x,y,z,    # 点的位置坐标点
        rstride = 30,  # 行跨距
        cstride=30,   # 列跨距
        cmap='jet'   # 颜色映射
    )
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
    n = 1000
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
    
    plt.figure('三维平面图', facecolor='lightgray')
    plt.title('三维平面图', fontsize=18)
    plt.grid(linestyle=':')
    
    ax = plt.gca(projection='3d')
    ax.set_xlabel('X', fontsize=12)
    ax.set_ylabel('Y', fontsize=12)
    ax.set_zlabel('Z', fontsize=12)
    plt.tick_params(labelsize=8)
    
    # v的值用于设置散点的颜色
    v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
    ax.plot_surface(x, y, z, rstride=30, cstride=30, cmap='jet')
    
    plt.show()

    三维线框图的绘制

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
    n = 1000
    x, y = np.meshgrid(np.linspace(-3, 3, n),
                       np.linspace(-3, 3, n))
    z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
    
    plt.figure('三维平面图', facecolor='lightgray')
    plt.title('三维平面图', fontsize=18)
    plt.grid(linestyle=':')
    
    ax = plt.gca(projection='3d')
    ax.set_xlabel('X', fontsize=12)
    ax.set_ylabel('Y', fontsize=12)
    ax.set_zlabel('Z', fontsize=12)
    plt.tick_params(labelsize=8)
    
    # v的值用于设置散点的颜色
    v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
    ax.plot_wireframe(x, y, z, rstride=30, cstride=30, cmap='jet')
    plt.show()

     

  • 相关阅读:
    使用jq.lazyload.js,解决设置loading图片的问题
    Write your first jQuery plugin
    如何在Less中使用使用calc
    web页面在ios下不支持fixed可用absolute替代的方案
    JavaScript内存优化
    js监听文本框内容变化
    动态绑定事件on
    CSS秘密花园:多边框
    2020—2021—1学期20202405《网络空间安全导论》第一周学习总结
    2020—2021—1学期20202405《网络空间安全导论》第五周学习总结
  • 原文地址:https://www.cnblogs.com/leijing0607/p/7681955.html
Copyright © 2020-2023  润新知