zoukankan      html  css  js  c++  java
  • python数据分析工具 | matplotlib


    不论是数据挖掘还是数学建模,都免不了数据可视化的问题。对于 Python 来说,matplotlib 是最著名的绘图库,它主要用于二维绘图,当然也可以进行简单的三维绘图。它不但提供了一整套和 Matlab 相似但更为丰富的命令,让我们可以非常快捷地用 python 可视化数据。

    matplotlib基础

    # 安装
    pip install matplotlib

    两种绘图风格:

    • MATLAB风格:

    基本函数是 plot,分别取 x,y 的值,然后取到坐标(x,y)后,对不同的连续点进行连线。

    • 面向对象:

    创建一个图形 fig 和一个坐标 ax 。

    fig:figure(plt.Figure) 是一个能容纳各种坐标轴,图形,文字和标签的容器。
    ax:axes(plt.Axes) 是一个带有刻度和标签的矩形,最终会包含各种可视化元素。

    示例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 图形显示风格
    plt.style.use('seaborn-whitegrid')
    
    # 创建fig和ax
    fig = plt.figure()
    ax = plt.axes()
    
    x = np.linspace(0,10,100)
    # 显示sin函数图形
    plt.plot(x, np.sin(x))
    # 显示cos函数图形
    plt.plot(x, np.cos(x))
    
    plt.show()

    这就是利用面向对象的方式绘图,在交互模式中可以看到,每画一个图就是产生一个对象,最后再显示出来。

    绘图样式

    # 调整坐标轴上下限
    plt.xlim([xmin, xmax])
    plt.ylim([ymin, ymax])
    
    plt.axis([xmin, xmax, ymin, ymax])
    # 参数:tight:把图形设置成紧凑模式,不留多余的部分
    #       equal:图形显示分辨率为1:1

    线形图

    文字设置

    图形标题:plt.title

    坐标轴标题:plt.xlabel, plt.ylabel

    基础图例:plt.legend

    注意:对中文不友好,需要额外方法,尽量使用英文

    # 示例
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(1, 10, 100)
    plt.plot(x, np.sin(x))
    plt.title('sin-function')
    plt.xlabel('x-value')
    plt.ylabel('y-label')
    plt.show()

    图例

    通过legend可以设置图例,同时通过参数的调整可以细腻的设置图例的位置、形式等。参数主要包括:

    • loc:图例的位置

    • frameon:是否带边框

    • framealpha:颜色透明

    • shadow:阴影

    # 示例
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(1, 10, 100)
    
    fig, ax = plt.subplots()
    
    ax.plot(x, np.sin(x), color='red', label='sin-function')
    ax.plot(x, np.cos(x), color='blue', label='cos-function')
    
    ax.legend(loc='upper right', frameon=True, shadow=True, framealpha=0.2)
    # 设置图例位置为右上,有边框,有阴影,且透明度为0.2
    
    plt.show()

    颜色条

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(1, 10, 100)
    I = np.sin(x) * np.cos(x[:,np.newaxis])
    
    plt.imshow(I)
    plt.colorbar()
    plt.show()

    散点图

    散点图基础

    散点图主要以点为主,数据是不连续的数据,通过设置线的型号来完成。型号包括‘o’、‘+’、‘*’、‘1’、‘h’、‘D’等等,具体使用探索一下就好,用不到太多。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 图形显示风格
    plt.style.use('seaborn-whitegrid')
    
    x = np.linspace(0, 10, 30)
    y = np.sin(x)
    
    # 通过设置线型为点来完成散点图的绘制
    plt.plot(x, y, 'o', color='blue')
    plt.show()

    如果设置线型为点线结合,那么将绘制出连续的线,对应点处为所设置的点型。

    画散点图还可以使用scatter函数来画,他有很多更细节的描述,用法与plot类似,对于数据量较大的可视化时,plot的效率更高一些。

    误差线

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 图形显示风格
    plt.style.use('seaborn-whitegrid')
    
    x = np.linspace(0, 10, 30)
    dy = x * 0.5
    y = np.sin(x) + dy
    
    plt.errorbar(x, y, yerr=dy, fmt='.k', ecolor='blue')
    plt.show()

    连续误差线表示的是连续量,可以使用 plt.plot 和 plt.fill_between 来画出。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 图形显示风格
    plt.style.use('seaborn-whitegrid')
    
    x = np.linspace(0, 10, 30)
    ysin = np.sin(x)
    ycos = np.cos(x)
    
    plt.plot(x, ysin, color='red')
    plt.plot(x, ycos, color='blue')
    
    plt.fill_between(x, ysin, ycos, color='gray', alpha=0.2)
    plt.show()

    等高线(密度)

    • plt.contour   等高线

    • plt.contourf  自带填充颜色

    • plt.imshow   显示图形

    等高线绘制方法:z = f(x,y),z表示高度。当只有一个颜色绘图时,虚线表示负值,实线表示正值。meshgrid 可以将一维数据变成二维网格数据。

    import matplotlib.pyplot as plt
    import numpy as np
    
    def f(x, y):
      return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
    
    x = np.linspace(0, 5, 50)
    y = np.linspace(0, 5, 40)
    
    # 得到网格点矩阵
    x, y =np.meshgrid(x, y)
    
    # 计算z轴的值
    z = f(x, y)
    
    # 绘制图形
    plt.contour(x, y, z, colors='green')
    # plt.contour(x, y, z, 50, cmap='RdGy') # 更改配色,值50等分,红灰配色
    plt.show()

     

    plt.contourf(x, y, z, 50, cmap='RdGy') # 改为contourf,自动填充颜色,则变为连续的

    直方图

    基本画法:plt.hist 可以直接画直方图,参数主要包括:

    • bins:划分段(柱数)

    • color:颜色

    • alpha:透明度

    • histtype:图类型

    import matplotlib.pyplot as plt
    import numpy as np
    
    data = np.random.randn(1000)
    plt.hist(data, bins=30, alpha=0.3, histtype='stepfilled', color='blue', edgecolor='none')
    plt.show()

    程序中 random.randn 与 random.rand 相比,randn表示随机生成的数符合正态分布,因此画出图来是如上图所示。

    子图

    plt.subplot(2,1,1) # 子图,(2,1,1)代表,创建2*1的画布,并且定位于画布1 ;等效于plt.subplot(211),即去掉逗号
    # subplots 可以同时创建多个子图
    figure,ax = plt.subplots(2, 3) 
    # 这是一个灵活创建子图的方法,可以创建任意组合的图形,不必一一对齐,以下为示例:
    grid = plt.GridSpec(2, 3, wspace=0.3, hspace=0.2)
    plt.subplot(grid[,:2])
    plt.subplot(grid[1,1:3])

    图例配置

    文字注释

    通过不同的坐标变换,可以把文字放在不同的位置:

    • ax.transData:以数据为基准

    • ax.transAxes:以轴为基准

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    ax.axis = ([0, 1, 0, 1])
    
    ax.text(0.5, 0.5, "Data:(0.5, 0.5)", transform=ax.transData)
    ax.text(0.5, 0.1, "Axes:(0.5, 0.1)", transform=ax.transAxes)
    plt.show()

    箭头注释

    • plt.arrow:产生SVG向量图形式的箭头,会随着分辨率改变而改变,不推荐

    • plt.annotate:可以创建文字和箭头

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    
    x = np.linspace(0, 20, 1000)
    ax.plot(x, np.cos(x))
    ax.axis('equal')
    
    ax.annotate("max", xy=(6.28, 1), xytext=(10, 4), arrowprops=dict(facecolor='black', shrink=0.05))
    ax.annotate('min', xy=(5 * np.pi, -1), xytext=(2, -6), arrowprops=dict(arrowstyle="->", connectionstyle='angle3, angleA=0, angleB=-90'))
    plt.show()

    三维图

    基础三维图

    matplotlib 中绘制三维图用到 mplot3d 包。导入 mplot3d 包后,可以利用 projection 参数,控制绘制三维图。

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits import mplot3d
    
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    
    plt.show()

    三维图中当然包含三个轴,x,y,z。画线 ax.plot3D,画点 ax.scatter3D。为了三维效果,它会自动将远处的点颜色变浅。

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits import mplot3d
    
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    
    z = np.linspace(0, 15, 100)
    x = np.sin(z)
    y = np.cos(z)
    
    ax.plot3D(x, y, z, 'red')
    ax.scatter3D(x, y, z, 'blue')
    plt.show()

     

    三维等高线

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits import mplot3d
    
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    
    def f(x, y):
      return np.sin(np.sqrt(x ** 2 + y ** 2))
    
    x = np.linspace(-6, 6, 30)
    y = np.linspace(-6, 6, 30)
    X, Y =np.meshgrid(x, y)
    Z = f(X, Y)
    
    ax.contour3D(X, Y, Z, 50)
    plt.show()

    图形绘制出来后,可以通过 ax.view_init 来控制观察的角度,便于理解。

    • 俯仰角度:x-y 平面的旋转角度

    • 方位角度:沿着 z 轴顺时针旋转角度

    pandas绘图

    上篇文章讲述了 pandas 的基本用法,pandas 是数据分析中最重要的工具之一,这里补充一下 pandas 绘图。

    Series绘图

    # 这是一个小栗子
    s1 = Series(np.random.randint(1000).cumsum()) # 创建series,cumsum()是指叠加求和,本位数是前几项之和
    s1.plot() # series有自己的plot函数,里面可以写入想要的参数

    DataFrame绘图

    df = DataFrame(
        np.random.randint(1,10,40).reshape(10,4),
        columns=['A','B','C','D']
        )
    df.plot()
    # dataframe也有自己的plot,按列画出来,参数包含ax,选择输出的画布
    # 参数:stacked=True,表示一个堆叠的情况,同一个index下,columns一不同颜色叠在一起
    
    
    作者:渔单渠 微信搜索“小田学Python”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    kafka基础
    springboot启动过程(3)-refresh方法
    springboot启动过程(2)-run方法
    springboot启动过程(1)-初始化
    springBoot数据库jpa+对接mybatis
    spirng boot web配置开发
    spring boot 入门
    jetty分析
    NIO/AIO
    使用jsPDF 和jspdf-autotable 导出中文表格页面
  • 原文地址:https://www.cnblogs.com/yudanqu/p/12662470.html
Copyright © 2011-2022 走看看