如何用Python和Seaborn构建美丽的地块(详细教程)

164 阅读8分钟

如何用Python和Seaborn构建美丽的图画

数据可视化是一种技术,它允许数据科学家将原始数据转换为图表和图画,从而产生有价值的见解。图表减少了数据的复杂性,使其对任何用户来说都更容易理解。

有很多工具可以进行数据可视化,如Tableau、Power BI、ChartBlocks等,这些都是无代码工具。它们是非常强大的工具,也有它们的受众。然而,当处理需要转化的原始数据和一个良好的数据游乐场时,Python是一个很好的选择。

虽然更复杂,因为它需要编程知识,但Python允许你对数据进行任何操作、转换和可视化。它是数据科学家的理想选择。

有很多原因说明Python是数据科学的最佳选择,但其中一个最重要的原因是它的库生态系统。许多伟大的库可用于Python处理数据,如numpy,pandas,matplotlib,tensorflow

Matplotlib 绘图库可能是目前最知名的绘图库,可用于Python和其他编程语言,如 。正是它的定制化水平和可操作性将其置于首位。然而,在使用它时,一些操作或定制可能很难处理。R

开发人员在matplotlib的基础上创建了一个新的库,叫做seabornSeaborn ,它和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()
乘客
019491月112
119492月118
219493月132
31949四月129
419495月121

所有的魔法都发生在调用函数load_dataset ,该函数期望加载数据的名称并返回一个数据框架。所有这些数据集都可以在GitHub资源库中找到。

散点图

散点图是一种基于数据集的两个维度来显示点的图。在seaborn库中创建散点图是非常简单的,只需一行代码。

sns.scatterplot(data=flights_data, x="year", y="passengers")

散点图样本

非常简单,对吗?函数scatterplot 希望得到我们想要绘制的数据集和代表xy 轴的列。

线形图

这种图画出一条线,代表连续或分类数据的革命。它是一种流行的、已知的图表类型,而且制作起来超级简单。与之前类似,我们使用函数lineplot ,用数据集和代表xy 轴的列。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 图表,将matplotlibseaborn 函数混合起来。


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()
总额_账单小费性别吸烟者时间大小
016.991.01女性没有阳光晚餐2
110.341.66男性太阳晚餐3
221.013.50男性太阳晚餐3
323.683.31男性没有太阳晚餐2
424.593.61女性阳光晚餐4

我喜欢打印数据集的前几行,以了解各列和数据本身的感觉。通常,我使用一些pandas 函数来修复一些数据问题,如null 值,并向数据集添加可能有帮助的信息。你可以在使用pandas的指南中读到更多关于这方面的内容。

让我们为数据集创建一个额外的列,该列代表小费金额占账单总额的百分比:

tips_df["tip_percentage"] = tips_df["tip"] / tips_df["total_bill"]
tips_df.head()

现在我们的数据框看起来像下面这样:

账单总额_账单小费性别吸烟者时间大小小费_百分比
016.991.01女性没有阳光晚餐20.059447
110.341.66太阳晚餐30.160542
221.013.50男性太阳晚餐30.166587
323.683.31男性没有太阳晚餐20.139780
424.593.61女性阳光晚餐40.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 做的事情还有很多,你可以通过访问官方文档了解更多的使用案例。

我希望你喜欢这篇文章,就像我喜欢写这篇文章一样。

谢谢你的阅读!