精华内容
下载资源
问答
  • Seaborn 画图

    2020-12-02 10:08:26
    seaborn 可以直接画图,或者可以用来修改 matplotlib 的画图 style 修改 Matplotlib 画图 style import matplotlib.pyplot as plt import numpy as np import seaborn as sns plt.rcParams['font.sans-seri


    seaborn 是 matplotlib 一个高级接口,它的底层是用 matplotlib 实现的。区别于后者,它致力于打造现代画图方式,而非经典的 Matlab 格式。

    seaborn 可以直接画图,或者可以用来修改 matplotlib 的画图 style

    预设

    要想画出来的图有些逼格,首先应该进行如下设置

    sns.set(style='ticks',rc={'font.sans-serif':'SimHei','axes.unicode_minus':False})   #用来显示中文
    

    修改 Matplotlib 画图 style

    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    
    plt.rcParams['font.sans-serif']=['SimHei']    #画图时显示中文字体
    plt.rcParams['axes.unicode_minus'] = False     #防止因修改成中文字符,导致某些 unicode 字符不能显示
    plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
                    wspace=0.3)    #设置制子图之间的左右间距,left 等是设置画图区域与画布之间的间
     
    font1 = {'family' : 'SimHei',
    'weight' : 'normal',
    'size'   : 15,
    }   #设置图例(legend)文字的格式的
    
    def myplot(flip=2):
        x = np.linspace(0,20,50)
        for i in range(1,5):
            plt.plot(x,np.cos(x+i*0.8)*(9-2*i)*flip)
    
    myplot()
    

    在这里插入图片描述
    用 Matplotlib 画出的图如上,我们可以用 sns.set() 函数来修改画图风格。具体用法如下:sns.set(context='notebook',style='darkgrid',palette='deep',font='sans-serif',font_scale=1,color_codes=None,rc=None)
    其中:
    context:用于修改绘图的各种元素的格式,默认设置有 notebook、paper、talk、poster
    style:darkgrid、whitegrid、dark、white、ticks
    palette:调色板
    font:字体格式
    font_scale:字体大小
    color_codes:修改颜色空间
    rc:即 matplotlib 的rcParams,接收字典,比如:rc={‘line.linewidth’:2.5}
    我们修改代码:

    sns.set(context='poster',style='whitegrid',palette='deep',font_scale=1.5,color_codes=None)
    myplot()
    

    可得:
    在这里插入图片描述
    也可以用 sns.spine 来修改图中的坐标轴,比如sns.spine()可以移除图中顶部和右侧的轴线:

    sns.set(context='notebook',style='white')
    myplot()
    sns.despine()
    

    在这里插入图片描述
    通过设置 despine 的参数,就能够修改其他轴线,比如 sns.despine(left=True) 可以将左边的轴线删除掉。sns.spine(offset=20) 可以设置轴线偏离画布的距离。

    可以在同一副图中设置不同的绘图风格:

    sns.set(context='notebook',style='ticks')
    plt.subplot(2,1,1)
    myplot()
    sns.set(context='talk',style='darkgrid',font_scale=1)
    plt.subplot(2,1,2)
    myplot(-1)
    

    在这里插入图片描述

    除了用 sns.set() 来设置绘图风格之外,还可以用 sns.axes_style() 和 sns.plotting_context() 来分别设置绘图外观和绘图内容,分别对应 sns.set 的 style 和 context 参数,其取值也是一样的。

    Seaborn 常用绘图

    柱状图

    可以用 sns.barplot(x,y) 来绘制,其中 x 一般是一个离散类别变量。

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.barplot(x=df['species'],y=df['petal_length'])
    

    在这里插入图片描述
    也可以用 sns.barplot(x,y,data) 来绘制。其中 data 是一个 dataframe 变量,x、y 接受 data 的列名,用于指定哪两列来绘图。

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.barplot(x='species',y='petal_length',data=df)
    

    计数图

    用法:sns.countplot(x) 或者 sns.countplot(x,data)。其中 x 为需要计数的变量,一般为类别型变量。x 也可以接受字符串,此时需要补一个 data 参数。data 参数接受一个 dataframe 变量,x 为 data 的某一个列名,用于指示哪一个 data 的列以绘制计数图。

    sns.countplot(x='species',data=df)
    或者
    sns.countplot(x=df['species'])
    

    可得:
    在这里插入图片描述
    并列计数图:sns.countplot(x,hue,data),其中 hue 应为一个类别变量的列名。

    密度图(hist kde)

    sns.distplot(x, bins = None, kde = True, hist = True, rug = False)
    其中 bins 为画频率直方图的“x 轴格子数”,kde 为是否画出概率密度曲线,rug 为是否画出毛毯图;

    dataset = datasets.load_iris(return_X_y = False)
    X = pd.DataFrame(dataset['data'],columns=dataset.feature_names)
    y = dataset['target']     # 导入数据格式
    
    sns.set()   #默认格式
    
    sns.distplot(X['petal width (cm)'],color='g')
    plt.ylabel('Density')
    

    结果如下:
    在这里插入图片描述

    from sklearn import datasets
    
    dataset = datasets.load_iris(return_X_y = False)
    X = pd.DataFrame(dataset['data'],columns=dataset.feature_names)
    y = dataset['target']
    
    d = X['petal width (cm)']
    d1 = X['petal length (cm)']
    
    sns.set(palette='muted')   
    fig = plt.figure(figsize=(8,8))
    plt.subplot(2,2,1)
    sns.distplot(d,color='g',bins=10,label='频数直方图',kde=False)
    plt.legend(prop=font1)
    plt.ylabel('Frequency')
    
    plt.subplot(2,2,2)
    sns.distplot(d,color='b',hist=False,rug=True,label='毛毯图与密度图')
    plt.legend(prop=font1)
    plt.ylabel('Density')
    
    plt.subplot(2,2,3)
    sns.distplot(d,color='m',hist=False,kde_kws={"shade":True},label='概率密度图')
    plt.legend(prop=font1)
    plt.ylabel('Density')
    
    plt.subplot(2,2,4)
    sns.distplot(d,color='y')
    

    在这里插入图片描述
    sns.distplot(

    散点图

    可以用 sns.stripplot(x,y)
    sns.stripplot(d1,d)
    可得:
    在这里插入图片描述
    散点图的绘图函数也可以这样调用:sns.stripplot(x,y,data),其中 x,y 接受字符类型的变量,data 是 dataframe 的变量。x,y 为 dataframe 变量中的列名。

    sns.set(context='paper')
    sns.stripplot(x='sepal length (cm)',y='petal length (cm)',data=X)
    

    在这里插入图片描述

    箱型图

    可以用 sns.boxplot(x,y)

    from sklearn import datasets
    
    dataset = datasets.load_iris(return_X_y = False)
    X = pd.DataFrame(dataset['data'],columns=dataset.feature_names)
    y = dataset['target']
    d = X['petal width (cm)']
    sns.boxplot(y,d)
    

    可得
    在这里插入图片描述
    箱型图也可以用 sns.boxplot(x,y,data) 的方式绘图,其中 data 是 dataframe 变量,x,y接受 data 的列名。

    散点图矩阵

    可以用 sns.pairplot(data,vars=[]) 绘制。其中 data 接受一个 dataframe 数据,vars 接受一个字符串列表,每一个字符串都取自 dataframe 的列名。

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.despine()
    sns.pairplot(df,vars=['sepal_length','sepal_width','petal_length'])
    

    可得:
    在这里插入图片描述
    散点图矩阵中,对角线是频数直方图;其余是两两特征的散点图。

    小提琴图

    小提琴图是箱型图和概率密度图的结合,可以用 sns.violinplot(data) 来绘制,其中 data 是要展示的数据,是一个向量,可以是 array 或者 list 或者 series,代码如下:

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.violinplot(df['petal_length'])
    

    在这里插入图片描述
    也可以用 sns.violinplot(x,y,data) 来绘制多个小提琴。 其中 data 是一个 dataframe 变量, x,y 接受 data 变量的列名,用于指示需要绘制那一列。一般 x 指示的列是离散变量,即类别。

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.violinplot(df['species'],df['petal_length'])
    或者:
    sns.violinplot(x='species',y='petal_length',data=df)
    

    在这里插入图片描述

    混合绘图

    用法为 sns.jointplot(x,y,kind='scatter') 或者 sns.jointplot(x,y,data,kind='scatter'),示例如下:

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.jointplot(df['petal_length'],df['petal_width'])
    

    在这里插入图片描述
    修改 kind = 'kde',从而用密度图代替频率分布图,等高线图代替散点图,如下:

    sns.jointplot(x='petal_length',y='petal_width',data=df,kind='kde')
    

    在这里插入图片描述

    回归图

    回归图可以揭示两个变量之间的线性关系,代码是 sns.regplot(x,y)sns.regplot(x,y,data)

    df = sns.load_dataset('iris')
    sns.set(style='ticks')
    sns.regplot(x=df['petal_length'],y=df['petal_width'])
    或者:
    sns.regplot(x='petal_length',y='petal_width',data=df)
    

    在这里插入图片描述

    案例

    df = sns.load_dataset('titanic')
    display(df.head())
    display(df.isnull().sum())
    
    mean = df['age'].mean()
    print(mean)
    df['age'] = df['age'].fillna(mean)
    df['embarked'] = df['embarked'].fillna('S')
    del df['deck']
    
    sns.set(context='paper',style='white',font_scale=1.25)
    sns.despine()
    sns.distplot(df['age'],bins=15)
    
    df['sex'].value_counts().plot(kind='bar',rot=30,fontsize=16)
    plt.ylabel('数量',fontsize=16)
    plt.xlabel('年龄',fontsize=16)
    plt.show()
    sns.countplot(x=df['sex'])
    
    sns.boxplot(x=df['sex'],y=df['age'])
    sns.countplot(x='class',data=df)
    sns.violinplot(df['class'],df['age'])
    
    sns.countplot(df['alive'],hue=df['class'])
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • seaborn画图

    2019-08-05 07:32:26
    import seaborn as sns sns.catplot(y='TOTAL_FLOW', kind='boxen', data=df)#画箱形图数据分布的特征 sns.distplot(df['TOTAL_FLOW'], color='r')#画直方图数据分布的特征

    import seaborn as sns

    sns.catplot(y='TOTAL_FLOW', kind='boxen', data=df)#画箱形图数据分布的特征

    sns.distplot(df['TOTAL_FLOW'], color='r')#画直方图数据分布的特征

    展开全文
  • Seaborn画图

    2018-06-24 12:17:54
    转自:https://blog.csdn.net/ice_martin/article/details/61617053Matplotlib进阶:Seaborn教程martinMatplotlib进阶Seaborn教程样式管理使用axes_style和set_style控制外观选择颜色可选绘图函数可视化数据的分布...

    转自:https://blog.csdn.net/ice_martin/article/details/61617053

    Matplotlib进阶:Seaborn教程

    martin

    样式管理

    为了能进行后续工作,要进行如下操作:

    >>>import numpy as np
    >>>import matplotlib as mpl
    >>>import matplotlib.pyplot as plt
    >>>import seaborn as sns
    >>> def sinplot(flip=1):
    ...     x = np.linspace(0, 14, 100)
    ...     for i in range(1, 7):
    ...         plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用axes_style()和set_style()控制外观

    有五个预设的seaborn主题:暗网格(darkgrid),白网格(whitegrid),全黑(dark),全白(white),全刻度(ticks)。用来适合不同的应用和个人喜好:

    >>> sinplot()
    >>> plt.show()
    • 1
    • 2

    1.png-68.4kB

    >>> sns.set_style("dark")   # 改变主题
    >>> sinplot()
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-66.8kB

    >>> sns.set_style("white")
    >>> sinplot()
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-68.6kB

    >>> sns.set_style("ticks")
    >>> sinplot()
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-69.5kB

    虽然很容易来回切换,但也可以在with语句中使用axes_style()函数临时设置绘图参数。这样可以采用不同样式的轴制作图形:

    >>> with sns.axes_style("darkgrid"):
    ...     plt.subplot(211)
    ...     sinplot()
    ... 
    >>> plt.subplot(212)
    >>> sinplot(-1)
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.png-98.6kB

    选择颜色(可选)

    见官方文档

    绘图函数

    可视化数据的分布

    当处理一组数据时,通常首先要做的是了解变量是如何分布的。这一节将介绍Seaborn中一些用于展现单变量和双变量分布的绘图工具函数。 
    在进行绘图之前需要引入的包和相应操作:

    >>>import numpy as np
    >>>import pandas as pd
    >>>from scipy import stats, integrate   # 该包包含是常用的数学函数
    >>>import matplotlib.pyplot as plt
    >>>import seaborn as sns                # 一般规定将seaborn简写为sns
    • 1
    • 2
    • 3
    • 4
    • 5

    绘制单变量分布

    在seaborn中想要对单变量分布进行快速了解最方便的就是使用distplot()函数,默认情况下它将绘制一个直方图,并且可以同时画出核密度估计(KDE)。

    >>>x = np.random.normal(size=100)   # 正态分布
    >>>sns.distplot(x)
    >>>plt.show()
    • 1
    • 2
    • 3

    1.png-18.8kB

    • 直方图 
      直方图可能是最显而易懂的,直方图在matplotlib中也有。在seborn中,直方图根据x轴的数据范围会生成各个数据段(bins),在每个数据段中会放入相应的数据而直方图的高度就是落入该数据段的数据的多少。为了说明,我们把密度曲线去掉,相应的我们在图上加上表达数据量多少的小刻度。控制密度曲线的有无通过参数kde来控制,控制数据量刻度的有无使用参数rug:
    >>> x = np.random.normal(size=100)
    >>> sns.distplot(x,kde=False,rug=True)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-6.4kB 
    在绘制直方图时,如果想要指定数据段的多少可以通过参数bins来控制:

    >>> x = np.random.normal(size=100)
    >>> sns.distplot(x,bins=20,kde=False,rug=True)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-7.4kB

    • 核密度估计 
      想要绘制核密度函数只需把直方图抹掉即可,通过参数hist来控制:
    >>> x = np.random.normal(size=100)
    >>> sns.distplot(x,hist=False,rug=True)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-17.9kB 
    如果我们在seaborn中使用kdeplot()函数,我们得到相同的曲线。此函数内部调用了distplot(),但它提供了一个更直接的界面,当只需要密度估计时,更容易访问其他选项,例如将区域阴影化:

    >>> x = np.random.normal(size=100)
    >>> sns.kdeplot(x,shade=True)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-17.9kB

    KDE的带宽(bw)参数控制估计与数据的拟合程度,非常类似于直方图中的bin大小。它对应于我们在上面绘制的内核的宽度:

    >>> x = np.random.normal(0,1,size=30)
    >>> sns.kdeplot(x)
    >>> sns.kdeplot(x,bw=.2,label='bw:0.2')
    >>> sns.kdeplot(x,bw=2,label='bw:2')
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5

    1.png-27.5kB

    • 拟合参数分布

    还可以使用distplot()将参数分布拟合到数据集,并直观地评估它与观察数据的对应程度:

    >>> x = np.random.gamma(6,size=200)
    >>> sns.distplot(x,kde=False,fit=stats.gamma)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-15.3kB

    绘制二元分布

    seaborn可以可视化两个变量的双变量分布。在seaborn中做最简单的方法是使用jointplot()函数,它创建一个多面板图,显示两个变量之间的双变量(或联合)关系以及每个变量的单变量(或边际)分布轴。

    >>> mean,cov = [0,1],[(1,.5),(.5,1)]
    >>> data = np.random.multivariate_normal(mean,cov,200)
    >>> df = pd.DataFrame(data,columns=['x','y'])
    • 1
    • 2
    • 3
    • 散点图

    使二元分布可视化的最熟悉的方法是散点图,其中每个观测值以点和x和y值显示。这是在两个维度上的地毯图:

    >>> sns.jointplot(x='x',y='y',data=df)
    >>> plt.show()
    • 1
    • 2

    1.png-17.7kB

    • Hexbin图 
      直方图的双变量模拟称为“六边形”图,它显示了落入六边形框内的观察值的计数:
    >>> x,y = np.random.multivariate_normal(mean,cov,1000).T
    >>> sns.jointplot(x=x,y=y,kind='hex')
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-48.8kB

    • 核密度估计 
      也可以使用上述核密度估计过程来可视化双变量分布。在seaborn中,这种情节以等高线图显示,并且在jointplot()中作为样式提供:
    >>> sns.jointplot(x="x", y="y", data=df, kind="kde")
    >>> plt.show()
    • 1
    • 2

    1.png-20.1kB

    还可以使用kdeplot()函数绘制二维核密度图:

    >>> f, ax = plt.subplots(figsize=(6, 6))
    >>> sns.kdeplot(df.x, df.y, ax=ax)
    >>> sns.rugplot(df.x, color="g", ax=ax)
    >>> sns.rugplot(df.y, vertical=True, ax=ax) # vertical控制y列数据是否垂直放置
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5

    1.png-60.7kB

    如果希望更连续地显示双变量密度,可以简单地增加轮廓线的数量:

    >>> f,ax = plt.subplots(figsize=(6,6))
    >>> cmap =sns.cubehelix_palette(as_cmap=True,dark=0,light=1,reverse=True)
    >>> sns.kdeplot(df.x,df.y,cmap=cmap,n_levels=60,shade=True)
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4

    1.png-21.5kB

    jointplot()函数使用JointGrid来管理图形。为了令使用达到最大的灵活性,可以直接使用JointGrid来绘制图形。 jointplot()在绘制后返回JointGrid对象,可以使用它添加更多图层或调整可视化的其他方面:

    >>> g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
    >>> g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
    >>> g.ax_joint.collections[0].set_alpha(0)
    >>> g.set_axis_labels("$X$", "$Y$") # 可以使用markdown语法
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5

    1.png-30.5kB

    • 可视化数据集中成对的关系

    要在数据集中绘制多个成对的双变量分布,可以使用pairplot()函数。它将创建一个轴矩阵,并显示DataFrame中每对列的关系。默认情况下,绘制每个变量在对角线上的单变量分布Axes:

    >>> iris = sns.load_dataset("iris") 
    # iris是一个花种类的数据集,seaborn自带,scikit-learn也均包含
    >>> sns.pairplot(iris)
    >>> plt.show()
    • 1
    • 2
    • 3
    • 4

    iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。可通过iris.head()或者iris.info()来预览查看数据集。 
    1.png-81.6kB

    与jointplot()和JointGrid之间的关系非常类似,pairplot()函数构建在PairGrid对象的顶部,可以直接使用来使得作图更具灵活性:

    >>>g = sns.PairGrid(iris)
    >>>g.map_diag(sns.kdeplot)
    >>>g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6)
    • 1
    • 2
    • 3

    1.png-189.8kB

    可视化线性回归关系模型(可选)

    许多数据集包含多个定量变量,分析的目标通常是将这些变量相互关联。我们先前讨论了可以通过显示两个变量的联合分布来实现这一点的函数。然而,使用统计模型来估计两组噪声集合之间的简单关系可能更具意义。本节将介绍如何通过线性回归框架来完成这些工作。seaborn的回归图表主要是为了在视觉上对数据有个客观的认知和指引,有助于在数据分析期间强调数据集中的模式和关系。也就是说,seaborn本身不是用于统计分析的包,如果要获得与回归模型拟合相关的定量度量,应该使用statsmodels。然而,seaborn的目的是通过可视化数据集来快速、简单地探索数据,相比通过统计表探索数据集,这种可视化手段或许会更有帮助和重要。

    使用分类数据绘图

    利用不同类型模型来拟合数据

    我们之前介绍了怎样使用散点图和回归图来拟合数据并可视化两个变量之间的关系同时展现它们是 如何在某一特定类别上是进行变化的。然而,如果某一主要变量是分类的我们该怎么办?在这种情况下散点图和回归图就起不了作用了。解决的办法有很多,所以,为了能绘制这种关系我们这节将会讨论到这些方法。 
    可以将seaborn的分类图分为三组:1、分类变量在每个类别上显示的观测值,2、抽象出每个观测值的分布3、应用统计估计值显示中心趋势测量值的观测值和置信区间。第一组包括函数swarmplot()和stripplot(),第二组包括boxplot()和violinplot(),第三组包括barplot()和pointplot()。尽管这些函数都有其特定的参数用于控制该数据的可视化的详细信息,但这些函数都共用一套基础API来规范如何接收数据。为了能进行后续的讲解,要进行如下操作:

    >>> titanic = sns.load_dataset('titanic')
    >>> tips = sns.load_dataset('tips')
    >>> iris = sns.load_dataset('iris')
    • 1
    • 2
    • 3

    titanic:泰坦尼克遇难人员数据,可通过titanic.head()或者titanic.info()来预览查看数据集。

    分类散点图

    使用stripplot()可以非常简单的将某种分类别的数据展现在散点图上:

    >>> sns.stripplot(x='day',y='total_bill',data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-14.2kB

    在带状图中,散点图通常会重叠,使得很难看到数据的完全分布。解决方案是使用一些随机的“抖动”来调整位置(仅沿着分类轴):

    >>> sns.stripplot(x='day',y='total_bill',data=tips,jitter=True)
    >>> plt.show()
    • 1
    • 2

    1.png-24.5kB

    也可以换种思路,使用函数swarmplot(),它使用避免重叠点的算法定位分类轴上的每个散点图点:

    >>> sns.swarmplot(x='day',y='total_bill',data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-26.6kB

    更方便的是可以使用hue参数添加嵌套的分类变量:

    >>> sns.swarmplot(x='day',y='total_bill',data=tips,hue='sex')
    >>> plt.show()
    • 1
    • 2

    1.png-28.5kB

    通常,seaborn的分类别绘图函数会推断出数据里面的类别顺序,如果数据是pandas类型那么会默认按着pandas的既定顺序给出,如果是其他数据类型,比如string类型,那么将会按着在DataFram的出现顺序给出,但是如果类别是数字类型的将会自动排序:

    >>> sns.swarmplot(x="size", y="total_bill", data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-25.6kB

    如果想要将垂直的散点图横向过来放置在y轴上可以使用orient关键字强制定向,但通常可以颠倒x和y的顺序来改变绘图方向:

    >>> sns.swarmplot(x="total_bill", y="day", hue="time", data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-26.5kB

    观测值分布

    在某种程度上,分类散点图在处理每个类别中的值的分布方面变得有限。seaborn中有几种方法可以方便地汇总这些信息,以便于在类别级别之间轻松的进行比较。这一节我们将要讨论在多个分布之间进行快速比价的方法:

    • 箱型图 
      绘制箱型图的函数是boxplot()。这种图表显示了分布的三个四分位数值以及极值。“晶须”延伸到位于下四分位数和上四分位数的1.5IQR内的点,然后落在该范围之外的数据独立显示。重要的是,箱型图中的每个值都对应于数据中的实际观测值:
    >>> sns.boxplot(x="day", y="total_bill", hue="time", data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-8.9kB

    • 琴型图 
      可以使用不同的方法:violinplot(),它结合boxplot()和分布中描述的核密度估计过程:
    >>> sns.violinplot(x="total_bill", y="day", hue="time", data=tips)
    >>> plt.show()
    • 1
    • 2

    1.png-23.4kB

    统计估计

    通常,要显示值的集中趋势,而不是在每个类别中的分布。Seaborn有两种主要方式来显示这些信息:条形图和点图。

    • 条形图
    >>> sns.barplot(x="sex", y="survived", hue="class", data=titanic)
    >>> plt.show()
    • 1
    • 2

    1.png-10.2kB

    条形图的一种特殊情况是,想要显示每个类别中的观察值数量,而不是根据第二个维度变量的统计量。在seaborn中,使用countplot()函数:

    >>> sns.countplot(x="deck", data=titanic, palette="Greens_d")
    >>> plt.show()
    • 1
    • 2

    1.png-6.9kB

    barplot()和countplot()二者可以与上面讨论的所有选项一起调用:

    >>> sns.countplot(x="deck", hue="class", data=titanic, palette="Greens_d")
    >>> plt.show()
    • 1
    • 2

    1.png-8.9kB

    绘制多面板分类图

    绘制多分类的图形最主要使用的就是factorplot()函数,使用factorplot()的主要优点是,很容易绘图同时观测其他分类变量以此来对照:

    >>> sns.factorplot(x="time", y="total_bill", hue="smoker",
    ...                col="day", data=tips, kind="box", size=4, aspect=.5)
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-10.8kB

    >>> sns.factorplot(x="day", y="total_bill", hue="smoker",
    ...                     col="time", data=tips, kind="swarm")
    >>> plt.show()
    • 1
    • 2
    • 3

    1.png-27.3kB

    展开全文
  • python seaborn画图

    万次阅读 多人点赞 2017-04-03 20:52:21
    python seaborn画图以前觉得用markdown写图文混排的文字应该很麻烦,后来发现CSDN的markdown真是好用的。在做分析时候,有时需要画几个图看看数据分布情况,但总记不住python的绘图函数。今天有空顺便整理下python的...

    python seaborn画图

    以前觉得用markdown写图文混排的文字应该很麻烦,后来发现CSDN的markdown真是好用的。

    在做分析时候,有时需要画几个图看看数据分布情况,但总记不住python的绘图函数。今天有空顺便整理下python的seaborn绘图函数库。
    Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。

    seaborns是针对统计绘图的,方便啊。

    一般来说,seaborn能满足数据分析90%的绘图需求,够用了,如果需要复杂的自定义图形,还是要matplotlit。这里也只是对seaborn官网的绘图API简单翻译整理下,对很多参数使用方法都没有说到,如果需要精细绘图,还是需要参照其seaborn的文档的。

    这里简要介绍常用的图形,常用的参数,其精美程度不足以当做报告绘图,算是做笔记吧。

    1.几个概念

    如果使用过R语言的ggplot2绘图包,对分组分面,统计绘图等概念应该很熟悉,这里也介绍下。

    1.1.分组绘图

    比如说需要在一张图上绘制两条曲线,分别是南方和北方的气温变化,分别用不同的颜色加以区分。在seaborn中用hue参数控制分组绘图。

    1.2.分面绘图

    其实就是在一张纸上划分不同的区域,比如2*2的子区域,在不同的子区域上绘制不同的图形,在matplotlib中就是 add_subplot(2,2,1),在seaborn中用col参数控制,col的全称是columns,不是color,如果辅助col_wrap参数会更好些。后来发现,col可以控制columns的子图,那么row可以控制rows的子图排列。
    如果需要分面绘图,应该使用seaborn的FacetGrid对象,seaborn的一般的绘图函数是没有分面这个参数的。

    1.3.统计函数

    分组绘图的时候,会对分组变量先要用统计函数,然后绘图,比如先计算变量的均值,然后绘制该均值的直方图。统计绘图参数是 estimator,很多情况下默认是numpy.mean。在ggplot2中就大量使用了这种方法。如果不适用统计绘图,就需要先用pandas进行groupby分组汇总,然后用seaborn绘图,多此一举了。

    2.图形分类

    在seaborn中图形大概分这么几类,因子变量绘图,数值变量绘图,两变量关系绘图,时间序列图,热力图,分面绘图等。

    因子变量绘图

    1. 箱线图boxplot
    2. 小提琴图violinplot
    3. 散点图striplot
    4. 带分布的散点图swarmplot
    5. 直方图barplot
    6. 计数的直方图countplot
    7. 两变量关系图factorplot

    回归图
    回归图只要探讨两连续数值变量的变化趋势情况,绘制x-y的散点图和回归曲线。

    1. 线性回归图lmplot
    2. 线性回归图regplot

    分布图
    包括单变量核密度曲线,直方图,双变量多变量的联合直方图,和密度图

    热力图
    1. 热力图heatmap

    聚类图
    1. 聚类图clustermap

    时间序列图
    1. 时间序列图tsplot
    2. 我的时序图plot_ts_d , plot_ts_m

    分面绘图
    1.分面绘图FacetGrid

    3.因子变量绘图

    3.1.boxplot箱线图

    import seaborn as sns
    sns.set_style("whitegrid")
    tips = sns.load_dataset("tips")
    # 绘制箱线图
    ax = sns.boxplot(x=tips["total_bill"])
    # 竖着放的箱线图,也就是将x换成y
    ax = sns.boxplot(y=tips["total_bill"])

    这里写图片描述

    # 分组绘制箱线图,分组因子是day,在x轴不同位置绘制
    ax = sns.boxplot(x="day", y="total_bill", data=tips)

    这里写图片描述

    # 分组箱线图,分子因子是smoker,不同的因子用不同颜色区分
    # 相当于分组之后又分组
    ax = sns.boxplot(x="day", y="total_bill", hue="smoker",
                        data=tips, palette="Set3")

    这里写图片描述

    # 改变线宽,linewidth参数
    ax = sns.boxplot(x="day", y="total_bill", hue="time",
                        data=tips, linewidth=2.5)
    
    # 改变x轴顺序,order参数
    ax = sns.boxplot(x="time", y="tip", data=tips,
                        order=["Dinner", "Lunch"])
    # 对dataframe的每个变量都绘制一个箱线图,水平放置
    iris = sns.load_dataset("iris")
    ax = sns.boxplot(data=iris, orient="h", palette="Set2")

    这里写图片描述

    箱线图+有分布趋势的散点图–>的组合图

    # 箱线图+有分布趋势的散点图
    # 图形组合也就是两条绘图语句一起运行就可以了,相当于图形覆盖了
    ax = sns.boxplot(x="day", y="total_bill", data=tips)
    ax = sns.swarmplot(x="day", y="total_bill", data=tips, color=".25")

    这里写图片描述

    3.2.violinplot小提琴图

    小提琴图其实是箱线图核密度图的结合,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计(在概率论中用来估计未知的密度函数,属于非参数检验方法之一)。

    import seaborn as sns
    sns.set_style("whitegrid")
    tips = sns.load_dataset("tips")
    # 绘制小提琴图
    ax = sns.violinplot(x=tips["total_bill"])

    这里写图片描述

    # 分组的小提琴图,同上面的箱线图一样通过X轴分组
    ax = sns.violinplot(x="day", y="total_bill", data=tips)

    这里写图片描述

    # 通过hue分组的小提琴图,相当于分组之后又分组
    ax = sns.violinplot(x="day", y="total_bill", hue="smoker",
                            data=tips, palette="muted")

    这里写图片描述

    # 分组组合的小提琴图,其实就是hue分组后,各取一半组成一个小提琴图
    ax = sns.violinplot(x="day", y="total_bill", hue="smoker",
                            data=tips, palette="muted", split=True)

    这里写图片描述

    # 调整x轴顺序,同样通过order参数
    ax = sns.violinplot(x="time", y="tip", data=tips,
                        order=["Dinner", "Lunch"])

    这里写图片描述

    其他的样式不常用,就不贴上来了。

    3.3.stripplot散点图

    需要注意的是,seaborn中有两个散点图,一个是普通的散点图,另一个是可以看出分布密度的散点图。下面把它们花在一起就明白了。

    # 普通的散点图
    ax1 = sns.stripplot(x=tips["total_bill"])
    # 带分布密度的散点图
    ax2 = sns.swarmplot(x=tips["total_bill"])

    这里写图片描述

    # 分组的散点图
    ax = sns.stripplot(x="day", y="total_bill", data=tips)

    这里写图片描述

    # 添加抖动项的散点图,jitter可以是0.1,0.2...这样的小数,表示抖动的程度大小
    ax = sns.stripplot(x="day", y="total_bill", data=tips, jitter=True)

    这里写图片描述

    # 是不是想横着放呢,很简单的,x-y顺序换一下就好了
    ax = sns.stripplot(x="total_bill", y="day", data=tips,jitter=True)

    这里写图片描述

    # 重点来了,分组绘制,而且是分组后分开绘制,在柱状图中,跟分组柱状图类似的。
    # 通过 hue, split 参数控制
    # 1.分组
    ax = sns.stripplot(x="sex", y="total_bill", hue="day",
                        data=tips, jitter=True)
    # 2.分开绘制
    ax = sns.stripplot(x="day", y="total_bill", hue="smoker",
                    data=tips, jitter=True,palette="Set2", split=True)

    这里写图片描述
    这里写图片描述

    # 散点图+小提起图
    # 两条命令一起运行就行了
    ax = sns.violinplot(x="day", y="total_bill", data=tips,inner=None, color=".8")
    ax = sns.stripplot(x="day", y="total_bill", data=tips,jitter=True)

    这里写图片描述

    3.4.swarmplot带分布的散点图

    swarmplt的参数和用法和stripplot的用法是一样的,只是表现形式不一样而已。

    import seaborn as sns
    sns.set_style("whitegrid")
    tips = sns.load_dataset("tips")
    ax = sns.swarmplot(x=tips["total_bill"])

    这里写图片描述

    # 分组的散点图
    ax = sns.swarmplot(x="day", y="total_bill", data=tips)

    这里写图片描述

    # 箱线图+散点图
    # whis 参数设定是否显示箱线图的离群点,whis=np.inf 表示不显示
    ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
    ax = sns.swarmplot(x="tip", y="day", data=tips)

    这里写图片描述

    # 小提琴图+散点图
    ax = sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
    ax = sns.swarmplot(x="day", y="total_bill", data=tips,
                        color="white", edgecolor="gray")

    这里写图片描述

    3.5.pointplot

    Show point estimates and confidence intervals using scatter plot glyphs.
    使用散点图符号显示点估计和置信区间。

    这个我不知道在什么地方用到,不太明白。就先写这个了。

    3.6.barplot直方图

    我不喜欢显示直方图上面的置信度线,难看,所以下面的图形我都设置ci=0.(Size of confidence intervals to draw around estimated values)

    直方图的统计函数,绘制的是变量的均值 estimator=np.mean

    # 注意看看Y轴,看到没,统计函数默认是 mean,
    import seaborn as sns
    sns.set_style("whitegrid")
    tips = sns.load_dataset("tips")
    ax = sns.barplot(x="day", y="total_bill", data=tips,ci=0)

    这里写图片描述

    # 分组的柱状图
    ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips,ci=0)

    这里写图片描述

    # 绘制变量中位数的直方图,estimator指定统计函数
    from numpy import median
    ax = sns.barplot(x="day", y="tip", data=tips, 
                        estimator=median, ci=0)

    这里写图片描述

    # 改变主题颜色
    # palette="Blues_d"
    ax = sns.barplot("size", y="total_bill", data=tips, 
                        palette="Blues_d")

    这里写图片描述

    3.7.countplot计数统计图

    这个很重要,对因子变量计数,然后绘制条形图

    import seaborn as sns
    sns.set(style="darkgrid")
    titanic = sns.load_dataset("titanic")
    ax = sns.countplot(x="class", data=titanic)

    这里写图片描述

    # 分组绘图
    ax = sns.countplot(x="class", hue="who", data=titanic)
    
    # 如果是横着放,x用y替代
    ax = sns.countplot(y="class", hue="who", data=titanic)

    这里写图片描述

    3.8.factorplot

    这是一类重要的变量联合绘图。
    绘制 因子变量-数值变量 的分布情况图。

    # 用小提琴图 反应 time-pulse 两变量的分布情形
    import seaborn as sns
    sns.set(style="ticks")
    exercise = sns.load_dataset("exercise")
    g = sns.factorplot(x="time", y="pulse", hue="kind",
                        data=exercise, kind="violin")

    这里写图片描述

    # 不同的deck(因子)绘制不同的alive(数值),col为分子图绘制,col_wrap每行画4个子图
    titanic = sns.load_dataset("titanic")
    g = sns.factorplot(x="alive", col="deck", col_wrap=4,
                        data=titanic[titanic.deck.notnull()],
                        kind="count", size=2.5, aspect=.8)

    这里写图片描述

    4.回归图

    回归图有两个,我暂时没有看出他们有什么区别,从函数说明来看看吧。
    lmplot: Plot data and regression model fits across a FacetGrid.
    regplot:Plot data and a linear regression model fit.

    4.1.回归图lmplot

    # 线性回归图
    import seaborn as sns; sns.set(color_codes=True)
    tips = sns.load_dataset("tips")
    g = sns.lmplot(x="total_bill", y="tip", data=tips)

    这里写图片描述

    # 分组的线性回归图,通过hue参数控制
    g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)

    这里写图片描述

    # 分组绘图,不同的组用不同的形状标记
    g = sns.lmplot(x="total_bill", y="tip", hue="smoker", 
                    data=tips,markers=["o", "x"])

    这里写图片描述

    # 不仅分组,还分开不同的子图绘制,用col参数控制
    g = sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips)

    这里写图片描述

    # col+hue 双分组参数,既分组,又分子图绘制,jitter控制散点抖动程度
    g = sns.lmplot(x="size", y="total_bill", hue="day", 
                    col="day",data=tips, aspect=.4, x_jitter=.1)

    这里写图片描述

    # 分组绘制,控制size尺寸
    g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",
                    data=tips, col_wrap=2, size=3)

    这里写图片描述

    # 既然col可以控制分组子图的,那么row也是可以控制分组子图的
    g = sns.lmplot(x="total_bill", y="tip", row="sex", 
                    col="time", data=tips, size=3)

    这里写图片描述

    4.2.回归图regplot

    Plot the relationship between two variables in a DataFrame:

    import seaborn as sns; sns.set(color_codes=True)
    tips = sns.load_dataset("tips")
    ax = sns.regplot(x="total_bill", y="tip", data=tips)

    这里写图片描述

    # 控制散点的形状和颜色
    import numpy as np; np.random.seed(8)
    mean, cov = [4, 6], [(1.5, .7), (.7, 1)]
    x, y = np.random.multivariate_normal(mean, cov, 80).T
    ax = sns.regplot(x=x, y=y, color="g", marker="+")

    这里写图片描述

    # 控制回归的置信度,你会看到拟合直线的外面的面积的有变化的
    ax = sns.regplot(x=x, y=y, ci=68)

    这里写图片描述

    # 上面的都是拟合一次曲线,拟合二次曲线通过order=2设置,
    # 拟合一次曲线相当于 order=1
    ans = sns.load_dataset("anscombe")
    ax = sns.regplot(x="x", y="y", data=ans.loc[ans.dataset == "II"],
                    scatter_kws={"s": 80},order=2, ci=None, truncate=True)

    这里写图片描述

    5.数值分布绘图

    5.1.直方图histplot

    直方图hist=True,核密度曲线rug=True

    # 绘制数值变量的密度分布图
    # 默认既绘制核密度曲线,也绘制直方图
    import seaborn as sns, numpy as np
    sns.set(rc={"figure.figsize": (8, 4)}); np.random.seed(0)
    x = np.random.randn(100)
    ax = sns.distplot(x)

    这里写图片描述

    # 只绘制核密度曲线,不绘制直返图
    ax = sns.distplot(x, rug=True, hist=False)

    这里写图片描述

    # 横着放
    ax = sns.distplot(x, vertical=True)

    这里写图片描述

    5.2.核密度图kdeplot

    # 绘制核密度图
    import numpy as np; np.random.seed(10)
    import seaborn as sns; sns.set(color_codes=True)
    mean, cov = [0, 2], [(1, .5), (.5, 1)]
    x, y = np.random.multivariate_normal(mean, cov, size=50).T
    ax = sns.kdeplot(x)

    这里写图片描述

    # shade参数决定是否填充曲线下面积
    ax = sns.kdeplot(x, shade=True, color="r")

    这里写图片描述

    # 双变量密度图,相当于等高线图了
    # shade 参数改用颜色深浅表示密度的大小,不过不用,就真的是等高线了
    ax = sns.kdeplot(x, y, shade=True)

    这里写图片描述

    # 分组绘制双变量的核密度图
    # 相当于绘制两个核密度图,通过图可以看到密度中心
    # 类似于挖掘算法中聚类中心绘图
    iris = sns.load_dataset("iris")
    setosa = iris.loc[iris.species == "setosa"]  # 组1
    virginica = iris.loc[iris.species == "virginica"]  # 组2
    
    ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length, 
                        cmap="Reds", shade=True, shade_lowest=False)
    
    ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length, 
                        cmap="Blues", shade=True, shade_lowest=False)

    这里写图片描述

    5.3.双变量关系图jointplot

    joint,顾名思义,就是联合呀。
    Draw a plot of two variables with bivariate and univariate graphs.

    kind参数可以使用不同的图形反应两变量的关系,比如点图,线图,核密度图。

    # 默认绘制双变量的散点图,计算两个变量的直方图,计算两个变量的相关系数和置信度
    import numpy as np, pandas as pd; np.random.seed(0)
    import seaborn as sns; sns.set(style="white", color_codes=True)
    tips = sns.load_dataset("tips")
    g = sns.jointplot(x="total_bill", y="tip", data=tips)

    这里写图片描述

    # 通过kind参数,除了绘制散点图,还要绘制拟合的直线,拟合的核密度图
     g = sns.jointplot("total_bill", "tip", data=tips, kind="reg")

    这里写图片描述

    # 使用六角形代替点图图
    g = sns.jointplot("total_bill", "tip", data=tips, kind="hex")

    这里写图片描述

    # 绘制核密度图
    iris = sns.load_dataset("iris")
    g = sns.jointplot("sepal_width", "petal_length", data=iris, 
                        kind="kde", space=0, color="g")

    这里写图片描述

    # 控制图形的大小和颜色
    g = sns.jointplot("total_bill", "tip", data=tips, 
                        size=5, ratio=3, color="g")

    这里写图片描述

    5.4.变量关系组图pairplot

    就是绘制dataframe中各个变量两两之间的关系图。
    在变量关系图中,最常见的就是 x-y的线图,x-y的散点图,x-y的回归图。其实这三者都可以通过lmplot绘制,只是控制不同的参数而已。x-y的线图,其实就是时间序列图,这里就不说了。
    这里又说一遍散点图,是为了和前面的因子变量散点图相区分,前面的因子变量散点图,讲的是不同因子水平的值绘制的散点图,而这里是两个数值变量值散点图关系。为什么要用lmplot呢,说白了就是,先将这些散点画出来,然后在根据散点的分布情况拟合出一条直线。但是用lmplot总觉得不好,没有用scatter来得合适。

    # x-y 的散点图,不画回归线,fit_reg=False
    
    tips = sns.load_dataset("tips")
    g = sns.lmplot(x="total_bill", y="tip", data=tips,
                    fit_reg=False,hue='smoker',scatter=True)
    
    # 只画回归线,不画散点图,scatter=False
    g = sns.lmplot(x="total_bill", y="tip", data=tips,
                    fit_reg=True,hue='smoker',scatter=False)

    这里写图片描述
    这里写图片描述

    import seaborn as sns; sns.set(style="ticks", color_codes=True)
    iris = sns.load_dataset("iris")
    g = sns.pairplot(iris)

    这里写图片描述

    # 分组的变量关系图,似乎很厉害啊
    g = sns.pairplot(iris, hue="species")

    这里写图片描述

    # hue 分组后,不同的组用不同的形状标记
    g = sns.pairplot(iris, hue="species", markers=["o", "s", "D"])

    这里写图片描述

    # 当然也可以只取dataframe中的一部分变量绘图
    g = sns.pairplot(iris, vars=["sepal_width", "sepal_length"])

    这里写图片描述

    # 对角线默认绘制直方图,当然也可以绘制核密度图
    g = sns.pairplot(iris, diag_kind="kde")
    # 相应的,两变量关系图,也可以绘制线性回归图

    这里写图片描述

    这里写图片描述

    6.热力图

    6.1.热力图heatmap

    import numpy as np; np.random.seed(0)
    import seaborn as sns; sns.set()
    uniform_data = np.random.rand(10, 12)
    ax = sns.heatmap(uniform_data)

    这里写图片描述

    # 改变颜色映射的值范围
    ax = sns.heatmap(uniform_data, vmin=0, vmax=1)

    这里写图片描述

    Plot a dataframe with meaningful row and column labels:
    # 绘制x-y-z的热力图,比如 年-月-销量 的热力图
    flights = sns.load_dataset("flights")
    flights = flights.pivot("month", "year", "passengers")
    ax = sns.heatmap(flights)

    这里写图片描述

    # 绘制热力图,还要将数值写到热力图上
    ax = sns.heatmap(flights, annot=True, fmt="d")

    这里写图片描述

    # 这个图在绘制缺失值分布有用,但是不知道怎么样。
    # Plot every other column label and don’t plot row labels 
    data = np.random.randn(50, 20)
    ax = sns.heatmap(data, xticklabels=2, yticklabels=False)

    这里写图片描述

    7.聚类图clustermap

    暂时不知道怎么用,先这样吧。

    8.时间序列图

    tsplot函数说是绘制时间序列图,还不如说是绘制简单的线图更加合适吧,因为我在绘制带timestap时间索引的pandas.Series时,并没有自动升采样绘图,只是数据有有什么数据就画什么,这在时间序列上应该是不对的。

    因为我遇到这样一种情况,一个产品只在上半年卖,从数据库中取出数据只有每年上半年的数据,下半年没有数据也应该填充为0才对啊,但是seaborn的tsplot没有这个功能。

    下面先介绍tsplot绘制线图吧,传入一个list或者series,直接绘制线图。

    8.1.tsplot时序图

    # Plot a trace with translucent confidence bands:
    # 绘制带有半透明置信带的轨迹:
    # data是多组list的组合,这时候应该绘制多条曲线才对啊,其实不是的,是多组list的均值的序列图(默认)
    import numpy as np; np.random.seed(22)
    import seaborn as sns; sns.set(color_codes=True)
    x = np.linspace(0, 15, 31)
    data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
    ax = sns.tsplot(data=data)

    这里写图片描述

    # tsplot的参数不太懂,直接上图吧
    gammas = sns.load_dataset("gammas")
    ax = sns.tsplot(time="timepoint", value="BOLD signal", 
                    unit="subject", condition="ROI", data=gammas)

    这里写图片描述

    # 绘制不同的置信度拟合图,这个好用
    ax = sns.tsplot(data=data, ci=[68, 95], color="m")

    这里写图片描述

    # 使用不同的统计函数,默认的是均值,这里是中位数
    ax = sns.tsplot(data=data, estimator=np.median)

    这里写图片描述

    8.2.panda线图

    pandas的dataframe本身也有绘图函数,对于常见的分析图形还是很方便的,而且可以在plot函数中指定title等

    sale4.loc[sale4['sku']=='SKU412946',['month','salecount']]\
         .plot(x='month',y='salecount',title='SKU412946')

    这里写图片描述

    8.3.采样的时序图

    这里重点讲一下。如果时序中每天的数据都有还好说,如果没有,就需要采样了。

    def plot_ts_day(x,y):
        """绘制每天的时间序列图。
        需要注意的是,序列是不是连续的,也就是说某天的数据是没有的,因此需要采样至每天都有记录,原来数据没有的就填充0
        x:时间轴,string或者time类型,是一个seires
        y:值
        """
        # x转成时间类型Timestamp,y也转成list
        x=[pd.to_datetime(str(i)) for i in x]
        y=[i for i in y]
        s=pd.Series(y,index=x)
        s = s.resample(rule='D',fill_method='ffill') # 生采样没有的会被填充
        # 原来没有的就填充为0
        s[s.index]=0
        s[x]=y
        # 重建索引,画出来的图好看点
        x2 = [i.strftime('%Y-%m-%d') for i in s.index]
        s.index = x2
        # 画图,这里使用series的plot函数,而不是seaborn.tsplot函数
        s.plot()

    这里写图片描述

    def plot_ts_month(x,y):
        """绘制月的时间序列图,每月一个数据点,而不是每天一个"""
        # 将x转成时间类型timestamp,y也转成list
        try:
            x = [pd.to_datetime(str(i)) for i in x]
        except:
            x=[pd.to_datetime(str(i)+'01') for i in x]
        y=[i for i in y]
        #
        s=pd.Series(y,index=x)
        # 降采样至月
        s = s.resample('M', label='right').sum().fillna(0)
        # 重建索引,这样画出来的图好看点
        s.index=[i.strftime('%Y%m') for i in s.index]
        s.plot()

    这里写图片描述

    8.4.pandas分组的线图

    说实话,到现在还没搞懂怎么用sns.tsplot绘制分组线图,但是任务紧急,就用pandas的dataframe自带方法plot来绘图了,其实也挺简单的。
    主要注意的是,尽量给dataframe或者series建立时间索引,不然x轴很难看的。

    # 绘制月销量图
    # 数据如下
    # year  month2  salecount
    # 2014       1        531
    # 2014       2        505
    
    # 建立索引,'201601'
    data.index = data['year'].map(str)+data['month2'].map(lambda x: str(x) if x>=10 else '0'+str(x))
    # 绘图,其实也就是和8.3的方法一致了
    data['salecount'].plot()

    分组的线图,比如seaborn中的hue参数,方法是,先将dataframe长表格式转成宽表格式(透视表),每列是不同的年。

    # 分组的线图
    # 转成透视表后,绘图
    data.pivot(index='month2',columns='year',values='salecount').plot(title='销量')
    
    # 当数据很大的时候,你想绘制分组的统计图,比如将不同产品,相同的年月的销量进行加或者均值后在绘制线图
    # 使用 aggfunc 参数即可,默认是mean
    data.pivot_table(index='month2',columns='year',values='salecount',aggfunc='sum') \
        .plot(title='销量',style='o-')

    这里写图片描述

    图形格式选项

    # 图形参数
    # style
    # 图形的属性
    # 1.color:颜色
    # 1.1 r:红色
    # 1.2 b:蓝色
    # 1.3 g:绿色
    # 1.3 y:黄色
    #
    # 2.数据标记markder
    # 2.1 o:圆圈
    # 2.2 .:圆点
    # 2.2 d:棱形
    #
    # 3.线型linestyle
    # 3.1 没有参数的话就是默认画点图
    # 3.2 --:虚线
    # 3.3 -:实线
    #
    # 4.透明度
    # alpha
    #
    # 5.大小
    # size
    # 绘 "点-线" 图
    data.pivot(index='month2',columns='year',values='salecount')\
        .plot(title='销量',style='-o')

    这里写图片描述

    9.双坐标轴图

    有没有遇到这样一种情况,需要将销量和趋势图和温度的变化图同时画在一幅图上,以便观察两者的趋势变化情况,但是因两者是数值差距很大,如果共用同一Y轴,温度曲线就基本看不到了。还是上图上代码吧。

    import seaborn as sns
    sale=pd.Series(np.random.random(10)*100).map(int)
    tmperature=pd.Series(np.random.random(10)*10).map(int)
    
    ax=plt.subplot(111)
    sale.plot(ax=ax,color='b')
    ax.set_xlabel('time')
    ax.set_ylabel('sale')
    
    # 重点来了,twinx 或者 twiny 函数
    ax2 = ax.twinx()
    tmperature.plot(ax=ax2,color='r')
    ax2.set_ylabel('tmperature')
    plt.title('double series figure')

    这里写图片描述

    9.一些技巧

    9.1 批量保存图片

    如果只有一张图片,这没什么好说的,但是如果要对每个维度绘图,然后保存图片呢。

    fig = plt.figure()
    ax=fig.add_subplot(111)
    sub_data[years].plot(ax=ax, style='o-',title='%s 月销量趋势图'%lev3)
    file = r'E:\服装预测\销量趋势-%s.jpg' %lev3
    savefig(file)
    time.sleep(0.5)  # 注意这里要暂停一下,不然会出问题的
    plt.close()   # 最后记得关闭句柄

    9.2 显示中文问题

    import seaborn as sns
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    from matplotlib.pyplot import savefig
    
    mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
    mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
    

    10.分段统计绘图

    遇到这样一种情况,如下的数据格式,现在platform不是重点,需要对diff_date字段分段汇总然后绘图。

    # platform  age         cnt
    # 2         0           22
    # 2         0           40
    # 4         0.1         47
    # 5         0.1         48
    # 3         0.1         51

    这里借用panas.cut函数,因为是绘图看趋势,不需要精确得到每个分段的分割点。

    cut函数有两种使用方法,如果bins=10这样的数值,则将series切成等间隔的10段,如果bins=[0,5,20,55...]这样的一个列表,则根据列表规则切分。

    # 先用pd.cut分段,并取出分段数值
    # 通过 precision 控制小数的位数
    data['cut_point']=pd.cut(data['age'], 
        bins=[0,3,5.9,8.9,11.9,14.8,17.8,20.8,23.8,26.7,29.7],  # 分割点
        labels=['0-3','3-5.9',......]    # 区间命名
        right=True,    # 区间默认是坐开右闭
        precision=1)
    
    # 用sns画图,可以直接汇总每个分段的数量后绘图,而不需要groupby汇总
    # 相当于回到前面,用barplot绘图
    sns.barplot(x='cut_point',y='cnt', data=data, estimator=np.sum, ci=0)
    plt.xlabel('这是横坐标名称')
    plt.ylabel('这是纵坐标名称')
    plt.title('这是图标标题')

    这里写图片描述

    11.分面子图绘图

    11.1

    接下来好好说说这个比较难的,在10中我们分区间绘图,但是我们没有考虑platform这个因子变量啊,如果我们要考虑这个因子变量,就需要分面了,比如不同的platform画一个子图。

    # 和上面的一样,先分组取出分割点
    
    # 用pd.cut分段,并取出分段数值,通过 precision 控制小数的位数
    data['bins']=pd.cut(data['age'], bins=10,precision=1)
    # 取出分割点,因为cut后得到的是 '(2.99, 5.97]' 这样的字符串
    data['cut_point']=data['bins'].apply(lambda x: eval(x.replace(']',')'))[1])
    
    # 下面重点来了,用FacetGrid进行子图绘制
    g=sns.FacetGrid(data=data,col='platform',col_wrap=3,size=5)   # 这里相当于groupby
    g=g=g.map(sns.barplot,'cut_point','cnt',ci=0, estimator=np.sum)
    # 很奇怪的是,如果写 
    # g=g.map(sns.barplot,x='cut_point',y='cnt',ci=0, estimator=np.sum)就报错。

    这里写图片描述

    11.2

    自定义子图绘制

    def my_barplot(x,y,**kwargs):
        """
        自定义函数的时候,没有显示传入dataframe,但是会自动获取,很神奇吧。
        x,y是dataframe的列名
        """
        ax = plt.gca()  # 这个是重点,获取对应的ax子图句柄
        data['bins']=pd.cut(data['age'], bins=10,precision=1)
        data['cutpoint']=data['bins'].apply(lambda x: eval(x.replace(']', ')'))[1])
        sns.barplot(x='cutpoint', y='cnt',data=data, estimator=np.sum, ci=0, ax=ax)
    
    g = sns.FacetGrid(data=data, col='platform',col_wrap=3,
                        size=5,sharex=False)
    g = g.map(my_barplot,'age','cnt')

    这里写图片描述

    12.颜色主题

    主题

    在换了win10后发现seaborn的画出来的图很难看,基本上就是matplotlib的样子。想来肯定是主题和颜色样式没有设置好。今天看了下文档,补充下主题的设置。
    seaborn的默认主题就是最好看的,如下:

    import seaborn as sns
    sns.set()           # 恢复默认主题,在win10中开始的时候要执行一次。

    还有其他几个主题,包括:

    sns.set_style("whitegrid")  # 白色网格背景
    sns.set_style("darkgrid")   # 灰色网格背景
    sns.set_style("dark")       # 灰色背景
    sns.set_style("white")      # 白色背景
    sns.set_style("ticks")      # 四周加边框和刻度

    下面来几张图,发现就默认主题和白色网格背景是比较好看。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    颜色

    颜色一般来说用默认的颜色就好了,而且也比较好看,如果非要设置颜色,可以通过sns.set_palette("husl")设置。
    常用的其他颜色模式还有:

    sns.set_palette("muted")    # 常用
    sns.set_palette("RdBu")
    sns.set_palette("Blues_d")
    sns.set_palette("Set1")
    sns.set_palette("RdBu")

    效果如下图:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    13.后话

    这里只是简单说说seaborn常用的绘图函数而已,看seaborn官网上面有很多好看的图形样例,而这里的函数画出来的哪里有官网的好看啊。
    而且这里也没有说到具体的布局控制,颜色主题等,要想绘制精美的图形,还需要学习具体的参数设定啊。

    不过这里提到的这些简要图形,对于普通的分析快速绘图足够用了。

    使用心得以后补充吧。

    展开全文
  • seaborn 画图功能简单总结

    万次阅读 2018-01-04 18:43:03
    seaborn 画图功能
  • matplotlib与seaborn画图

    千次阅读 2018-07-28 12:46:26
    matplotlib与seaborn画图 matplotlib中pyplot画图 1.导入pyplot库 通过import matplotlib.pyplot as plt指令导入pyplot库并且命名为plt,之后就可以在程序中使用该库了。 2. 画一个sin函数的图像(折线图)...
  • python seaborn 画图

    2017-08-02 22:57:00
    pythonseaborn画图 59888745@qq.com 2017.08.02 distplot( ) kdeplot( ) distplot( )为hist加强版, kdeplot( )为密度曲线图 箱型图 boxplot( ) 联合分布jointplot( ) 热点图heatmap( ) pairplot( ) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 812
精华内容 324
关键字:

seaborn画图