• 数据展示Matplotlib


    主要内容是Matplotlib库的基本使用和方法

    1 Matplotlib库

    1.1 Matplotlib的介绍

      Python优秀的数据可视化第三方库

      数据可视化就是将数据以特定的图形图像的方式展示出来, 使数据更加的直观明了

      范例网站

      Matplotlib库是由各种可视化类构成, 内部结构复杂

      为了简洁使用, 可以使用matplotlib.pyplot这个绘制各类可视化图形的命令子库, 类似于快捷方式的库来简化操作

      导入

    import matplotlib.pyplot as plt

        同样plt也是约定俗成的别名

      基本使用

        使用plt.plot(数组)传入数组, 如果只有一个一维数组, 那么数组的值会指定给Y轴, X轴为他们的索引值

        使用plt.ylabel(名字)设置Y轴的名字

        使用plt.savefig(文件名, dpi=dpi的大小)保存图像为图像文件, dpi一般设置为600, 默认是PNG格式保存

        使用plt.show()在IPython中展示生成的图形

        使用plt.axis([x1, x2, y1, y2])可以设置X轴的起点和终点, Y轴的起点和终点

        相关代码如下

    import matplotlib.pyplot as plt
    
    plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])
    plt.ylabel("Y")
    plt.axis([-1, 10, 0, 6])
    plt.savefig("test", dpi=600)
    plt.show()
    

        相关结果如下

        

      pyplot的绘图区域

        使用plt.subplot(nrows, ncols, plot_number)在全局绘图区域中创建一个分区体系, 然后指定在哪个子区域里绘图

        其中nrows表示横向划分多少的区域, ncols表示纵向划分多少的区域, 子区域的标号是从1开始的, 从上到下从左到右依次排序

        另外在数量小的时候, 这三个参数之间的逗号可以去掉

        具体代码如下

    import numpy as np
    import matplotlib.pyplot as plt
    
    def f(t):
        return np.exp(-t) * np.cos(2*np.pi*t)
    
    a = np.arange(0.0, 5.0, 0.02)
    
    plt.subplot(211)
    plt.plot(a, f(a))
    
    plt.subplot(2,1,2)
    plt.plot(a, np.cos(2*np.pi*a), 'r--')
    plt.show()
    

        具体效果如下

        

    1.2 pyplot的plot()函数

      plot()的具体形式如下:

    plt.plot(x, y, format_string, **kwargs)

        x: X轴的数据, 可以是列表或者数组, 可选项, 但是当绘制多条曲线的时候, 各条曲线的x不能省略

        y: Y轴的数据, 列表或数组, 必填项

        format_string: 控制曲线的格式的字符串, 可选项

        **kwargs: 第二组或更多的 (x, y, format_string)

        绘制多条图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.arange(10)
    plt.plot(a, 1.5*a, a, 2.5*a, a, 3.6*a, a, 4.5*a)
    plt.show()
    

        结果为

        

      曲线的格式控制

        format_string由制颜色字符, 风格字符和标记字符组成

        具体有

        

        

        

        更改之前的风格代码

    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.arange(10)
    plt.plot(a, 1.5*a, 'go-', a, 2.5*a, 'rx', a, 3.6*a, '*', a, 4.5*a, 'b-.')
    plt.show()
    

        效果为

        

      关于**kwargs

        可以添加更多更详细的参数

        color: 控制颜色, color="green"

        linestyle: 线条风格, linestyle="dashed"

        marker: 标记风格, marker="o", 这三个和前面的format是对应的, 此外还有

        markerfacecolor: 标记的颜色, markerfacecolor="blue"

        markersize: 标记的尺寸, markersize=20

        ...

    1.3 pyplot的中文显示

      默认情况下, pyplot并不支持中文字符, 在最开始的折线图中, 如果设置ylabel()为中文, 则在图像中不能正常显示

      要显示中文有种办法

      1) 使用rcParams

        设置其font.family为中文字符

        具体代码如下

    import matplotlib.pyplot as plt
    import matplotlib
    
    matplotlib.rcParams['font.family'] = 'SimHei' 
    plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])
    plt.ylabel("Y轴坐标")
    plt.axis([-1, 10, 0, 6])
    plt.savefig("test", dpi=600)
    plt.show()
    

        具体效果

        

          其中SimHei是黑体

        具体更多参数

        

        相应的中文字体种类

        

        参考实例

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    
    matplotlib.rcParams['font.family'] = 'FangSong' 
    matplotlib.rcParams['font.size'] = 20
                      
    a = np.arange(0.0, 5.0, 0.02)
    
    plt.xlabel("X轴: 时间")
    plt.ylabel("Y轴: 振幅")
    
    plt.plot(a, np.cos(2*np.pi*a)+1, 'r--')
    plt.savefig('test2', dpi=600)
    plt.show()
    

        效果为

      

      2) 增加 fontproperties属性

        在上述的例子中, 可以在xlabel中增加参数fontproperties来限定显示的字体, 用此来解决中文显示

        具体代码如下

    import numpy as np
    import matplotlib.pyplot as plt
                      
    a = np.arange(0.0, 5.0, 0.02)
    
    plt.xlabel("X轴: 时间", fontproperties="FangSong", fontsize=20)
    plt.ylabel("Y轴: 振幅", fontproperties="FangSong", fontsize=20)
    
    plt.plot(a, np.cos(2*np.pi*a)+1, 'r--')
    plt.show()
    

      两种方法的区别就是第一种是全局修改, 第二种是指定修改

      建议使用第二种方法, 但是为了统一可以使用方法一

    1.4 pyplot的文本显示

      常见的文本显示函数是

        

        其中title会在整个图形的正中上放写上文字

      具体实例如下

    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.arange(0.0, 5.0, 0.02)
    plt.plot(a, np.cos(2*np.pi*a)+2, 'r--')
    
    
    plt.xlabel("X轴: 时间", fontproperties="FangSong", fontsize=15, color='green')
    plt.ylabel("Y轴: 振幅", fontproperties="FangSong", fontsize=15)
    plt.title(r'正玄波实例$y=cos(2pi x)$', fontproperties="SimHei", fontsize=25)
    plt.text(2, 3, r'$mu=100$', fontsize=15)
    
    plt.axis([-1, 6, 0, 4])
    plt.grid(True)
    plt.savefig('test3', dpi=600)
    plt.show()
    

      效果为

      

      其中$$这种是LeTeX的语法

      title()第一个参数表示横坐标的位置, 第二个参数是纵坐标的位置

      grid(True)增加网格显示

      关于annotate函数

    plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)

        s: 要注解的字符串

        xy: 箭头所在的位置, 元组类型

        xytext: 文本显示的位置, 元组类型

        arrowprops: 定义了整个箭头显示的属性, dict()

          facecolor="颜色" 箭头的颜色

          shrink 起始会按照指定的比例缩进, 这样箭头与两边的内容会留有一下空白

          width 箭头的宽度

      具体代码如下

    import numpy as np
    import matplotlib.pyplot as plt
    
    a = np.arange(0.0, 5.0, 0.02)
    plt.plot(a, np.cos(2*np.pi*a)+2, 'r--')
    
    
    plt.xlabel("X轴: 时间", fontproperties="FangSong", fontsize=15, color='green')
    plt.ylabel("Y轴: 振幅", fontproperties="FangSong", fontsize=15)
    plt.title(r'正玄波实例$y=cos(2pi x)$', fontproperties="SimHei", fontsize=25)
    plt.annotate(r"$mu=100$", xy=(2, 3), xytext=(3, 3.5), arrowprops=dict(
            facecolor="black", shrink=0.1, width=2
            ))
    
    plt.axis([-1, 6, 0, 4])
    plt.grid(True)
    plt.savefig('test3', dpi=600)
    plt.show()
    

      效果为

      

    1.5 绘制子绘图区域

      使用subplot可以进行简单的分区, 具体实现复杂的分区需要另一个函数

      plt.subplot2grid() 

    plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)

        基本使用方法是: 先将整个布局进行均分, 然后指定一块小区域作为起始点, 然后使用colspan和rowspan来在横向和纵向上增加小块的个数

        GridSpec: 整体划分, 元组类型

        CurSpec: 指定起始小块位置, 元组类型

        colspan: 横向小块数量

        rawspan: 纵向小块数量

        选择实例:

        

      使用GridSpec类可以简化操作

        导入

    import matplotlib.gridspec as gridspec

        生成gridspec对象

    gs = gridspec.GridSpec(3, 3)

        使用切片的方式来获取

        具体如下

        

    2 基础绘图函数

    2.1 基础图标函数概述

      使用绘制函数的基本思想:

        图像的种类是繁多的, 我们应该专注于选择与更合适的图表来结合数据, 而不是学习使用所有的函数

      

      

      

    2.2 饼图的绘制

      常用于百分比的内容, 尤其是需要对比组成部分, 占有比例的时候, 更是直观

      生成饼图的函数pie

    plt.pie(sizes, explode=(), labels=(), autopct="", shadow=False, startangle=90)

        sizes: 元组类型, 各个成分的占比

        explode: 元组类型, 优先级, 优先级高的会突出来, 为0是正常组成部分

        labels: 各个部分对应的标签名字, 要和sizes对应上

        autopct: 显示比例的格式

        shadow: 是否有阴影

        startangle: 起始绘图时候的角度, 和极坐标角度类似

      具体实例

    import matplotlib.pyplot as plt
    
    labels = "Python", "Java", "C/C++", "C#", "Javascript", "Other"
    sizes = [31.2, 19.6, 15.9, 7.4, 3.6, 22.3]
    explode = [0.1, 0, 0 ,0 , 0, 0]
    
    plt.pie(sizes, explode=explode, labels=labels, autopct="%.2f%%", shadow=True, startangle=90)
    
    plt.title(r'2015最受欢迎的编程语言', fontproperties="SimHei", fontsize=15)
    plt.show()
    

      具体效果

      

      如果希望图形不是侧着的, 可以使用

    plt.axis('equal')

    2.3 直方图的绘制

      使用hist画直方图

    hist(x, bins, normed, histtype, facecolor, alpha)

        x: 处理的数据

        bins: 生成的图形中, 直方(在X轴上直立的长条矩形)的个数

          具体情况是: 找到x中的最小值和最大值, 然后在这个值域中均分bins份, 每一份都是一个小的值域, x中的元素就会对应的落在相应的值域中, Y轴的值就是在这个值域的数量(normed=False时)

        normed: 为True会归一化成概率, 为False时Y轴显示的是数量, 默认为False

        具体代码如下

    import numpy as np
    import matplotlib.pylab as plt
    
    np.random.seed(0)
    mu, sigma = 100, 20
    a = np.random.normal(mu, sigma, size=100)
    
    
    plt.hist(a, 30, normed=False, histtype='stepfilled', facecolor='b',
             alpha=0.75)
    plt.title("Histogram")
    
    plt.show()
    

      效果如下

      

    2.4 极坐标的绘制

      绘制极坐标用

    ax = plt.subplot(111, projection='polar')

        通过生成一个对象ax, 来绘制极坐标的图像

        通过ax.bar()来设置图像

    bar(left, height, width=0.8, bottom=None, **kwargs)

          left: 绘制极坐标时的开始位置, 图中的某个位置

          height: 中心点向边界延伸的长度

           旋转的宽度

      具体代码如下

    import matplotlib.pylab as plt
    import numpy as np
    
    N = 20
    theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)
    radii = 10*np.random.rand(N)
    width = np.pi/4*np.random.rand(N)
    
    ax = plt.subplot(111, projection='polar')
    bars = ax.bar(theta, radii, width=width, bottom=0.0)
    
    for r, bar in zip(radii, bars):
        bar.set_facecolor(plt.cm.viridis(r/10.))
        bar.set_alpha(0.5)
    
    plt.show()
    

      具体效果为

      

    2.5 散点图的绘制

      具体代码

    import matplotlib.pylab as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    ax.plot(10*np.random.random(100), 10*np.random.randn(100), 'o')
    ax.set_title("simple Scatter")
    
    plt.show()
    

      具体效果

      

    3 引力波的绘制

    3.1 介绍

      引力波是因为时空弯曲对外以辐射形式传播的能量

      爱因斯坦的广义相对论预言了引力波的存在

    3.2 编写

      产生时间序列

      读取应变数据

      绘制H1 Strain

      显示并保存图像   

    人若有恒 无所不成
  • 相关阅读:
    软件的开发流程(摘录百度百科)
    linux大全
    percona server 二进制安装下编译tpcc-mysql的坑
    Problems with MMM for mysql(译文)
    MySQL MMM 双主在Failover时挂起
    Steve Loughran:Why not raid 0,its about time and snowflakes!!!
    React-Redux 源码解析
    《图解 HTTP》读书笔记
    图解 HTTP 笔记(八)——常见 Web 攻击技术
    图解 HTTP 笔记(七)——HTTPS
  • 原文地址:https://www.cnblogs.com/weihuchao/p/6860665.html
Copyright © 2020-2023  润新知