matplotlib基础知识及应用

作者: 我住永安当 | 来源:发表于2020-09-20 18:50 被阅读0次

    一、基础知识

    1、简介

    matplotlib是模仿matlab绘图工具开发的一个开源 python 库。python的其它第三方绘图库都依赖于matplotlib。
    数据分析工作中的绘图更多的是帮助我们理解业务,而不是美观,否则就会使用一些Bi工具了。

    2、基础代码

    导入库

    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline 
    #用来让py显示生成的图形,不用每次绘图后运行plt.show()
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False  #用来正常显示负号
    

    3、绘制图形:通用

    生成变量数据

    x=np.linspace(0,2*np.pi,100)
    y=np.sin(x)
    y1=np.cos(x)
    

    matplotlib生成画布元素

    plt.title('hellow,world!')
    plt.plot(x,y)
    plt.plot(x,y1)
    #如果没有上面的%matplotlib inline代码,则每次生成画布元素后,都需要运行plt.show(),以显示图形。
    

    输出结果:正弦和余弦图像

    image.png

    绘制两个画板
    plt.subplot()使用方法以及参数介绍

    plt.subplot(abc) #a:行数,b:列数,c:索引。三个数字都不能超过10
    #等价于plt.subplot(a,b,c)
    #索引值的意思是把它放在第几个位置。下面有示例
    
    X = np.linspace(0, 2*np.pi,100)
    Y = np.sin(X)
    Y1 = np.cos(X)
    
    plt.subplot(211) 
    plt.plot(X,Y)
    
    plt.subplot(212)
    plt.plot(X,Y1,color = 'r')
    
    输出结果: image.png
    x=np.linspace(0,2*np.pi,100)
    y=np.sin(x)
    y1=np.cos(x)
    plt.subplot(212)
    plt.plot(x,y)
    
    plt.subplot(211)
    plt.plot(x,y1,color='red')
    
    image.png

    3、绘制图形:柱状图和堆叠柱状图(分类变量的频率分布)

    柱状图

    data=[5,25,50,20]
    x=[0,1,2,3]
    plt.bar(x,data)
    #实际上表示传入数组对的值,表示在图像上也就是横纵坐标
    

    也可以用range()写成:

    data=[5,25,50,20]
    plt.bar(range(len(data)),data)
    

    输出结果:


    image.png

    水平柱状图:组数过多,或者组的名字过长,可以把横坐标放到纵轴

    data=[5,25,50,20]
    x=[0,1,2,3]
    plt.barh(x,data)
    

    也可以写成:

    data = [5,25,50,20]
    plt.barh(range(len(data)),data)
    

    输出结果:


    image.png

    堆积柱状图:思路是横坐标偏移

    data = [[5,25,50,20],
            [4,23,51,17],
            [6,22,52,19]]
    x=np.arange(4)
    
    plt.bar(x,data[0],width=0.25,label='A')
    plt.bar(x+0.25,data[1],width=0.25,label='B')
    plt.bar(x+0.50,data[2],width=0.25,label='C')
    
    plt.legend()
    
    image.png

    垂直堆积柱状图:思路是引入bottom参数

    data = [[5,25,50,20],
            [4,23,51,17],
            [6,22,52,19]]
    x = np.arange(4)
    
    plt.bar(x, data[0], width = 0.25, label='A')
    plt.bar(x, data[1], width = 0.25, label='B',bottom = data[0])
    plt.bar(x, data[2], width = 0.25, label='C',bottom = np.array(data[0]) + np.array(data[1]))
    #列表不可以直接相加,但是np.array()可以。
        
    plt.legend()
    

    输出结果:


    image.png

    4、散点图

    x=np.random.rand(50)
    y=np.random.rand(50)
    colors=np.random.randn(50)
    area=np.pi*(15*np.random.rand(50))**2
    
    plt.scatter(x,y,c=colors,alpha=0.5,s=area)
    #alpha:透明度,[0,1],0完全透明,1完全不透明
    #s:散点大小
    #c:colors,可以用数值表示,此处表示随机
    

    运行结果:


    image.png
    x = np.random.rand(50)
    y = np.random.rand(50)
    colors = np.random.randint(0,2,size =50)
    #相当于用颜色将所有点随机分成两类
    area = np.pi * (15 * np.random.rand(N))**2
    
    plt.scatter(x, y, c=colors, alpha=0.5,s = area)
    

    运行结果:


    image.png

    5.条形图:连续变量的概率分布

    在构建直方图之前,我们需要先定义好bin(分组/分箱数),也就是说我们需要先把连续值划分成不同等份,然后计算每一份里面数据的数量。

    a = np.random.rand(100)
    plt.hist(a,bins= 20) #a等分为20分
    plt.ylim(0,15) #限制Y轴高度为0到15
    
    运行结果: image.png
    a = np.random.randn(10000)
    plt.hist(a,bins=50)
    plt.title("标准正态度分布")  
    

    标题乱码的解决:

    plt.rcParams['font.sans-serif']=['SimHei'] 
    

    轴正负号无法显示的解决:

    plt.rcParams['axes.unicode_minus']=False
    
    运行结果: image.png

    6.盒图/箱线图

    x = np.random.randint(20,100,size = (30,3))
    plt.boxplot(x)
    plt.ylim(0,120)
    
    plt.xticks([1,2,3],['A','B','C']) 
    # 在x轴的什么位置填一个 label,我们这里制定在 1,2,3 位置,写上 A,B,C
    #设置x轴刻度值的表现形式。如果要设置Y轴,则为plt.yticks()
    
    plt.hlines(y = np.median(x,axis = 0)[0] ,xmin =0,xmax=3)
    #沿着水平轴画一条线,如果是沿着纵轴则是plt.vlines()
    

    输出结果:


    image.png image.png image.png image.png

    6.给图像增加文字

    data = [[5,25,50,20],
            [4,23,51,17],
            [6,22,52,19]]
    x=np.arange(4)
    
    plt.figure(figsize=(20,5)) #表示figure 的大小为宽、长(单位为inch)
    plt.tick_params(labelsize=15) #坐标轴的label大小为15
              
    x_sub=[0.0,0.25,0.5]
    
    plt.bar(x,data[0],width=0.25,label='A')
    plt.bar(x+x_sub[1],data[1],width=0.25,label='B')
    plt.bar(x+x_sub[2],data[2],width=0.25,label='C')
    
    for i in range(3):
        for a,b in zip(x+x_sub[i],data[i]):
            plt.text(a,b,f'{b}',ha='center',va='bottom',fontsize=13)
    #ha='center'表示居中,va= 'bottom'表示底部对齐,fontsize表示文字大小
    
    #给坐标轴添加标签
    plt.xlabel('组别',fontsize=15)
    plt.ylabel('频数',fontsize=15)
    

    输出结果:


    image.png

    7、用plt.annotate进行注释

    在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个地方的坐标(text只需要一个):被注释的地方xy(x, y)和插入文本的地方xytext(x, y)

    X=np.linspace(0,2*np.pi,100)
    Y=np.sin(X)
    Y_1=np.cos(X)
    
    plt.plot(X,Y)
    plt.plot(X,Y_1)
    
    plt.annotate('SIN CURVE',
                 xy=(2,np.sin(2)), #标记坐标
                xytext=(4,0.75), #文本坐标
                arrowprops=dict(arrowstyle='->'), #连接符,可以用代码'?plt.annotate'查看
                fontsize=15)
    

    输出结果:


    image.png

    8、在一个画板中绘制多个图形

    使用matplotlib制作直方图
    首先,学习画不同类型的直方图。
    (1)先从参数着手

    plt.hist(
        x,
        bins=None, #分箱数,柱子的数量,切分为几组数据。如果横坐标落在箱子中,则频数+1.
        range=None,
        density=None,  #样本的数量差异较大时,需y轴显示该组数据在样本中的百分比比较好
        weights=None,
        cumulative=False, 
        bottom=None,
        histtype='bar', #直方图类型,默认为bar,还有{ ‘barstacked’, ‘step’, ‘stepfilled’}
        align='mid',
        orientation='vertical',
        rwidth=None,
        log=False,
        color=None, #直方图的颜色
        label=None, #直方图的标签
        stacked=False, #是否创建堆积直方图,{False ,True}
        normed=None, #是否进行归一化处理,{False ,1 , True},
        data=None,
        **kwargs,
    )
    **未注释的参数暂不记忆**
    

    (2)归一化处理
    在命令里加上参数normed=True后,直方图也可以被归一化以显示“相对”频率。
    此时,y轴就变成了相对频率(频率=频次/样本总数;相对频率=频率/组距)。

    image.png
    (3)设置画板
    #第一步:设置画板的图像大小和排列形状
    plt.figure(figsize=(20,10))
    fig,axes=plt.subplots(nrows=2,ncols=2)
    #fig,axes是两个通用写法。fig是可以对整个画板再进行配置,axes得到的是子画板的信息
    
    #第二步:拆分子画布
    ax0,ax1,ax2,ax3=axes.flatten()
    #把四个子画板拆分,然后才能添加元素和内容
    
    #第三步:填充画布
    
    #图一:画密度直方图 (参数:normed=1)
    n_bins = 10 #拆分为10组,先赋值
    x = np.random.randn(1000, 3) #正态分布数据,1000*3
    colors = ['red', 'tan', 'lime']
    ax0.hist(x, n_bins, normed=1, histtype='bar', color=colors, label=colors)
    ax0.set_title('bars with legend')
    ax0.legend(fontsize=10)
    
    #图二:画堆叠的密度直方图(参数:normed=1,stacked=True)
    ax1.hist(x, n_bins, normed=1, histtype='bar', stacked=True)
    ax1.set_title('stacked bar')
    
    #图三:画只有轮廓的堆叠直方图(histtype='step',fill=False)
    ax2.hist(x, n_bins, histtype='step', stacked=True, fill=False)
    ax2.set_title('stack step (unfilled)')
    
    #图四:画不同长度数据集的多重直方图
    #Make a multiple-histogram of data-sets with different length
    x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
    ax3.hist(x_multi, n_bins, histtype='bar')
    ax3.set_title('different sample sizes')
    

    运行结果:


    image.png

    相关文章

      网友评论

        本文标题:matplotlib基础知识及应用

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