Seaborn 数据可视化指南

Seaborn 是一个基于Matplotlib的数据可视化库,它提供了丰富的绘图功能,使得创建复杂的图表变得简单。本文将介绍如何结合使用Seaborn、Matplotlib和Pandas三个库来制作图表,并以Pokemon数据集为例进行实践。如果是Python的初学者,建议先熟悉Matplotlib和Pandas的基本用法。

Seaborn 的优势

Seaborn 最大的优势在于其多样的绘图函数。它允许即使在单行代码中也能创建复杂的图表。本文将使用三个库:Matplotlib、Seaborn和Pandas。如果是Python的完全新手,建议先从Matplotlib和Pandas开始,稍微熟悉一下。如果完全按照本教程操作,将能够使用这三个库制作出漂亮的图表。可以将代码作为未来任何可视化任务的模板。

开始Seaborn之旅

将以著名的Pokemon数据集开始Seaborn之旅。在开始之前,强烈建议为每个图表编写自己的基础代码,并尝试实验不同的图表。可以在Kaggle上找到Pokemon数据集。为了简化旅程,已经缩短并清理了这个版本的数据集。可以在这里下载数据集:

超级救星

想提一个资源,每当遇到难题时,它总是超级救星:.

现在开始

将从导入必要的库开始:

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns

读取CSV文件

data = pd.read_csv('Pokemon.csv', encoding = 'unicode_escape')print(data.head())

通过在read_csv()命令中定义不同的编码包来切换utf8编码错误。数据看起来像这样……

数据集描述

列名并没有简化其目的。在实际处理数据之前,了解数据集是很重要的。这里是数据集的简化描述。这个数据集包括150个Pokemon,是关于Pokemon游戏的(不是Pokemon卡片或Pokemon Go)。在这个数据集中,有150行和13列。

列描述:

  • ID:每个Pokemon的ID
  • Name:每个Pokemon的名称
  • Type 1:每个Pokemon都有一个类型,这决定了对攻击的弱点/抗性
  • Type 2:有些Pokemon是双类型,有2个
  • Total:所有后续统计数据的总和,是Pokemon实力的一般指南
  • HP:生命值或健康,定义了Pokemon在昏倒前能承受多少伤害
  • Attack:普通攻击的基础修正值(例如Scratch、Punch)
  • Defense:对普通攻击的基础伤害抗性
  • SP Atk:特殊攻击,特殊攻击的基础修正值(例如Fire Blast、Bubble Beam)
  • SP Def:对特殊攻击的基础伤害抗性
  • Speed:决定每轮哪个Pokemon先攻击
  • Stage:世代编号
  • Legendary:如果是传奇Pokemon则为True,否则为False

重命名列名

已经重命名了列名,以便在绘图中更有意义,并清晰地表达。虽然这是可选的,但强烈建议这样做,以消除任何混淆的可能性。

data.rename(columns = {"#":"No.","Type 1":"Pokemon_Type","Type 2":"PokemonType2",'Total':'Sum of Attack',"HP":"Hit Points","Attack" : "Attack Strength", "Defense":"Defensive Strength","Sp. Atk":"Special Attack Stenth","Sp. Def":"Special Defense Strength","Stage":"Generation"}, inplace = True)data.head()

可视化开始

让从简单的分布图开始。分布图显示了一组数值的分布和范围,这些数值是针对一个维度绘制的。直方图允许绘制数值变量的分布。

plt.figure(figsize=(4,3))sns.distplot(x=data["Sum of Attack"],color="Orange",kde=True,rug=True);plt.show()

分布图输出:Pokemon的总攻击力

直方图

Seaborn的displot函数绘制带有密度曲线的直方图。可以使用选项kde="False"来移除密度。控制rug的存在使用rug="True"。

plt.figure(figsize=(3,3))sns.histplot(x=data["Sum of Attack"],color="Green");plt.show()

另一种方式是:使用plt.hist()

plt.figure(figsize=(3,3))plt.hist(x=data["Sum of Attack"],color="Red",bins=20);plt.show()

因此,有多种方式来绘制分布图。所有函数pyplot.hist、seaborn.countplot和seaborn.displot都作为matplotlib条形图的包装器,如果手动绘制这样的条形图被认为太繁琐,可以使用它们。

离散变量和连续变量

对于离散变量,seaborn.countplot更方便。对于连续变量:pyplot.hist或seaborn.distplot被使用。

联合分布图

联合分布图结合了散点图和直方图的信息,为提供了双变量分布的详细信息。

sns.jointplot(x=data["Sum of Attack"],y=data["Defensive Strength"],color="Red");

密度图

密度图显示了两个变量之间的分布。

sns.kdeplot(x=data["Sum of Attack"],y=data["Defensive Strength"])plt.show()

条形图

条形图帮助可视化分类变量的分布:Countplot是条形图的一种类型。

