Matplotlib进阶:Seaborn教程

    xiaoxiao2021-03-25  103

    Matplotlib进阶:Seaborn教程

    martin

    Matplotlib进阶Seaborn教程 样式管理 使用axes_style和set_style控制外观选择颜色可选 绘图函数 可视化数据的分布 绘制单变量分布绘制二元分布 可视化线性回归关系模型可选使用分类数据绘图 利用不同类型模型来拟合数据分类散点图观测值分布统计估计绘制多面板分类图

    样式管理

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

    >>>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)

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

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

    >>> sinplot() >>> plt.show()

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

    >>> sns.set_style("white") >>> sinplot() >>> plt.show()

    >>> sns.set_style("ticks") >>> sinplot() >>> plt.show()

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

    >>> with sns.axes_style("darkgrid"): ... plt.subplot(211) ... sinplot() ... >>> plt.subplot(212) >>> sinplot(-1) >>> plt.show()

    选择颜色(可选)

    见官方文档

    绘图函数

    可视化数据的分布

    当处理一组数据时,通常首先要做的是了解变量是如何分布的。这一节将介绍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

    绘制单变量分布

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

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

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

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

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

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

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

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

    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()

    拟合参数分布

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

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

    绘制二元分布

    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']) 散点图

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

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

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

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

    还可以使用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()

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

    >>> 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()

    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()

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

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

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

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

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

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

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

    许多数据集包含多个定量变量,分析的目标通常是将这些变量相互关联。我们先前讨论了可以通过显示两个变量的联合分布来实现这一点的函数。然而,使用统计模型来估计两组噪声集合之间的简单关系可能更具意义。本节将介绍如何通过线性回归框架来完成这些工作。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')

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

    分类散点图

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

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

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

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

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

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

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

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

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

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

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

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

    观测值分布

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

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

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

    统计估计

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

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

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

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

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

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

    绘制多面板分类图

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

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

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

    转载请注明原文地址: https://ju.6miu.com/read-33588.html

    最新回复(0)