如何用Python和Seaborn构建美丽的图画
数据可视化是一种技术,它允许数据科学家将原始数据转换为图表和图画,从而产生有价值的见解。图表减少了数据的复杂性,使其对任何用户来说都更容易理解。
有很多工具可以进行数据可视化,如Tableau、Power BI、ChartBlocks等,这些都是无代码工具。它们是非常强大的工具,也有它们的受众。然而,当处理需要转化的原始数据和一个良好的数据游乐场时,Python是一个很好的选择。
虽然更复杂,因为它需要编程知识,但Python允许你对数据进行任何操作、转换和可视化。它是数据科学家的理想选择。
有很多原因说明Python是数据科学的最佳选择,但其中一个最重要的原因是它的库生态系统。许多伟大的库可用于Python处理数据,如numpy,pandas,matplotlib,tensorflow 。
Matplotlib 绘图库可能是目前最知名的绘图库,可用于Python和其他编程语言,如 。正是它的定制化水平和可操作性将其置于首位。然而,在使用它时,一些操作或定制可能很难处理。R
开发人员在matplotlib的基础上创建了一个新的库,叫做seaborn 。Seaborn ,它和matplotlib 一样强大,同时也提供了一个抽象,以简化绘图,并带来一些独特的功能。
在这篇文章中,我们将重点介绍如何与Seaborn合作,创建一流的绘图。如果你想跟着学习,你可以创建你自己的项目,或者简单地查看我在GitHub上的seaborn指南项目。
什么是Seaborn?
Seaborn是一个用于在Python中制作统计图的库。它建立在matplotlib之上,并与pandas数据结构紧密结合。
Seaborn的设计使你能够快速探索和理解你的数据。Seaborn的工作方式是捕获包含你所有数据的整个数据帧或数组,并执行语义映射和统计聚合所需的所有内部函数,将数据转换为信息丰富的图画。
它抽象了复杂性,同时允许你按照你的要求设计你的图。
安装Seaborn
安装seaborn ,就像使用你喜欢的Python包管理器安装一个库一样简单。当安装seaborn ,该库将安装它的依赖项,包括matplotlib,pandas,numpy, 和scipy 。
然后让我们安装seaborn,当然也要安装包笔记本,以获得对我们的数据游乐场的访问:
pipenv install seaborn notebook
此外,在我们开始之前,我们将导入一些模块:
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib
构建你的第一个绘图
在我们可以开始绘制任何东西之前,我们需要数据。seaborn 的优点是它可以直接与pandas 数据框一起工作,这使得它超级方便。更重要的是,该库带有一些内置的数据集,你现在可以从代码中加载,不需要手动下载文件。
让我们通过加载一个包含航班信息的数据集来看看效果如何:
flights_data = sns.load_dataset("flights")
flights_data.head()
| 年 | 月 | 乘客 | |
|---|---|---|---|
| 0 | 1949 | 1月 | 112 |
| 1 | 1949 | 2月 | 118 |
| 2 | 1949 | 3月 | 132 |
| 3 | 1949 | 四月 | 129 |
| 4 | 1949 | 5月 | 121 |
所有的魔法都发生在调用函数load_dataset ,该函数期望加载数据的名称并返回一个数据框架。所有这些数据集都可以在GitHub资源库中找到。
散点图
散点图是一种基于数据集的两个维度来显示点的图。在seaborn库中创建散点图是非常简单的,只需一行代码。
sns.scatterplot(data=flights_data, x="year", y="passengers")

散点图样本
非常简单,对吗?函数scatterplot 希望得到我们想要绘制的数据集和代表x 和y 轴的列。
线形图
这种图画出一条线,代表连续或分类数据的革命。它是一种流行的、已知的图表类型,而且制作起来超级简单。与之前类似,我们使用函数lineplot ,用数据集和代表x 和y 轴的列。Seaborn 将做其余的工作。
sns.lineplot(data=flights_data, x="year", y="passengers")

线形图样本
条形图
这可能是最著名的图表类型,正如你可能已经预料到的,我们可以用seaborn 来绘制这种类型的图,就像我们用函数barplot 来绘制线条图和散点图一样。
sns.barplot(data=flights_data, x="year", y="passengers")

条形图样本
我知道,它的颜色很丰富,我们将在本指南的后面学习如何定制它。
使用matplotlib进行扩展
Seaborn建立在matplotlib 的基础上,扩展其功能并抽象出复杂性。尽管如此,它并没有限制其能力。任何seaborn 的图表都可以使用matplotlib 库中的函数进行定制。它可以在特定的操作中派上用场,并允许seaborn利用matplotlib 的力量,而不需要重写它的所有功能。
比方说,你想用seaborn 同时绘制多个图表;那么你可以使用matplotlib 中的subplot 函数。
diamonds_data = sns.load_dataset('diamonds')
plt.subplot(1, 2, 1)
sns.countplot(x='carat', data=diamonds_data)
plt.subplot(1, 2, 2)
sns.countplot(x='depth', data=diamonds_data)

