精心设计的可视化图表总是令人惊叹。颜色鲜明,层次自然融合,轮廓线条流畅,整体效果不仅具备美感,还为我们提供了有意义的洞察力。
在数据科学中,这一点尤为重要,因为我们经常处理大量杂乱的数据。对于数据科学家来说,具备可视化数据的能力至关重要。我们的利益相关者或客户往往更依赖视觉线索,而不是机器学习模型的复杂细节。
市面上有许多优秀的 Python 可视化库,包括内置的 Matplotlib。但对我来说,Seaborn 尤为突出,它将美学吸引力与技术见解无缝结合,如我们即将看到的内容。
在本文中,我们将了解 Seaborn 是什么以及为什么应该优先选择它而不是 Matplotlib。接下来,我们将使用 Seaborn 在 Python 中生成各种不同的数据可视化图表。
Seaborn是什么
你是否曾使用过 R 语言中的 ggplot2 库?它是任何工具或语言中最好的可视化包之一。Seaborn 给我的整体感觉与之相似。
Seaborn 是一个非常出色的 Python 可视化库,构建于 Matplotlib 之上。它使我们能够创建更强大的数据可视化图表。这有助于通过可视化的方式展示数据,从而揭示变量之间隐藏的关联或初看不明显的趋势。与 Matplotlib 的低级接口相比,Seaborn 提供了更高级的接口。
不同类型的可视化图表
基本图表:这些是简单的图表类型,如散点图(在图表上显示点)、折线图(将点连接成线)和条形图(用条形表示数据)。 分组图表:这些图表帮助比较不同数据组。例如,可以使用分组图表比较不同年级学生的平均身高。 分布图:这些图表显示数据的分布情况。想象一下,一条线展示了数据集中不同值出现的频率。 矩阵图:类似于大网格,每个方块代表数据。热力图是一个流行的例子,其中颜色显示数据的强度。 时间序列图:这些图表显示数据随时间的变化。例如,你可以绘制一周内的温度变化,以观察每天的差异。 自定义图表:Seaborn 允许你按照自己的需求调整图表的外观。你可以更改颜色、样式等,使图表易于理解且视觉上更具吸引力。
为什么要使用Seaborn而不是Matplotlib
我一直在谈论 Seaborn 的优秀之处,所以你可能会好奇这究竟有什么特别之处。我将在使用 Seaborn 生成图表时,以实际操作的方式全面回答这个问题。现在,我们先快速谈谈为什么 Seaborn 感觉比 Matplotlib 更胜一筹。
Seaborn 让我们的图表和绘图更加引人入胜,并且满足了一些常见的数据可视化需求(例如将颜色映射到变量或使用分面)。基本上,它让数据可视化和探索变得更加容易掌握。相信我,在数据科学中,这可不是一件容易的事。
“如果说 Matplotlib ‘试图让简单的事情变得简单,让困难的事情变得可能’,那么 Seaborn 就是在努力让一组定义明确的困难事情变得容易。” ——Michael Waskom(Seaborn 的创造者)
Matplotlib 有几个(重大)限制,Seaborn 解决了这些问题:
Seaborn 提供了大量高级接口和定制主题,而 Matplotlib 缺乏这些功能,后者难以找到让图表变得有吸引力的设置。 Matplotlib 的函数不太适用于dataframes结构,而 Seaborn 则能很好地处理。
第二点在数据科学中尤为重要,因为我们经常使用dataframes结构。你认为还有什么理由使 Seaborn 优于 Matplotlib?请在文章下方的评论区告诉我们!
Seaborn环境安装
Seaborn 库有四个必需的依赖项,你需要安装它们:
NumPy (>= 1.9.3)
SciPy (>= 0.14.0)
matplotlib (>= 1.4.3)
Pandas (>= 0.15.2)
要安装 Seaborn 并有效使用它,首先需要安装上述依赖项。一旦完成这一步,我们就可以安装 Seaborn 并享受其迷人的图表。要安装 Seaborn,可以使用以下代码:
pip install seaborn
你也可以使用 conda 安装 Seaborn 的最新版本:
conda install seaborn
导入依赖项和 Seaborn:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from scipy import stats
成功导入后,我们已经准备好详细探索Seaborn了。
可视化数据集
本文将使用两个数据集:
HR 分析挑战
预测点赞数量
我选择这两个数据集是因为它们包含了大量的变量,所以我们有很多选项可以尝试。这两个数据集也模拟了真实世界的场景,因此你将了解数据可视化和探索在行业中的应用。
Seaborn可视化
可视化统计关系
统计关系指的是理解数据集中不同变量之间的关系以及这种关系如何影响或依赖于其他变量的过程。
在这里,我们将使用 Seaborn 生成以下图表:
散点图 SNS.relplot Hue 图
我选择了“预测点赞数量”项目来演示这些图表。现在,让我们先将数据集导入到工作环境中:
df = pd.read_csv(r"data/seaborn/train_upvotes.csv")
df.head()
散点图
散点图可能是可视化两个变量之间关系的最常见示例。每个点表示数据集中的一个观察值,这些观察值由点状结构表示。该图通过点云展示了两个变量的联合分布。
要绘制散点图,我们将使用 Seaborn 库的 relplot()
函数。它是用于可视化统计关系的图形级函数。默认情况下,使用 relplot
会生成一个散点图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Read dataset
df = pd.read_csv(r"train.csv")
print(df.head())
# Scatter Plot
sns.relplot(x="Views", y="Upvotes", data = df)
plt.show()
SNS.relplot
是 relplot
函数,属于 Seaborn 类 SNS
。
参数 x
、y
和 data
分别表示 X 轴变量、Y 轴变量以及用于绘图的数据。如上图,我们找到了浏览量与点赞数之间的关系。
接下来,如果我们想查看与数据关联的标签,可以使用以下代码:
sns.relplot(x="Views", y="Upvotes", hue = "Tag", data = df)
色彩图(Hue plot)
我们可以通过使用 hue
为图表添加另一个维度,它为点提供颜色,每种颜色都有其特定的含义。
在上面的图表中,hue
语义是分类的,因此它具有不同的颜色调色板。如果 hue
语义是数值型的,那么颜色将按顺序变化。
sns.relplot(x="Views", y="Upvotes", hue = "Answers", data = df)
我们还可以更改每个点的大小:
sns.relplot(x="Views", y="Upvotes", size = "Tag", data = df)
我们还可以通过使用另一个参数 sizes
手动更改点的大小,例如 sizes = (15, 200)
。
sns.relplot(x="Views", y="Upvotes", size = "Tag", sizes=(15,200),data = df)
可视化分类数据
Jitter plot(抖动图) Hue(色彩图) Boxplot(箱线图) Voilin Plot(小提琴图) Pointplot(点图)
在上面的部分中,我们看到了如何使用不同的可视化表示来展示多个变量之间的关系。我们绘制了两个数值变量之间的图表。在这一部分,我们将研究两个变量之间的关系,其中一个变量是分类变量(划分为不同的组)。
我们将使用 Seaborn 库的 catplot()
函数来绘制分类数据的图表。让我们深入探讨吧!
Jitter plot(抖动图)
对于 Jitter 图,我们将使用 HR 分析挑战问题中的数据集,现在让我们导入这个数据集。
df2 = pd.read_csv(r"data/seaborn/train_hr.csv")
df2.head()
现在,我们将使用 catplot()
函数来绘制 education
和 avg_training_score
列之间的图表。
sns.catplot(x="education", y="avg_training_score", data=df2)
由于我们可以看到图表有些分散,为了处理这种情况,我们可以将 jitter
设置为 False
。Jitter 是与真实值的偏差。因此,我们可以通过使用另一个参数将 jitter
设置为 False
。
sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
Hue Plot(色彩图)
接下来,如果我们想在图表中引入另一个变量或维度,可以像前面部分那样使用 hue
参数。比如,我们想在 education
和 avg_training_score
的图表中查看性别分布,为此,我们可以使用以下代码:
sns.catplot(x="education", y="avg_training_score", hue='gender', data=df2)
在上面的图表中,我们可以看到点彼此重叠。为了消除这种情况,我们可以将 kind
参数设置为 "swarm"
。swarm
使用一种算法来防止点重叠,并沿分类轴调整点的位置。让我们看看它的效果如何:
sns.catplot(x="education", y="avg_training_score", kind = "swarm", data=df2)
相当惊艳,对吧?那么,如果我们想同时看到点群图和第三个维度的效果呢?让我们看看引入 is_promoted
作为一个新变量后会是什么样子。
sns.catplot(x="education", y="avg_training_score", kind = "swarm",hue="is_promoted", data=df2)
从上图可以清晰的看到,高分更容易获得提升。
Boxplot(箱线图)
另一种我们可以绘制的图表是箱线图,它显示了分布的三个四分位值以及端点值。箱线图中的每个值对应于数据中的实际观察值。现在让我们绘制箱线图:
sns.catplot(x="education", y="avg_training_score", kind = "box", data=df2)
当我们在箱线图中使用 hue
语义时,hue
会沿分类轴进行分级,因此不会出现重叠。带有 hue
的箱线图会如下所示:
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "box", data=df2)
箱线图在默认情况下对整个数据集进行操作,并获取均值。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "bar", data=df2)
Voilin Plot(小提琴图)
我们还可以通过使用小提琴图来以不同方式表示上述变量。让我们尝试一下。
sns.catplot(x="education", y="avg_training_score", kind = "violin", data=df2)
小提琴图结合了箱线图和核密度估计程序,以提供对值分布的更丰富描述。四分位数值显示在小提琴图内部。当 hue
语义参数只有两个级别时,我们还可以将小提琴图进行拆分,这样也有助于节省图表上的空间。让我们看看带有级别拆分的小提琴图。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", split = True, data=df2)
这些令人惊叹的图表就是我开始使用 Seaborn 的原因。它提供了许多选项来展示数据。接下来要介绍的是点图。
Pointplot(点图)
点图展示了估计值和置信区间,点图连接来自相同 hue
类别的数据。这有助于识别特定 hue
类别中关系的变化。你可以查看下面的点图如何展示信息。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "point", data=df2)
从上面的图表可以看出,得分较高的人对获得晋升的信心更强。
这还不是全部,Seaborn 是一个功能强大的库,提供了许多用于不同目的的绘图函数。其中一个目的就是引入多个维度。我们也可以通过参数hue
和kind参数
可视化更高维度的关系。
sns.catplot(x="education", y="avg_training_score", hue="is_promoted",col="gender", aspect=.9,kind="swarm", data=df2)
当我们将多个概念结合到一起时,可视化洞察变得非常容易。在这里,参数 hue
作为 语义变量,参数col
作为列变量,参数swarm
表示点不重叠。
可视化数据集的分布
每当我们处理数据集时,我们都希望了解数据或变量的分布情况。数据的分布可以告诉我们很多关于数据本质的信息,因此让我们深入探讨一下。
绘制单变量分布
在检查变量分布时,你最常遇到的图表之一是 histplot
。默认情况下,histplot()
函数绘制直方图并拟合一个核密度估计。让我们查看一下数据中年龄的分布情况
sns.histplot(df2.age,kde=True)
这清楚地表明,大多数人都在二十多岁末期和三十岁初期。
绘制双变量分布
jointplot函数可视化
除了可视化单个变量的分布,我们还可以查看两个独立变量之间的相互分布。双变量分布(bivariate)指的是联合分布,因此我们使用 Seaborn 库的 jointplot()
函数来可视化。默认情况下,jointplot
绘制散点图。让我们查看一下年龄(age)和平均培训分数(avg_training_score)之间的双变量分布。
sns.jointplot(x="avg_training_score", y="age", data=df2);
使用核密度:
sns.jointplot(x="age", y="avg_training_score", data=df2, kind="kde");
heatmap函数可视化
corrmat = df2.corr()
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(corrmat, vmax=.8, square=True)
Boxen plot
Boxen Plot是seaborn库引入的一种新型箱形图。对于箱线图的方框是在四分位上创建的。但在Boxen plot中,数据被划分为更多的分位数。它可以提供了关于数据的更多见解。
sns.catplot(x="age", y="avg_training_score", data=df2, kind="boxen",height=4, aspect=2.7, hue = "is_promoted")
Ridge Plot
ridge plot(山脊图),也叫做 joyplot(欢乐图)。山脊图有助于可视化多个组的数值分布。这些分布可以通过 KDE 图或直方图来表示。现在,让我们尝试绘制一个关于年龄与性别的山脊图。
g = sns.FacetGrid(df2, row="gender", hue="gender", aspect=5, height=3)
# # Draw the densities in a few steps
g.map(sns.kdeplot, "age", shade=True, alpha=1, lw=3.5, bw=.2)
g.map(sns.kdeplot, "age", color="w", lw=2, bw=.2)
g.map(plt.axhline, y=0, lw=2)
# # Define and use a simple function to label the plot in axes coordinates
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, color=color, ha="left", va="center", transform=ax.transAxes)
g.map(label, "age")
# Set the subplots to overlap
g.fig.subplots_adjust(hspace=-.25)
# # Remove axes details that don't play well with overlap
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)
可视化数据集中的变量间的关系
我们还可以使用 Seaborn 库的 pairplot()
函数来绘制数据集中多个双变量分布图。这将展示数据库中每一列之间的关系,并在对角线上绘制每个变量的单变量分布图。让我们看看它的效果。
sns.pairplot(df2)
结束语
我们已经涵盖了很多图表。我们观察到,Seaborn 库在数据可视化和探索方面(尤其是大型数据集)非常有效。我们还讨论了如何使用 Seaborn 库中的不同函数绘制各种类型的数据图表。
正如我之前提到的,学习 Seaborn(或任何概念或库)的最佳方式是通过实践。你生成的新可视化图表越多,你会变得越自信。
欢迎扫码关注: