介绍seaborn和matplotlib一样,试图使一组定义明确的且困难的事情变得容易。Seaborn的优势:Seaborn最大的优势在于其绘图功能的多样性,它甚至允许我们只在一行代码中就绘制复杂的绘图!在本教程中,我们使用三个库来制作漂亮的图表——Matplotlib、Seaborn和Pandas。如果你是Python的初学者,我建议你先熟悉Matplotlib和Pandas。如果你严格遵循本教程,你可以使用这三个库制作出漂亮的图表,同时可以将我的代码用作将来任何可视化任务的模板。让我们从著名的口袋妖怪数据集开始。在开始之前,我强烈建议你为每个图形编写自己的基础代码,并尝试使用图形。你可以在Kaggle上找到Pokemon数据集,为了让你的学习更轻松,我缩短并清理了这个版本的数据集。你可以在此处下载数据集:https://github.com/shelvi31/Seaborn-Experiments帮助资料:https://python-graph-gallery.com/.我们现在开始绘制图表:首先导入必要的库:#importing libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
读取CSV文件data = pd.read_csv(“Pokemon.csv”,encoding= ‘unicode_escape’)
通过 read_csv() 命令定义不同的编解码来避免utf8的编解码错误。我们的数据看起来像这样…data.head()
输出:
列的名称并没有清楚地简化其用途。在实际使用数据集之前了解它是很重要的。以下是数据集的简化描述。该数据集包括150个与神奇宝贝游戏有关的神奇宝贝(不是口袋妖怪卡片或口袋妖怪围棋)。在这个数据集中,我们有150行和13列。列说明:#*ID*:每个口袋妖怪的ID
#Name:每个口袋妖怪的名字
#Type1:每个口袋妖怪都有一个类型,这决定了它攻击的弱点/抵抗力
#Type2:一些口袋妖怪是双重类型,有2个类型
#Total:所有统计数据的总和,关于口袋妖怪有多强的一般指南
#HP:生命值定义了口袋妖怪在晕倒前能承受的伤害
#Attack:普通攻击的基础修饰语(如刮痕,重击)
#Defense:抵抗普通攻击的基础伤害
#SP Atk,特殊攻击的基础修饰语(如火焰爆炸,气泡束)
#*SP Def*: 防御特殊攻击的基础伤害
#Speed:决定哪只口袋妖怪每轮先攻击
#Stage:Stage数
#Legendary:传奇的口袋妖怪是真的,不是假的
我已经重新命名了这些列名,以使我们的策划更有意义,使我们的思路更加清晰。虽然这是可选的,但我强烈建议你这样做,以消除任何可能的混乱。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()
输出:
接下来让我们从简单的分布图开始可视化。分布图:分布图显示根据标注绘制的一组数值的分布和范围。直方图允许你绘制数值变量的分布。我本可以用“data.hist(figsize=(12,10),bins=20)”,但由于并非此数据库中的所有列都有数值,因此,我必须绘制单独的分布图。plt.figure(figsize=(4,3))
sns.distplot(x=data[“Sum of Attack”],color=”Orange”,kde=True,rug=True);
plt.show()
分布图输出:口袋妖怪攻击的总和seaborn的显示函数用密度曲线绘制直方图,我们可以使用选项 kde=“False” 去除密度,使用rug=“True”控制rug的存在。在python中绘制直方图有许多替代方法: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()
输出:直方图,Matplotlib因此,对于许多绘制分布的方法,所有函数如pyplot.hist, seaborn.CooutCountPlot以及seaborn.dispot充当了 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 matplotlib
plt.xticks(rotation=-45);
散点图:散点图(也称散点图,scatter graph)使用点来表示两个不同数值变量的值,水平轴和垂直轴上每个点的位置表示单个数据点的值。散点图用于观察变量之间的关系。我用散点图比较了神奇宝贝的攻防数据。
Seaborn没有专用的散点图函数,这就是为什么我们在这里默认看到一条对角线(回归线)。但seaborn帮助我们调整了图像:fit_reg=False 用于删除回归线hue='Stage' 用于通过第三个变量值为点上色,因此,允许我们用颜色来表达信息的第三维度。这里我把神奇宝贝的进化阶段作为第三个变量!#Tweaking with scatter plotsns.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 line
hue=”Generation”); #Separating as per pokemon generationplt.ylim(20,130);
plt.xlim(25,125);
我们现在可以看到一个更集中和更好的图表!
箱形图箱形图用于通过四分位数描述数值数据组。箱形图也可能有从箱子延伸出来的线,表示上下四分位数之外的变化,因此术语为盒须图以及须盒图我们可以删除“Sum of Attack(攻击总和)”列,因为我们有个人统计。我们也可以删除“Generation(世代)”和“Legendary(传奇)”列,因为它们不是战斗统计。plt.figure(figsize=(15,7));# Pre-format DataFrame
stats_data = data.drop([‘Sum of Attack’, ‘Generation’, ‘Legendary’], axis=1);
# New boxplot using stats_df
sns.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”]);
正如你所看到的,龙型的攻击属性往往比鬼魂型高,但它们也有更大的差异。现在,神奇宝贝的粉丝们可能会发现这个图表有些不和谐,因为颜色是不合适的,为什么草型的颜色是粉红色,水型的颜色是橙色?我们必须马上解决这个问题!幸运的是,Seaborn允许我们设置自定义调色板,我们可以简单地创建一个有序的Python颜色十六进制值列表。我用Bulbapedia创建了一个新的调色板。# using Bulbapedia to create a new color palette:#Bulbapedia : https://bulbapedia.bulbagarden.net/wiki/Category:Type_color_templatspkmn_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
]
根据口袋妖怪类型的颜色修改小提琴图:plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type,
y = data[“Attack Strength”],
palette = pkmn_type_colors);
分簇散点图如你所见,小提琴图非常适合可视化分布。然而,由于我们的数据集中只有150个神奇宝贝,我们有时可能想简单地显示每个点,这时就用到了分簇散点图,它可以显示每个点,同时“叠加”具有相似值的点。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 black
alpha=0.5);plt.title(“Attacking Strength as per Pokemon’s Type”);
注意事项:*inner = None:*移除小提琴内部的横条*alpha = 0.5:*使点稍微透明:记住alpha值必须为浮点,不要保留在“”中你可以在这里找到seaborn 关于颜色设置的参考资料:https://python-graph-gallery.com/100-calling-a-color-with-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你只需更改变量名并运行相同的代码行,就可以像上面那样进行更多的可视化。我把它作为一个练习留给你去做,以便更好地掌握Python的可视化技能。
本文到此为止!希望这个教程对你来说有帮助,祝你的数据科学之旅学习愉快!