Seaborn 是一个基于Matplotlib的数据可视化库,它提供了丰富的绘图功能,使得创建复杂的图表变得简单。本文将介绍如何结合使用Seaborn、Matplotlib和Pandas三个库来制作图表,并以Pokemon数据集为例进行实践。如果是Python的初学者,建议先熟悉Matplotlib和Pandas的基本用法。
Seaborn 最大的优势在于其多样的绘图函数。它允许即使在单行代码中也能创建复杂的图表。本文将使用三个库:Matplotlib、Seaborn和Pandas。如果是Python的完全新手,建议先从Matplotlib和Pandas开始,稍微熟悉一下。如果完全按照本教程操作,将能够使用这三个库制作出漂亮的图表。可以将代码作为未来任何可视化任务的模板。
将以著名的Pokemon数据集开始Seaborn之旅。在开始之前,强烈建议为每个图表编写自己的基础代码,并尝试实验不同的图表。可以在Kaggle上找到Pokemon数据集。为了简化旅程,已经缩短并清理了这个版本的数据集。可以在这里下载数据集:
想提一个资源,每当遇到难题时,它总是超级救星:.
将从导入必要的库开始:
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
data = pd.read_csv('Pokemon.csv', encoding = 'unicode_escape')print(data.head())
通过在read_csv()命令中定义不同的编码包来切换utf8编码错误。数据看起来像这样……
列名并没有简化其目的。在实际处理数据之前,了解数据集是很重要的。这里是数据集的简化描述。这个数据集包括150个Pokemon,是关于Pokemon游戏的(不是Pokemon卡片或Pokemon Go)。在这个数据集中,有150行和13列。
列描述:
已经重命名了列名,以便在绘图中更有意义,并清晰地表达。虽然这是可选的,但强烈建议这样做,以消除任何混淆的可能性。
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");
注意事项:
可以在这里找到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()