04matplotlib

作者: __method__ | 来源:发表于2019-06-11 08:50 被阅读153次

    Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。


    官方网站http://matplotlib.org
    • 用于创建出版质量图表的绘图工具库
    • 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建
    • 目的是为Python构建一个Matlab式的绘图接口
    • pyploy模块包含了常用的matplotlib API函

    线性图

    简单线性图

    在图表的所有类型中,线性图最为简单。线性图的各个数据点由一条直线来连接. 一对对(x, y)值组成的数据点在图表中的位置取决于两条轴(x和y)的刻度范围.

    如果要绘制一系列的数据点,需要创建两个Numpy数组. 首先, 创建包含x值的数组, 用作x轴. 再创建包含y值得数组,用作y轴. 完成了两个数组创建,只需要调用plot()函数绘制图像即可.

    from matplotlib import pyplot as plt
    import numpy as np
    
    # 生成[0, 2π]之间的等间距的100个点
    x = np.linspace(0, 2* np.pi,num=100)
    
    y = np.sin(x)
    
    plt.plot(x,y)
    plt.show()
    

    线条和标记节点样式: 标记字符:标记线条中的点:

    • 线条颜色,color='g'
    • 线条风格,linestyle='--'
    • 线条粗细,linewidth=5.0
    • 标记风格,marker='o'
    • 标记颜色,markerfacecolor='b'
    • 标记尺寸,markersize=20
    • 透明度,alpha=0.5
    • 线条和标记节点格式字符 如果不设置颜色,系统默认会取一个不同颜色来区别线条.



      接下来我们绘制一个样式较全的线形图:

    import numpy as np
    import matplotlib.pyplot as plt
    # 设置中文字体,否则中文会出现方框状
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    x = np.linspace(0, 2* np.pi,num=10)
    y = np.sin(x)
    # 调用绘制线性图函数plot()
    plt.plot(x, y, 
             color='#3589FF',  # 线的颜色
             linestyle=':',  # 线的风格
             linewidth=3,  # 线的宽度
             marker='o',   # 标记点的样式
             markerfacecolor='r',  # 标记点的颜色
             markersize=10,  # 标记点的大小
             alpha=0.7,  # 图形的透明度
             label="cos(x)"
    )  
    plt.show()
    

    绘制多条折线

    # 绘制多条折线
    x = np.linspace(0, 2* np.pi,num=20)
    y = np.sin(x)
    # 调用绘制线性图函数plot()
    plt.plot(x, y, 
             color='#3589FF',  # 线的颜色
             linestyle=':',  # 线的风格
             linewidth=3,  # 线的宽度
             marker='o',   # 标记点的样式
             markerfacecolor='r',  # 标记点的颜色
             markersize=10,  # 标记点的大小
             alpha=0.7,  # 图形的透明度
             label="sin(x)"  #设置图例的label
    )  
    
    siny = y.copy()
    cosy = np.cos(x)
    plt.plot(x, cosy, 
             color='y',  # 线的颜色
             linestyle='-',  # 线的风格
             linewidth=3,  # 线的宽度
             marker='*',   # 标记点的样式
             markerfacecolor='b',  # 标记点的颜色
             markersize=15,  # 标记点的大小
             alpha=0.9,  # 图形的透明度
             label="cos(x)" #设置图例的label
    )
    
    # 设置x,y轴的label
    plt.xlabel('时间(s)')
    plt.ylabel('电压(V)')
    plt.legend()
    plt.title('电压随时间变化的线性图')
    # 调用show方法显式
    plt.show()
    

    将DataFrame绘制成线性图

    from pandas import DataFrame,Series
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    %matplotlib inline
    data_frame = DataFrame({
        '东软熙康': np.random.randint(10, 100, 5),
        '东软医疗': np.random.randint(10, 100, 5),
        '东软睿道': np.random.randint(10, 100, 5),
    })
    
    
    plt.plot(data_frame, marker='o')
    # 显示图例
    plt.legend(data_frame, loc=2)
    # 设置x轴刻度标签
    plt.xticks([0, 1, 2, 3, 4], ['first', 'secod', 'third', 'forth', 'fifth'])
    
    plt.title('东软子公司1-5月份在职人员数量')
    plt.xlabel('月份')
    plt.ylabel('在职人数(百人)')
    
    # True 显示网格  
    # linestyle 设置线显示的类型(一共四种)  
    # color 设置网格的颜色  
    # linewidth 设置网格的宽度   
    # plt.grid(True, linestyle = "-.", color = "r", linewidth = "3")
    plt.grid()
    
    # 显示图形
    plt.show()
    

    条状图

    条状图也是非常常用的一种图表类型.
    条形图是统计图资料分析中最常用的图形。主要特点有:

    • 能够使人们一眼看出各个各个项目数据的大小。
    • 易于比较各个不同项目数据之间的差别。

    垂直条状图

    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    index = np.arange(5)
    values1 = np.random.randint(11, 20, 5)
    values2 = np.random.randint(11, 20, 5)
    values3 = np.random.randint(11, 20, 5)
    
    # bar宽度
    bar_width = 0.3
    
    # 每一个bar占0.3宽度
    plt.bar(index-bar_width, values1, width=bar_width, alpha=0.7, label='社保项目1', color='b')
    plt.bar(index, values2, width=bar_width, alpha=0.7, label='社保项目2', color='r')
    plt.bar(index+bar_width, values3, width=bar_width, alpha=0.7, label='社保项目3', color='g')
    
    
    # 显示图例
    plt.legend(loc=1)
    
    # 设置X轴、Y轴数值范围
    # plt.xlim(-0.5, 5)
    # plt.ylim(10, 20)
    plt.axis([-0.6, 5, 10, 20])
    
    # 设置x轴刻度标签 rotation旋转角度
    plt.xticks(index, ['社保项目'+str(ix) for ix in range(1, 6)], rotation=30)
    
    # 设置标题
    plt.title('社保项目营收', fontsize=20)
    plt.xlabel('项目类型')
    plt.ylabel('项目合同额(亿元)')
    
    
    # 显示数值标签
    for a,b in zip(index, values1):
        plt.text(a-bar_width, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
    
    for a,b in zip(index, values2):
        plt.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
    
    for a,b in zip(index, values3):
        plt.text(a+bar_width, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
    
    
    # 显示网格
    plt.grid()
    
    plt.show()
    

    水平条状图

    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 绘制水平条状图
    index = np.arange(5)
    values1 = np.random.randint(10, 17, 5)
    values2 = np.random.randint(10, 17, 5)
    values3 = np.random.randint(10, 17, 5)
    
    # 绘制条状图
    bar_height = 0.3
    plt.barh(index, values1, height=0.3, label='社保项目1', color='r')
    plt.barh(index+bar_height, values2, height=0.3, label='社保项目2', color='b')
    plt.barh(index+bar_height*2, values3, height=0.3, label='社保项目2', color='y')
    
    # y轴标签
    plt.yticks(index + bar_height, list('ABCDE'))
    
    # 显示数值标签
    for a, b in zip(values1, index):
        plt.text(a, b, '%.0f' % a, ha='left', va= 'center', fontsize=7)
    
    for a, b in zip(values2, index):
        plt.text(a, b+bar_height, '%.0f' % a, ha='left', va= 'center', fontsize=7)
    
    for a, b in zip(values3, index):
        plt.text(a, b+bar_height*2, '%.0f' % a, ha='left', va= 'center', fontsize=7)
    
    # 设置标题
    plt.title('社保项目营收', fontsize=20)
    plt.xlabel('项目类型')
    plt.ylabel('项目合同额(亿元)')
    
    
    plt.axis([0, 20, -0.4, 5])
    plt.legend(loc=4)
    
    plt.show()
    

    饼图

    除了条状图, 饼图也可以用来表示数据.用pie()函数制作饼图很简单.

    from pandas import Series, DataFrame
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    %matplotlib inline
    
    # 设置图像大小
    plt.figure(figsize=(9,9))
    
    # 设置标签
    labels = ['Java开发', '项目经理', '测试运维人员', 'Python开发', '架构师']
    # 标签对应的值
    values = [6000, 1000, 2000, 7000, 500]
    # 每一个标签饼图的颜色
    colors = ['red', '#FEDD62', 'blue', 'gray', 'green']
    # 那一块内容需要脱离饼图凸显, 可选值0-1
    explode = [0.1, 0.1, 0, 0, 0]
    # autopct='%1.1f%%'表示显示百分比
    # shadow显示阴影
    # startangle 正值表示逆时针旋转
    plt.pie(values, 
          labels=labels, 
          colors=colors, 
          explode=explode, 
          startangle=90, 
          shadow=True, 
          autopct='%1.1f%%')
    
    # 设置为标准圆形
    plt.axis('equal')
    
    # 显示图例
    plt.legend(loc=2)
    plt.title('东软软件工程师人员职位占比')
    
    plt.show()
    

    散点图

    用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。

    简单的散点图绘制
    from matplotlib import pyplot as plt
    import numpy as np
    
    # 散点  横轴和纵轴都是特征
    
    x = np.random.normal(0, 1, 100) # 均值为0 方差为1 正态分布
    y = np.random.normal(0, 1, 100)
    
    plt.scatter(x, y)
    plt.show()
    
    x = np.random.normal(0, 1, 100000)
    y = np.random.normal(0, 1, 100000)
    plt.scatter(x, y)
    plt.show()
    
    x = np.random.normal(0, 1, 100000)
    y = np.random.normal(0, 1, 100000)
    plt.scatter(x, y,alpha=0.1)
    plt.show()
    

    案例:绘制机器学习中经典数据集-鸢尾花

    # 加载鸢尾花数据集
    from sklearn import datasets
    
    iris = datasets.load_iris()
    
    iris.keys()
    
    dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
    
    #print(iris.DESCR)
    
    iris.feature_names
    
    ['sepal length (cm)',
     'sepal width (cm)',
     'petal length (cm)',
     'petal width (cm)']
    
    iris.target
    
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
    
    iris.target_names
    
    array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
    
    X = iris.data[:,:2]
    
    y = iris.target
    y
    
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
    
    # type(X)
    
    X[:,1]
    
    plt.scatter(X[:,0],X[:,1])
    
    X[y==0].size
    
    100
    
    len(X[y==0][:,0])
    
    50
    
    X[y==0,0] #散点图的x轴   1是y轴
    
    array([5.1, 4.9, 4.7, 4.6, 5. , 5.4, 4.6, 5. , 4.4, 4.9, 5.4, 4.8, 4.8,
           4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5. ,
           5. , 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5. , 5.5, 4.9, 4.4,
           5.1, 5. , 4.5, 4.4, 5. , 5.1, 4.8, 5.1, 4.6, 5.3, 5. ])
    

    绘制萼片维度的散点图

    plt.scatter(X[y==0,0],X[y==0,1],color='r')
    plt.scatter(X[y==1,0],X[y==1,1],color='g')
    plt.scatter(X[y==2,0],X[y==2,1],color='b')
    
    plt.scatter(X[y==0,0],X[y==0,1],color='r',marker='+')
    plt.scatter(X[y==1,0],X[y==1,1],color='g',marker='x')
    plt.scatter(X[y==2,0],X[y==2,1],color='b',marker='o')
    
    花瓣维度的散点图
    X = iris.data[:,2:]
    X
    
    array([[1.4, 0.2],
           [1.4, 0.2],
           [1.3, 0.2],
    
    X[y==0,0]
    
    array([1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4,
           1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1. , 1.7, 1.9, 1.6,
           1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.5, 1.3,
           1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4])
    
    plt.scatter(X[y==0,0],X[y==0,1],color='r',marker='o')
    plt.scatter(X[y==1,0],X[y==1,1],color='g',marker='x')
    plt.scatter(X[y==2,0],X[y==2,1],color='b',marker='+')
    

    绘制多个图像

    在matplotlib中, 一张图像是一个Figure对象. 在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。我们可以通过subplot()函数(子图)在一个Figure上创建多个图像(Axes)

    import numpy as np
    import pandas as pd
    from pandas import Series , DataFrame
    import matplotlib.pyplot as plt
    
    x = np.linspace(0.0,5.0)
    y1 = np.sin(np.pi*x)
    y2 = np.sin(np.pi*x*2)
    
    # subplot(2,1,1) 2行一列的第一个图
    plt.subplot(2,1,1)
    plt.ylabel('y1 value')
    plt.plot(x, y1, 'b--')
    plt.subplot(2,1,2)
    plt.ylabel('y2 value')
    plt.plot(x, y2, 'r--')
    plt.xlabel('x value')
    plt.show()
    
    # 子图位置可以进行简写
    plt.subplot(221)
    plt.plot(x,y1,'b--')
    plt.subplot(222)
    plt.plot(x,y2,'r--')
    plt.subplot(223)
    plt.plot(x,y1,'b*')
    plt.subplot(224)
    plt.plot(x,y2,'y--')
    plt.show()
    
    • 绘制子图的另外一种写法
    # fig是画布, ax是数据
    fig, ax = plt.subplots(2,2)
    
    
    fig, ax = plt.subplots(2,2)
    ax[0][0].plot(x, y1)
    ax[0][1].plot(x, y2)
    ax[1][0].plot(x, y1)
    ax[1][1].plot(x, y2)
    plt.show()
    

    其他可视化绘图工具

    • Seaborn
    • Plotly
    • pyecharts
    • Bokeh

    下面简单介绍一下Seaborn(选学)

    官方地址:http://seaborn.pydata.org/index.html
    Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
    Python中的一个制图工具库,可以制作出吸引人的、信息量大的统计图

    • 在Matplotlib上构建,支持numpy和pandas的数据结构可视化。

    • 多个内置主题及颜色主题

    • 可视化单一变量、二维变量用于比较数据集中各变量的分布情况

    • 可视化线性回归模型中的独立变量及不独立变量

    案例演示
    import numpy as np
    import pandas as pd
    from pandas import Series , DataFrame
    import matplotlib.pyplot as plt
    %matplotlib inline
    import seaborn as sns
    
    df = sns.load_dataset('flights')
    
    df.head()
    
    df.shape
    
    (144, 3)
    
    # 对数据表进行重塑  第一个index是重塑的新表的索引名称是什么,第二个columns是重塑的新表的列名称是什么,
    #一般来说就是被统计列的分组,第三个values就是生成新列的值应该是多少
    df = df.pivot(index='month',columns='year',values='passengers')
    
    df
    
    plt.figure(figsize=(15, 8))
    sns.heatmap(df)
    plt.show()
    
    df.plot(figsize=(10,6))
    plt.show()
    
    plt.figure(figsize=(15, 8))
    sns.heatmap(df,annot=True,fmt='d')
    plt.show()
    
    s = df.sum()
    
    #柱状图的第一种写法
    plt.figure(figsize=(15, 8))
    sns.barplot(s.index,s.values)
    plt.show()
    
    # 柱状图的第二种写法
    plt.figure(figsize=(15, 8))
    
    s.plot(kind='bar')
    plt.show()
    

    相关文章

      网友评论

        本文标题:04matplotlib

        本文链接:https://www.haomeiwen.com/subject/gczxfctx.html