Seaborn 简明教程
Seaborn - Introduction
在分析领域,获得见解的最佳方法是可视化数据。可以通过将数据表示为易于理解、探索和掌握的图来可视化数据。此类数据有助于引起主要元素的注意。
为了使用 Python 分析一组数据,我们使用 Matplotlib,这是一个广泛实现的 2D 绘图库。同样,Seaborn 是 Python 中的可视化库。它建立在 Matplotlib 之上。
Seaborn Vs Matplotlib
概括起来,如果 Matplotlib “试图使简单的事情变得简单而困难的事情成为可能”,Seaborn 也试图使一组明确定义的困难的事情变得简单。”
Seaborn 帮助解决了 Matplotlib 面临的两个主要问题;问题是 -
-
Default Matplotlib parameters
-
Working with data frames
由于 Seaborn 对 Matplotlib 作了补充和扩展,因此学习曲线非常平缓。如果您了解 Matplotlib,那么您已经完成了一半的 Seaborn。
Important Features of Seaborn
Seaborn 建立在 Python 的核心可视化库 Matplotlib 之上。它的目的是作为补充,而不是替代。然而,Seaborn 带有一些非常重要的特性。让我们在这里看看其中一些。这些特性有助于 -
-
用于设置 matplotlib 图形样式的内建主题
-
可视化单变量和双变量数据
-
安装和可视化线性回归模型
-
绘制统计时间序列数据
-
Seaborn 与 NumPy 和 Pandas 数据结构配合得很好
-
它带有一些用于设置 Matplotlib 图形样式的内建主题
在大多数情况下,您仍然会使用 Matplotlib 进行简单绘图。建议了解 Matplotlib 以调整 Seaborn 的默认图。
Seaborn - Environment Setup
在本章中,我们将讨论 Seaborn 的环境设置。让我们从安装开始,了解随着我们前进如何开始。
Installing Seaborn and getting started
在本节中,我们将了解在安装 Seaborn 中涉及的步骤。
For Windows, Linux & Mac using Anaconda
Anaconda(来自 https://www.anaconda.com/ )是一个适用于 SciPy 堆栈的免费 Python 发行版。它还适用于 Linux 和 Mac。
还可以使用 conda 安装已发布的版本 −
conda install seaborn
Seaborn - Importing Datasets and Libraries
在本教程中,我们将讨论如何导入数据集和库。我们从了解如何导入库开始。
Importing Libraries
我们首先导入 Pandas,这是一个用于管理关系型(表格格式)数据集的好库。处理数据帧时 Seaborn 非常方便,数据帧是数据分析中最常用的数据结构。
以下命令将帮助你导入 Pandas −
# Pandas for managing datasets
import pandas as pd
现在,我们导入 Matplotlib 库,它能帮助我们自定义绘图。
# Matplotlib for additional customization
from matplotlib import pyplot as plt
我们将使用以下命令导入 Seaborn 库 −
# Seaborn for plotting and styling
import seaborn as sb
Importing Datasets
我们已经导入了所需的库。在本节中,我们将了解如何导入所需的数据集。
Seaborn 库中附带了一些重要的数据集。安装 Seaborn 时,数据集会自动下载。
你可以使用任何这些数据集来进行学习。你可以借助以下函数加载所需的数据集
load_dataset()
Importing Data as Pandas DataFrame
在本节中,我们将导入一个数据集。该数据集默认加载为 Pandas 数据帧。如果 Pandas 数据帧中存在任何函数,则这些函数可在此数据帧上运行。
以下代码行将帮助你导入数据集 −
# Seaborn for plotting and styling
import seaborn as sb
df = sb.load_dataset('tips')
print df.head()
上述代码行将生成以下输出 −
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
要查看 Seaborn 库中所有可用的数据集,你可以按如下所示使用具有 get_dataset_names() 函数的以下命令 −
import seaborn as sb
print sb.get_dataset_names()
上述代码行将返回以下输出,即数据集列表
[u'anscombe', u'attention', u'brain_networks', u'car_crashes', u'dots',
u'exercise', u'flights', u'fmri', u'gammas', u'iris', u'planets', u'tips',
u'titanic']
DataFrames 以矩形网格的形式存储数据,通过这些网格可以轻松地概览数据。矩形网格的每一行都包含一个实例的值,而网格的每一列都是一个向量,其中包含特定变量的数据。这意味着数据帧的行不需要包含相同数据类型的值,它们可以是数字、字符、逻辑值等。Python 的数据框随 Pandas 库一起提供,并且它们被定义为具有不同类型的列的二维标签数据结构。
有关数据帧的更多详细信息,请访问我们 tutorial 上有关熊猫的内容。
Seaborn - Figure Aesthetic
可视化数据是一个步骤,进一步美化可视数据则是另一个步骤。可视化在向受众传达定量洞察方面发挥着至关重要的作用,以吸引他们的注意力。
美学是指与自然和对美的欣赏有关的一组原则,尤其是在艺术中。可视化以尽可能有效和最简单的方式呈现数据的艺术。
Matplotlib 库高度支持自定义,但要知道需要调整哪些设置才能实现有吸引力和预期的情节,这是应该了解的。与 Matplotlib 不同,Seaborn 附带自定义主题和用于自定义和控制 Matplotlib 图形外观的高级界面。
Example
import numpy as np
from matplotlib import pyplot as plt
def sinplot(flip = 1):
x = np.linspace(0, 14, 100)
for i in range(1, 5):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sinplot()
plt.show()
这是使用默认 Matplotlib 绘制的情节 −
要将同一张图表更改为 Seaborn 默认值,请使用 set() 函数 −
Example
import numpy as np
from matplotlib import pyplot as plt
def sinplot(flip = 1):
x = np.linspace(0, 14, 100)
for i in range(1, 5):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
import seaborn as sb
sb.set()
sinplot()
plt.show()
Output
以上两幅图显示了默认 Matplotlib 和 Seaborn 图表之间的差异。数据的表示方式相同,但在两者中表示样式有所不同。
基本上,Seaborn 将 Matplotlib 参数分成两组 −
-
Plot styles
-
Plot scale
Seaborn Figure Styles
用于操作样式的界面是 set_style() 。使用此功能,您可以设置绘制的主题。根据最新更新版本,以下是可用的五种主题。
-
Darkgrid
-
Whitegrid
-
Dark
-
White
-
Ticks
让我们尝试从上述列表中应用一个主题。绘图的默认主题 darkgrid 我们已在前面的示例中看到了。
Removing Axes Spines
在白色和刻度主题中,我们可以使用 despine() 函数删除顶部和右侧的轴刺。
Overriding the Elements
如果您想自定义 Seaborn 样式,您可以将参数词典传递给 set_style() *function. Parameters available are viewed using *axes_style() 函数。
Output
{'axes.axisbelow' : False,
'axes.edgecolor' : 'white',
'axes.facecolor' : '#EAEAF2',
'axes.grid' : True,
'axes.labelcolor' : '.15',
'axes.linewidth' : 0.0,
'figure.facecolor' : 'white',
'font.family' : [u'sans-serif'],
'font.sans-serif' : [u'Arial', u'Liberation
Sans', u'Bitstream Vera Sans', u'sans-serif'],
'grid.color' : 'white',
'grid.linestyle' : u'-',
'image.cmap' : u'Greys',
'legend.frameon' : False,
'legend.numpoints' : 1,
'legend.scatterpoints': 1,
'lines.solid_capstyle': u'round',
'text.color' : '.15',
'xtick.color' : '.15',
'xtick.direction' : u'out',
'xtick.major.size' : 0.0,
'xtick.minor.size' : 0.0,
'ytick.color' : '.15',
'ytick.direction' : u'out',
'ytick.major.size' : 0.0,
'ytick.minor.size' : 0.0}
更改任何参数的值都将更改绘图样式。
Scaling Plot Elements
我们还可以控制绘图元素,并且可以使用 set_context() 函数控制绘图的比例。我们有四个预设模板用于上下文,根据相对大小,将上下文命名如下
-
Paper
-
Notebook
-
Talk
-
Poster
默认情况下,上下文设置为笔记本;并用于上面的绘图中。
Seaborn - Color Palette
颜色在可视化中扮演着比任何其他方面都重要的角色。有效使用时,颜色将为图形增加更多价值。调色板是一种画家用来排列和混合颜料的平面。
Building Color Palette
Seaborn 提供了一个名为 color_palette() 的函数,可用于为图形赋予颜色并为其添加更多美学价值。
Parameter
下表列出了构建调色板的参数 −
Sr.No. |
Palatte & Description |
1 |
n_colors 调色板中的颜色数量。如果为 None,则默认值将取决于调色板的指定方式。默认情况下, n_colors 的值为 6 种颜色。 |
2 |
desat 使每种颜色去饱和的比例。 |
Return
返回是指 RGB 元组的列表。以下是一些现成的 Seaborn 调色板 −
-
Deep
-
Muted
-
Bright
-
Pastel
-
Dark
-
Colorblind
除此之外,还可以生成新的调色板
在不了解数据特征的情况下,很难决定应该为给定的数据集使用哪种调色板。意识到这一点,我们将对使用 color_palette() 类型的方式进行分类 −
-
qualitative
-
sequential
-
diverging
我们还有另一个函数 seaborn.palplot() ,用于处理调色板。此函数将调色板绘制为水平阵列。我们将在接下来的示例中了解更多有关 seaborn.palplot() 的信息。
Qualitative Color Palettes
定性或定量调色板最适合绘制分类数据。
Diverging Color Palette
发散调色板使用两种不同的颜色。每种颜色代表从某个公共点向任一方向变化的值。
假设绘制从 -1 到 1 的数据。从 -1 到 0 的值采用一种颜色,0 到 +1 采用另一种颜色。
默认情况下,这些值以零为中心。你可以通过传递一个值来使用 center 参数控制它。
Setting the Default Color Palette
函数 color_palette() 有一个名为 set_palette() 的伴随函数。它们之间的关系与美学章节中介绍的对类似。 set_palette() 和 color_palette(), 的参数相同,但默认的 Matplotlib 参数已更改,以便将调色板用于所有图形。
Seaborn - Histogram
直方图通过沿数据范围形成垃圾箱,然后绘制条形图来显示每个垃圾箱中的观察结果数量,以表示数据分布。
Seaborn 自带一些数据集,我们已在前面的章节中使用了一些数据集。我们已经学习了如何加载数据集以及如何查找可用数据集的列表。
Seaborn 自带一些数据集,我们已在前面的章节中使用了一些数据集。我们已经学习了如何加载数据集以及如何查找可用数据集的列表。
Seaborn - Kernel Density Estimates
核密度估计 (KDE) 是一种估计连续随机变量的概率密度函数的方法。它用于非参数分析。
在 distplot 中将 hist 标志设置为 False 将会生成核密度估计图。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
sb.distplot(df['petal_length'],hist=False)
plt.show()
Fitting Parametric Distribution
distplot() 用于可视化数据集的参数分布。
Plotting Bivariate Distribution
双变量分布用于确定两个变量之间的关系。这主要涉及两个变量之间的关系,以及一个变量如何相对于另一个变量而表现。
在 seaborn 中分析双变量分布的最佳方法是使用 jointplot() 函数。
Jointplot 创建一个多面板图,其中投射了两个变量之间的双变量关系,还投射了每个变量在不同轴上的单变量分布。
Scatter Plot
散点图是可视化分布的最便捷方法,其中每个观测值通过 x 和 y 轴表示在二维图中。
Kernel Density Estimation
核密度估计是一种非参数方式,用于估计变量的分布。在 seaborn 中,我们可以使用 jointplot(). 绘制核密度估计。
将值“kde”传递给参数 kind 以绘制核图。
Seaborn - Visualizing Pairwise Relationship
实时研究下的数据集包含许多变量。在这种情况下,应该分析每个变量之间的关系。绘制 (n,2) 组合的双变量分布将是一个非常复杂且耗时的过程。
要绘制数据集中的多个成对双变量分布,可以使用 pairplot() 函数。这将显示 DataFrame 中变量的 (n,2) 组合的关系,作为绘图矩阵,并且对角线绘图是单变量绘图。
Axes
在本节中,我们将学习什么是轴及其用法、参数等。
Parameters
下表列出了轴的参数-
Sr.No. |
Parameter & Description |
1 |
data Dataframe |
2 |
hue 用于将数据中的变量映射到不同颜色的绘图方面。 |
3 |
palette 用于映射色调变量的一组颜色 |
4 |
kind 用于非同一关系的绘图类型。 {‘scatter’,‘reg’} |
5 |
diag_kind 用于对角线子图的绘图类型。 {‘hist’,‘kde’} |
除了数据外,所有其他参数都是可选的。还有一些其他 pairplot 可以接受的参数。上面提到的经常使用的是参数。
Seaborn - Plotting Categorical Data
在我们先前的章节中,我们了解了用于分析所研究的连续变量的散点图、六角形图和核密度估计图。当所研究的变量是分类变量时,这些图不适用。
当一个或两个所研究的变量是分类变量时,我们将使用 striplot()、swarmplot() 等图。Seaborn 提供了这么做的接口。
Categorical Scatter Plots
在本节中,我们将了解分类散点图。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
sb.stripplot(x = "species", y = "petal_length", data = df)
plt.show()
Output
在上图中,我们可以清楚地看到每个物种中 petal_length 的差异。但是,上述散点图的主要问题是散点图上的点重叠在一起。我们使用“抖动”参数来处理这种情况。
抖动会向数据添加一些随机噪声。此参数将调整沿分类轴的位置。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
sb.stripplot(x = "species", y = "petal_length", data = df, jitter = Ture)
plt.show()
Seaborn - Distribution of Observations
在我们上一章中处理过的类别散点绘图中,该方法在提供有关每个类别中值分布的信息方面变得有限。现在,更进一步,让我们看看在类别中执行比较时有什么可以帮助我们的。
Box Plots
Boxplot 是通过四分位数可视化数据分布的便捷方式。
盒状图通常具有从称为须盒子的盒子延伸出的垂直线。这些须反映了上四分位数和下四分位数之外的可变性,因此盒状图也被称为 box-and-whisker 图和 *盒须 *图。数据中的任何异常值都以单个点的形式绘制。
Violin Plots
小提琴图是盒状图和核密度估计的结合。因此,这些绘图更容易分析和理解数据的分布。
利用名为的提示数据集以进一步了解小提琴图。此数据集包含有关顾客在餐厅中给出的提示的信息。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('tips')
sb.violinplot(x = "day", y = "total_bill", data=df)
plt.show()
Output
箱线图的四分位数和须值从盒中显示。由于小提琴图使用 KDE,小提琴较宽的部分表示较高密度,而较窄区域表示较低密度。盒线图中的四分位间距和小提琴图每个类别中 KDE 中的较高密度部分位于同一区域。
上图显示了四天里 total_bill 的分布。但是,除此之外,如果我们想了解如何根据性别来分布,让我们在下面的示例中进行探索。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('tips')
sb.violinplot(x = "day", y = "total_bill",hue = 'sex', data = df)
plt.show()
Output
现在,我们可以清楚地看到男性和女性之间的消费行为。我们可以通过查看该图轻松地说,男性比女性多付账单。
并且,如果色调变量只有两个类别,我们可以通过在特定天内将每个小提琴分成两个部分而不是两个小提琴的方式来美化该图。小提琴的任一部分都表示色调变量中的每个类别。
Seaborn - Statistical Estimation
在大多数情况下,我们处理的是整个数据分布的估计。但是,当涉及到中心趋势估计时,我们需要一种特殊的方法来总结分布。均值和中位数是用于估计分布中心趋势的经常使用的方法。
在我们以上章节中学习的所有图中,我们对整个分布进行了可视化。现在,让我们讨论一下我们可以用它来估计分布中心趋势的图。
Bar Plot
barplot() 显示了分类变量和连续变量之间的关系。数据以矩形条表示,其中条的长度表示该类别中数据的比例。
条形图表示中心趋势的估计值。让我们使用“泰坦尼克号”数据集来学习条形图。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('titanic')
sb.barplot(x = "sex", y = "survived", hue = "class", data = df)
plt.show()
Output
在上例中,我们可以看到每节车厢男性和女性的平均存活人数。从图中我们可以得知,存活下来的女性人数多于男性。在男性和女性中,一等舱的存活人数较多。
条形图中的一个特例是显示每个类别中的观察次数,而不是计算第二个变量的统计量。为此,我们使用 countplot().
Seaborn - Plotting Wide Form Data
总是建议使用“长形式”或“整齐”数据集。但有时当我们除了使用“宽格式”数据集外别无选择时,相同的功能也可应用于各种格式的“宽格式”数据,包括 Pandas 数据框或二维 NumPy 数组。应将这些对象直接传递到 data 参数中,并且必须将 x 和 y 变量指定为字符串
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
sb.boxplot(data = df, orient = "h")
plt.show()
Seaborn - Multi Panel Categorical Plots
分类数据可以使用两个图表进行可视化,您可以使用函数 pointplot() ,或更高级别的函数 factorplot() 。
Factorplot
Factorplot 在 FacetGrid 上绘制分类图。使用“类型”参数,我们可以选择箱线图、小提琴图、条形图和条带图等图表。FacetGrid 默认使用点图。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('exercise')
sb.factorplot(x = "time", y = pulse", hue = "kind",data = df);
plt.show()
What is Facet Grid?
*面网格*通过划分变量来构成由行和列定义的面板矩阵。由于有面板,因此单个图看起来像是多个图。这对于分析两个离散变量中的所有组合非常有帮助。
让我们用一个例子来可视化上述定义
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('exercise')
sb.factorplot(x = "time", y = "pulse", hue = "kind", kind = 'violin', col = "diet", data = df);
plt.show()
Seaborn - Linear Relationships
在大多数情况下,我们使用包含多个定量变量的数据集,并且分析的目标通常是将这些变量相互关联。这可以通过回归线来完成。
在构建回归模型时,我们经常检查我们必须查看所有连续变量组合之间相关性的 multicollinearity, ,并且如果存在多重共线性,则将采取必要的措施将其删除。在这样的情况下,以下技术会有所帮助。
Functions to Draw Linear Regression Models
Seaborn 中有两种主要函数可用于可视化通过回归确定的线性关系。这些函数是 regplot() 和 lmplot() 。
regplot vs lmplot
regplot |
lmplot |
以各种格式接受 x 和 y 变量,包括简单的 numpy 数组、pandas Series 对象或对 pandas DataFrame 中变量的引用 |
具有数据作为必需参数,并且必须将 x 和 y 变量指定为字符串。这种数据格式称为“长格式”数据 |
现在让我们绘制出这些图。
Example
在本例中使用相同的数据绘制回归图和 Lmplot
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('tips')
sb.regplot(x = "total_bill", y = "tip", data = df)
sb.lmplot(x = "total_bill", y = "tip", data = df)
plt.show()
Fitting Different Kinds of Models
上面使用的简单线性回归模型非常容易拟合,但在大多数情况下,数据是非线性的,并且上述方法不能概括回归线。
让我们使用具有回归图的安斯科姆数据集 −
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('anscombe')
sb.lmplot(x="x", y="y", data=df.query("dataset == 'I'"))
plt.show()
在这种情况下,数据非常适合具有较小方差的线性回归模型。
让我们看另一个数据偏差较大的示例,其中显示了最佳拟合线不是很好。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('anscombe')
sb.lmplot(x = "x", y = "y", data = df.query("dataset == 'II'"))
plt.show()
Seaborn - Facet Grid
探索中等维度数据的实用方法是,根据数据集的不同子集绘制同一图形的多个实例。
这种技术通常被称为“网格”或“格子”绘图,它与“小倍数”的想法有关。
要使用这些功能,你的数据必须位于 Pandas DataFrame 中。
Plotting Small Multiples of Data Subsets
在上一章中,我们已经看到了 FacetGrid 示例,其中 FacetGrid 类有助于使用多个面板可视化单个变量的分布以及子集中多个变量之间的关系。
FacetGrid 最多可以绘制三个维度 - 行、列和色调。前两个与结果轴阵列有明显的对应关系;将色调变量视为深度轴上的第三维度,其中不同级别以不同颜色绘制。
FacetGrid 对象将数据帧作为输入,以及将形成网格的行、列或色调维度的变量的名称。
这些变量应该是分类变量,并且每个变量级别的变量将用于沿着该轴的切面。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('tips')
g = sb.FacetGrid(df, col = "time")
plt.show()
Output
在上述示例中,我们刚刚初始化了 facetgrid 对象,它不会绘制任何内容。
在这个网格上可视化数据的主要方法是 FacetGrid.map() 方法。让我们使用直方图查看每个子集中小费的分布。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('tips')
g = sb.FacetGrid(df, col = "time")
g.map(plt.hist, "tip")
plt.show()
Seaborn - Pair Grid
PairGrid 允许我们使用相同的绘图类型绘制一个子图网格来可视化数据。
与 FacetGrid 不同,它针对每个子图使用不同的变量对。它形成一个子图矩阵。它有时也称为“散点图矩阵”。
pairgrid 的用法与 facetgrid 类似。首先初始化网格,然后传递绘图函数。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
g = sb.PairGrid(df)
g.map(plt.scatter);
plt.show()
还可以绘制对角线上的不同函数来显示每列中变量的单变量分布。
Example
import pandas as pd
import seaborn as sb
from matplotlib import pyplot as plt
df = sb.load_dataset('iris')
g = sb.PairGrid(df)
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter);
plt.show()