plt.figure(figsize=(10,6));sns.countplot(x=data.Pokemon_Type,palette=pkmn_type_colors);plt.show()

热图

热图帮助以热点和冷点的形式可视化矩阵数据。暖色表示访客互动最多的部分。

plt.figure(figsize=(8,6));sns.heatmap(data.corr());# Rotate x-labels with the help of matplotlibplt.xticks(rotation=-45);

散点图

散点图(也称为散点图、散点图)使用点来表示两个不同数值变量的值。每个点在水平和垂直轴上的位置表示单个数据点的值。散点图用于观察变量之间的关系。已经使用散点图比较了Pokemon的攻击力和防御力。

Seaborn没有专门的散点图函数,这就是为什么在这里默认看到一个对角线(回归线)。幸运的是,Seaborn帮助调整图表:

#Tweaking with scatter plotssns.lmplot(x='Attack Strength', y='Defensive Strength', data=data, fit_reg = False, #Deleting regression line hue="Generation"); #Separating as per pokemon generation

更多的密度落在40-120标记上,将使用matplotlib帮助改变轴的限制:

sns.lmplot(x='Attack Strength', y='Defensive Strength', data=data,fit_reg = False, #Deleting regression linehue="Generation"); #Separating as per pokemon generationplt.ylim(20,130);plt.xlim(25,125);

箱形图

箱形图用于通过它们的四分位数来描述数值数据的组。箱形图也可能有从盒子延伸出来的线条,表示超出上四分位数和下四分位数的变异性,因此有箱须图和箱须图的术语。

plt.figure(figsize=(15,7));# Pre-format DataFramestats_data = data.drop(['Sum of Attack', 'Generation', 'Legendary'], axis=1);# New boxplot using stats_dfsns.boxplot(data=stats_data, showfliers=False); #Removing outlierssns.set_style("whitegrid")

记得在绘制图表之前保持figsize。

小提琴图

现在将绘制小提琴图。小提琴图是箱形图的替代品。它们通过小提琴的厚度显示分布,而不仅仅是汇总统计数据。

plt.figure(figsize=(15,7));sns.violinplot(x=data.Pokemon_Type, y = data["Attack Strength"]);

正如看到的,龙型倾向于比鬼魂型有更高的攻击力,但它们的变异性也更大。

定制颜色

现在,Pokemon粉丝可能会发现那个图表有些令人震惊:颜色没有意义。为什么草型是粉色的,水型是橙色的?必须立即解决这个问题!幸运的是,Seaborn允许设置自定义颜色调色板。可以简单地创建一个有序的Python列表,包含颜色十六进制值。

pkmn_type_colors = ['#78C850', # Grass '#F08030', # Fire '#6890F0', # Water '#A8B820', # Bug '#A8A878', # Normal '#A040A0', # Poison '#F8D030', # Electric '#E0C068', # Ground '#EE99AC', # Fairy '#C03028', # Fighting '#F85888', # Psychic '#B8A038', # Rock '#705898', # Ghost '#98D8D8', # Ice '#7038F8', # Dragon ]

根据Pokemon类型的颜色分类小提琴图:

plt.figure(figsize=(15,7));sns.violinplot(x=data.Pokemon_Type, y = data["Attack Strength"], palette = pkmn_type_colors);

群集图

正如看到的,小提琴图非常适合可视化分布。然而,由于数据集中只有150个Pokemon,可能想要简单地显示每个点。这就是群集图的用武之地。这种可视化将显示每个点,同时“堆叠”具有相似值的点。

plt.figure(figsize=(12,5));sns.swarmplot(x=data.Pokemon_Type,y=data["Attack Strength"],palette=pkmn_type_colors);

这看起来不错,但为了更好的视觉效果,可以将这两个结合起来!毕竟,它们显示的是相同的信息。

叠加图

plt.figure(figsize=(10,10))sns.violinplot(x=data.Pokemon_Type, y = data["Attack Strength"], inner=None, palette = pkmn_type_colors);sns.swarmplot(x="Pokemon_Type",y="Attack Strength",data=data,color='black', #making points blackalpha=0.5);plt.title("Attacking Strength as per Pokemon’s Type");

注意事项:

  • inner=None : 移除小提琴内部的条形
  • alpha=0.5: 使点稍微透明:记住alpha值必须是浮点数,不要放在引号内

可以在这里找到Seaborn颜色的参考:

因子图

因子图可以轻松地按分类类别分隔图表。

plt.figure(figsize=(5,15))factplot= sns.factorplot(x="Pokemon_Type",y="Attack Strength",data=data,hue="Generation",col="Generation",kind="swarm");factplot.set_xticklabels(rotation=-45)plt.show()
  • plt.xticks(rotation=-45) : 不起作用,因为它只旋转最后一个图表
  • 需要使用:set_xticklabels
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485