Python中文社区(ID:python-china)本文重点介绍Seaborn库——Seaborn是一个建立在Matplotlib之上的统计绘图库。它有一个非常好的默认绘图样式,并且也适用于PandasDataFrames。Seaborn可以像任何其他Python包一样使用“pip”安装。pipinstallseabornSeaborn的官方文档地址如下:https://seaborn.pydata.org/另一个重要的地址是官方API,这里指的是各种可用的绘图类型。https://seaborn.pydata.org/api.html我将尝试将Seaborn的功能分解为不同的类别-并从允许我们可视化数据集分布的图表开始。让我们从导入和加载数据开始——我将使用“FinancialSample.xlsx”数据。Excel文件可以长按扫描文末二维码进入量化俱乐部下载:FinancialSample.xlsximportpandasaspdimportseabornassns#如果使用JupyterNotebooks,下面一行可以让我们在浏览器中显示图表%matplotlibinline#将我们的数据加载到PandasDataFramedf=pd.read_excel('FinancialSample.xlsx')#Print前5行数据以确保正确加载df.head()让我们首先看一下“distplot”——这让我们可以看到一组单变量观察值的分布-单变量仅表示一个变量。#plottingDataFrame“Profit”列的分布sns.displot(df['Profit'])我们现在有一个感兴趣的分布图-但作为快速开始,样式看起来有点乏味。让我们给它一个更常见的“Seaborn”风格,试着让它看起来更好一点......columnsns.displot(df['Profit'])我们已经设法在一行代码中用“KDE”线绘制了DataFrame数据的直方图-内核密度估计图。如果我们在plot调用中添加“kde=False”,我们就可以删除KDE。我们还可以更改直方图中“bins”的数量,如下所示-在本例中,它们被设置为50:sns.displot(df['Profit'],kde=False,bins=50)现在让我们看一个“jointplot”——这允许我们组合两个distplots并处理双变量数据。让我们创建一个快速联合图。为此,我们需要通过传入列名来指定要绘制的DataFrame的列,以及我们从中提取列的实际DataFrame。这可以按如下方式完成:假设我想绘制“Profit”列与“UnitsSold”列的对比图。sns.jointplot(x='Profit',y='UnitsSold',data=df)我们现在有一个显示两个变量列之间的散点图的图,以及它们在任一侧的相应分布(它甚至给了我们皮尔逊相关系数和右上角的p-score。)Jointplot还允许我们设置一个名为“kind”的附加参数。这使您可以影响主图的表示方式。目前它是默认的“散点图”,但如果我们将其更改为“十六进制”,例如,我们将得到下图,它将图上的点表示为密度六边形-即包含更多数据的六边形点比包含较少点的点显得更暗。sns.jointplot(x='Profit',y='UnitsSold',data=df,kind='hex')我们可以为“kind”添加的另一个参数是“reg”,它代表回归。这看起来很像散点图,但这次添加了线性回归线。sns.jointplot(x='Profit',y='UnitsSold',data=df,kind='reg')我们可以指定的另一种类型是“kde”,它将绘制二维KDE图,基本上只显示密度数据点最常出现的地方。sns.jointplot(x='Profit',y='UnitsSold',data=df,kind='kde')让我们从jointplots转到“pairplots”。这些使我们能够查看整个数据帧(对于数字数据)的成对关系,并且还支持分类数据点的“色调”参数。因此,pairplot本质上是为DataFrame中数字列的每种可能组合创建一个联合图。我将快速创建一个新的DataFrame,删除“月数”和“年”列,因为这些不是我们连续数字数据的一部分,例如“利润”和“COGS”(销售成本)。我还会删除其他一些列来缩小我们的DataFrame,这样我们的输出图就不会拥挤。#删除不需要的列new_df=df.drop(['MonthNumber','Year','ManufacturingPrice','SalePrice'],axis=1)sns.pairplot(new_df)请注意,我们基本上每对列都有一对图,在对角线上我们有分布的直方图,因为将数据与自身共同绘制是没有意义的。这是快速可视化数据的好方法。我们还可以添加一个“色调”——这是我们指定将用于拆分数据的分类变量的地方。让我们添加“Segment”列作为我们的“Tint”。sns.pairplot(new_df,hue='Segment')现在数据点根据分类数据着色-颜色图例显示在图的右边缘。我们还可以通过设置“调色板”参数来更改绘图使用的调色板。下面是一个使用“magma”配色方案的例子。所有可用的方案都可以在Matplotlib站点上找到。sns.pairplot(new_df,hue='Segment',palette='magma')我们要看的下一个图是“rugplot”——这将帮助我们构建和解释我们之前创建的“kde”图是什么——无论是在我们的distplot中还是当我们将“kind=kde”作为参数传递时。sns.rugplot(df['Profit'])如上所示,对于rugplot,我们将要绘制的列作为参数传递-rugplot所做的是为分布中的每个点绘制破折号。所以rugplot和distplot的区别在于,distplot涉及到“bins”的概念,会对每个bin中的所有数据点求和,并绘制出这个图,而rugplot只是在每个数据点绘制一个标记。所以现在让我们将rugplot转换为KDE图表。KDE代表“内核密度估计”。下图解释了如何将rugplots构建到KDE图中。如果我们愿意,我们可以从一组数据和rugplot构建我们自己的KDE绘图,看看它是否与使用内置“kdeplot”直接创建的KDE绘图相匹配。#设置一组30个取自normal的分布式数据点x=np.random.normal(0,1,size=30)#设置KDE点的带宽bandwidth=1.06*x.std()*x.size**(-1/5.)#Setthelimitofthey-axissupport=np.linspace(-4,4,200)#遍历数据点,为每个点创建一个内核,然后绘制内核kernels=[]forx_iinx:kernel=stats.norm(x_i,bandwidth).pdf(支持)kernels.append(kernel)plt.plot(support,kernel,color="r")sns.rugplot(x,color=".2",linewidth=3)#使用复合梯形规则沿给定的轴积分并创建KDE图fromscipy.integrateimporttrapzdensity=np.sum(kernels,axis=0)density/=trapz(density,support)plt.plot(support,density)Now让我们使用内置的“kdeplot”来绘制KDE图。sns.kdeplot(x,shade=True)我们可以看到这两个图是相同的,我们已经正确地创建了KDE图。本文涵盖了大部分分布图功能。
