matplotlib插件 seaborn —— 比较无聊的模块

讨论 我不是赌鬼
Lv5 宗师级炼丹师
发布在 Matplotlib   1766   1
讨论 我不是赌鬼   1766   1

    首先,如果要我用一张图来为seaborn打call,我一定会选择下面这张

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    ax = sns.violinplot(x=[1,2,3,4,5,6,2,2,2,2])
    
    plt.show()

    这图有非常好听的名字,叫Violinplots(小提琴图),是箱线图和内核密度估计值的组合。不过看着高大上,但在数据量少的时候并不实用,反而会误导人。

    本文讲的是seaborn,它是一个基于matplotlib的python数据可视化库。

    我认为这个库主要实现了两个功能:

    • 创建了各种绚丽的样式,算是无审美青年的福音,但是matplotlib以及集成了许多seaborn样式,所以为了style而单独安装seaborn库显得没啥意义;
    • 简化绘图的步骤,将一些基本的拟合算法与绘图函数封装了一下,对新手比较友好,但对熟悉matlib和numpy的人来说反而会觉得有点限制。

    下面可以查看所有内置的包括但不限于seaborn风格,并且随机挑选了4个进行展示(个人觉得没传统的好看)。

    input:print(plt.style.available)
    
    output:
    
    ['bmh', 'classic', 'dark_background', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 
    'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep',
     'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 
    'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn']

    闲话不多说,要上机操作,先安装一下模块

    pip install seaborn

    对于seaborn,我印象比较深的是可视化线性关系与可视化数据集分布,这两种图对新手还是比较友好的,类似SPSS,不需要自己写一大堆函数进行迭代,然后plot出来。现以一次方程为例讲解线性关系图(多项式,logistic均可),因为觉得例程数据不容易理解,所以我们使用自己构造的数据。

    import pandas as pd
    #灰色的窗口就是它造成的
    sns.set(color_codes=True)
    
    #设数据长度是100
    N=100
    
    #随机生成100个a,再生成b=2*a+噪声 
    list=[]
    for i in range(N):
        a = np.random.rand()
        b = 2 * a + np.random.rand()
        list.append([a,b])
    
    #生成DataFrame
    df=pd.DataFrame(list,columns=['x','y'])
    
    #画含有点,一阶拟合曲线,以及置信区间的图像
    sns.lmplot(x='x',y='y',data=df)
    
    plt.show()
    

    当数据非常复杂的时候,一个因变量可能受多个自变量的影响。我们用以下函数生成一个数据集(工资计算公式是我自己乱编的)

    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    import pandas as pd
    
    sns.set(color_codes=True)
    #样本数
    N=1000
    
    list=[]
    #生成N个调查对象
    for i in range(N):
        #公司分别为是鸭店,国企,互联网
        company=['duck','soe','net'][np.random.randint(0,3)]
        #学历0代表低学历,1代表高学历
        qualification=np.random.randint(0,2)
        #性别1代表男,0代表女
        sex=np.random.randint(0,2)
        #工作时间为1~10之间
        time = np.random.randint(1,10)
    
        #不同公司有不同的工资计算方式,
        # 鸭店工资最高的是刚入职的男人,年龄越大工资越低
        #国企主要看时间与学历
        #互联网公司主要看学历
        if company=='duck':
            if sex==1:
                salary = 30*sex-3*time+6*np.random.rand()
            else:
                salary =15+6*np.random.rand()
        elif company=='soe':
            salary = (3+2*qualification)*time+6*np.random.rand()
        else:
            salary = 2*time+10*qualification + 5+10*np.random.rand()
        
        #将个体的数据放在一起
        person=[time,salary,qualification,sex,company]
        #每个人的数据在列表里装好
        list.append(person)
    
    #将数据转化为DataFrame,lmplot的data只接受这种格式
    df=pd.DataFrame(list,columns=['time','salary','qualification','sex','company'])
    

    如果依然只绘制简单的x-y图,图片会是下面这个样子,我们只能得出一些没啥用的结论,比如总体上收入随着工作时间的增长而增长但离散性很大等等。

    #x轴为time,y轴为salary,使用数据集df
    sns.lmplot(x='time',y='salary',data=df)
    plt.show()

    但是,我们把图画成下面的样子就完全不同了,我们可以很清晰的分析出各个因素对工资的影响,从而确定职业规划,比如,先做3年鸭子。

    #hue是图例,在本程序中,图例是公司,在图片上会体现为3种不同颜色的曲线
    #row为性别,性别有(0,1)两种,所以生成的图片会有两行窗口,一行只包含sex=0的数据
    #col为学历,学历有(0,1)两种,所以生成的图片会有两列窗口,一列只包含qualification=0的数据
    #因此生成的图片会有2x2个窗口
    sns.lmplot(x='time',y='salary',hue='company',row='sex',col='qualification',data=df)
    版权声明:作者保留权利,不代表意本站立场。如需转载请联系本站以及作者。

    参与讨论

    回复《 matplotlib插件 seaborn —— 比较无聊的模块

    EditorJs 编辑器

    沙发,很寂寞~
    反馈
    to-top--btn