带子图的样本图
使用subplot 函数,我们可以在一个图上绘制多个图表。该函数需要三个参数,第一个是行数,第二个是列数,最后一个是情节编号。
我们在每个子图中渲染一个seaborn 图表,将matplotlib 和seaborn 函数混合起来。
Seaborn喜欢Pandas
我们已经谈到了这一点,但是seaborn 爱上了pandas ,以至于它的所有函数都建立在pandas 数据框架的基础之上。到目前为止,我们看到了使用seaborn 与预加载的数据的例子,但是如果我们想从已经加载的数据中用pandas 绘制一个图呢?
drinks_df = pd.read_csv("data/drinks.csv")
sns.barplot(x="country", y="beer_servings", data=drinks_df)

用pandas绘制样本图
用样式制作漂亮的图
Seaborn提供了改变图表界面的能力,它提供了五种不同的风格:darkgrid,whiteegrid,dark,white, andticks。
sns.set_style("darkgrid")
sns.lineplot(data = data, x = "year", y = "passengers")

带有darkgrid风格的样本图
下面是另一个例子
sns.set_style("whitegrid")
sns.lineplot(data=flights_data, x="year", y="passengers")
白网格风格的样本图
酷炫的用例
我们知道seaborn ,现在让我们通过在同一个数据集上建立多个图表来实践它们。在我们的例子中,我们将使用数据集 "tips",你可以使用seaborn 直接下载。
首先,加载数据集:
tips_df = sns.load_dataset('tips')
tips_df.head()
| 总额_账单 | 小费 | 性别 | 吸烟者 | 天 | 时间 | 大小 | |
|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | 女性 | 没有 | 阳光 | 晚餐 | 2 |
| 1 | 10.34 | 1.66 | 男性 | 无 | 太阳 | 晚餐 | 3 |
| 2 | 21.01 | 3.50 | 男性 | 无 | 太阳 | 晚餐 | 3 |
| 3 | 23.68 | 3.31 | 男性 | 没有 | 太阳 | 晚餐 | 2 |
| 4 | 24.59 | 3.61 | 女性 | 无 | 阳光 | 晚餐 | 4 |
我喜欢打印数据集的前几行,以了解各列和数据本身的感觉。通常,我使用一些pandas 函数来修复一些数据问题,如null 值,并向数据集添加可能有帮助的信息。你可以在使用pandas的指南中读到更多关于这方面的内容。
让我们为数据集创建一个额外的列,该列代表小费金额占账单总额的百分比:
tips_df["tip_percentage"] = tips_df["tip"] / tips_df["total_bill"]
tips_df.head()
现在我们的数据框看起来像下面这样:
| 账单总额_账单 | 小费 | 性别 | 吸烟者 | 天 | 时间 | 大小 | 小费_百分比 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | 女性 | 没有 | 阳光 | 晚餐 | 2 | 0.059447 |
| 1 | 10.34 | 1.66 | 男 | 无 | 太阳 | 晚餐 | 3 | 0.160542 |
| 2 | 21.01 | 3.50 | 男性 | 无 | 太阳 | 晚餐 | 3 | 0.166587 |
| 3 | 23.68 | 3.31 | 男性 | 没有 | 太阳 | 晚餐 | 2 | 0.139780 |
| 4 | 24.59 | 3.61 | 女性 | 无 | 阳光 | 晚餐 | 4 | 0.146808 |
接下来,我们可以开始绘制一些图表了。
了解小费百分比
让我们首先尝试了解小费百分比的分布。为此,我们可以使用histplot ,它将产生一个直方图的图表。
sns.histplot(tips_df["tip_percentage"], binwidth=0.05)

了解小费百分比图
这很好,我们不得不自定义binwidth 属性以使其更具可读性,但现在我们可以迅速体会到我们对数据的理解。大多数客户的小费会在15%到20%之间,我们有一些边缘案例,小费超过70%。这些值是反常的,它们总是值得探索,以确定这些值是否是错误的。
了解小费百分比是否因一天中的不同时刻而发生变化,也是很有意思的:
sns.histplot(data=tips_df, x="tip_percentage", binwidth=0.05, hue="time")
通过时间图了解小费百分比
这次我们用完整的数据集加载图表,而不是只用一列,然后我们将属性hue ,设置为列time 。这将迫使图表对time 的每个值使用不同的颜色,并为其添加一个图例。
一周中每一天的提示总数
另一个有趣的指标是了解根据一周中的哪一天,人员可以期待多少钱的小费。
sns.barplot(data=tips_df, x="day", y="tip", estimator=np.sum)
了解每一天的小费百分比图
看起来星期五是一个适合呆在家里的好日子。
桌子大小和日期对小费的影响
有时我们想了解变量是如何共同作用来决定产出的。例如,星期几和赌桌大小对小费百分比的影响如何?
为了绘制下一个图表,我们将结合pandas的pivot 功能对信息进行预处理,然后绘制一个热图图表。
pivot = tips_df.pivot_table(
index=["day"],
columns=["size"],
values="tip_percentage",
aggfunc=np.average)
sns.heatmap(pivot)
了解每天的小费百分比和餐桌大小图
总结
当然,我们可以用seaborn 做的事情还有很多,你可以通过访问官方文档了解更多的使用案例。
我希望你喜欢这篇文章,就像我喜欢写这篇文章一样。
谢谢你的阅读!