公众号:尤而小屋
作者:Peter
编辑:Peter
大家好,我是Peter~
今天给大家带来一篇关于可视化库seaborn库的文章。
Seaborn简介
Seaborn是一个基于Python的数据可视化库,它建立在Matplotlib之上,提供了一种更简单、更美观的方式来创建统计图形。Seaborn旨在帮助用户轻松地生成有吸引力和信息丰富的可视化结果。
以下是Seaborn库的一些主要特点:
- 美观的默认样式:Seaborn通过提供现成的样式和颜色主题,使得创建各种类型的图形变得更加简单。它的默认样式经过精心设计,使得图表具有更高的可读性和美观度。
- 内置的统计图形:Seaborn提供了一系列内置的统计图形,例如柱状图、箱线图、散点图、折线图等。这些图形不仅易于使用,还具有各种选项和参数,可以帮助你更好地展示和理解数据。
- 数据集可视化:Seaborn还包含一些内置的示例数据集,这些数据集可以直接在库中使用。你可以使用这些数据集来快速生成演示图表,同时也可以将它们作为学习和实践的基础。
- 统计功能增强:Seaborn提供了许多额外的统计功能,使得数据探索更加方便。例如,你可以使用Seaborn轻松地绘制分布图、拟合回归线、绘制核密度图等。
- 多变量数据可视化:Seaborn提供了一些强大的工具来可视化多变量数据。你可以使用Seaborn绘制矩阵图、热力图、聚类图等,以揭示不同变量之间的关系和模式。
seaborn绘图的高级技巧:seaborn.pydata.org/examples/di…
导入内置数据
seaborn内置了一些数据集:
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
导入seaborn内置的消费数据集:
In [2]:
tips = sns.load_dataset("tips") # 需要网络环境
tips.head()
Out[2]:
导入iris数据集:
In [3]:
iris = sns.load_dataset("iris") # 需要网络环境
iris
Out[3]:
下面的图形主要是基于两份数据进行绘制,包含的图形有:
- 散点图sns.scatter
- 回归散点图sns.lmplot
- 分类散点图sns.stripplot
- 分簇散点图sns.swarmplot
- 柱状图sns.barplot
- 计数柱状图sns.countplot
- 直方图sns.histplot
- 分布图sns.displot
- 箱型图sns.boxplot
- 小提琴图sns.violin
- 热力图sns.heatmap
- 聚类热图sns.clustermap
- 分类图sns.catplot
- 多图网格sns.FaceGrid
希望帮助读者快速上手seaborn绘图,文章有点长,欢迎点赞收藏。
散点图sns.scatterplot
基础散点图
In [4]:
sns.scatterplot(x="total_bill",y="tip",data=tips)
plt.title("basic scatter with seaborn") # 添加标题
plt.show()
进阶散点图
指定散点的大小:
In [5]:
sns.scatterplot(x="total_bill",
y="tip",
size="size", # 指定散点大小
data=tips)
plt.title("better scatter with seaborn") # 添加标题
plt.show()
指定hue进行分组:
In [6]:
sns.scatterplot(x="total_bill",
y="tip",
hue="day", # 指定散点大小
data=tips)
plt.title("better scatter with seaborn") # 添加标题
plt.show()
回归散点图sns.lmplot
显示散点图中回归趋势线:使用lmplot方法
In [7]:
sns.lmplot(x="total_bill",
y="tip",
hue="time", # 分组
data=tips)
plt.title("better scatter with seaborn") # 添加标题
plt.show()
分类散点图sns.stripplot
默认情况
在默认情况下,只会对数据中数值型字段进行绘图:
In [8]:
sns.stripplot(data=tips)
plt.show()
通过参数orient设置水平或者垂直:
In [9]:
sns.stripplot(data=tips,orient="h")
plt.show()
基础分类散点图
指定x或者y
In [10]:
# 水平
sns.stripplot(data=tips, x="tip")
plt.show()
指定为y轴绘图:
In [11]:
# 垂直
sns.stripplot(data=tips, y="tip")
plt.show()
进阶分类散点图
水平方向:
In [12]:
sns.stripplot(data=tips, x="tip",y="day")
plt.show()
垂直方向:
In [13]:
sns.stripplot(data=tips, x="day", y="tip")
plt.show()
通过hue指定分组:
In [14]:
sns.stripplot(data=tips, x="day", y="tip", hue="smoker")
plt.show()
设置多个其他参数:
In [15]:
sns.stripplot(
data=tips, # 指定数据、x、y轴
x="total_bill",
y="day",
hue="time", # 分组字段
jitter=False, # 抖动点
s=20, # 控制点的大小
marker="D", # D-方形 S-圆点
linewidth=1, # 线宽
alpha=.3 # 透明度
)
plt.show()
分簇散点图sns.swarmplot
默认情况
在默认情况下,只会对数据中数值型字段进行绘图:
In [16]:
sns.swarmplot(data=tips)
plt.show()
通过orient指定水平方向:
In [17]:
sns.swarmplot(data=tips,orient='h')
plt.show()
基础分簇散点图
In [18]:
# 水平
sns.swarmplot(data=tips, x="total_bill")
plt.show()
指定在y轴上绘图:
In [19]:
# 水平
sns.swarmplot(data=tips, y="total_bill")
plt.show()
同时指定x和y
In [20]:
sns.swarmplot(data=tips,x="time", y="total_bill")
plt.show()
进阶分簇散点图
In [21]:
sns.swarmplot(data=tips,
x="time",
y="total_bill",
hue="day", # 指定分组字段
marker="*", # 设置marker 默认是圆点
size=7, # 设置marker大小
linewidth=0.5 # 设置线宽
)
plt.show()
柱状图sns.barplot
基础柱状图
如果只给定x和y,barplot方法实际上进行一个聚合汇总求均值的操作:
In [22]:
tips.groupby("day")["tip"].mean()
Out[22]:
day
Fri 2.734737
Sat 2.993103
Sun 3.255132
Thur 2.771452
Name: tip, dtype: float64
In [23]:
sns.barplot(data=tips,x="day",y="tip")
plt.show()
进阶柱状图
hue参数指定分组的字段:
In [24]:
sns.barplot(
data=tips,
x="day",
y="tip",
hue="smoker" # 指定分组字段
)
plt.show()
order参数指定x轴label的顺序:
In [25]:
sns.barplot(
data=tips,
x="day",
y="tip",
hue="smoker", # 指定分组
order=["Thur","Fri","Sat","Sun"] # 指定x轴label的顺序
)
plt.show()
水平柱状图
orient参数指定水平h或者垂直v
In [26]:
sns.barplot(
data=tips,
x="tip", # x轴的数据必须为数值
y="day",
hue="smoker",
orient="h"
)
plt.show()
计数柱状图sns.countplot
用于统计DataFrame中某个字段的不同取值数量。比如我们想统计sex中不同性别下的人数:
In [27]:
tips.groupby("sex").size()
Out[27]:
sex
Female 87
Male 157
dtype: int64
可以看到统计结果:Female是87人,Male是157人
In [28]:
# 写法1
# sns.countplot(tips["sex"])
# 写法2
sns.countplot(data=tips,x="sex")
plt.show()
也可以指定不同的分组:
In [29]:
sns.countplot(data=tips,
x="sex",
hue="day" # 指定分组
)
plt.show()
绘制水平柱状图:
In [30]:
sns.countplot(data=tips,
y="sex", # 将x改成y即可
hue="day" # 指定分组
)
plt.show()
直方图sns.histplot
默认情况
如果不传入x和y,默认是对DataFrame中所有的数值字段进行操作:
In [31]:
sns.histplot(data=tips)
plt.show()
基础直方图
传入x或者y的情况:
In [32]:
sns.histplot(data=tips,x="tip")
# sns.histplot(x=tips["tip"]) 等价
plt.show()
In [33]:
# fill表示是否填充柱子
sns.histplot(data=tips,x="tip",fill=False)
plt.show()
改成水平方向柱状图:
In [34]:
sns.histplot(data=tips,y="tip")
# sns.histplot(y=tips["tip"]) 等价
plt.show()
进阶直方图
binwidth控制每个柱子的宽度;bins控制柱子的个数
In [35]:
sns.histplot(data=tips,x="tip",binwidth=0.1,bins=50)
plt.show()
kde开启直方图与核密度图同时显示:
In [36]:
sns.histplot(data=tips,x="tip",kde=True)
plt.show()
In [37]:
sns.histplot(data=tips,x="tip",hue="day") # 指定分组情况
plt.show()
In [38]:
sns.histplot(data=tips,
x="tip",
hue="day",
multiple="stack" # 以堆叠的形式显示
)
plt.show()
In [39]:
sns.histplot(data=tips,
x="tip",
hue="day",# 分组
stat="density", # 密度图(y轴刻度)
element="step") # bars step poly ;控制密度图显示方式,默认bars
plt.show()
In [40]:
sns.histplot(data=tips,
x="tip",
hue="day",# 分组
stat="density", # 密度图(y轴刻度)
element="poly") # bars step poly ;控制密度图显示方式
plt.show()
分布图sns.displot
基础分布图
默认情况下是统计DataFrame中某个属性中不同取值出现的次数:以柱状图的形式显示
In [41]:
tips.groupby("tip").size()
Out[41]:
tip
1.00 4
1.01 1
1.10 1
1.17 1
1.25 3
..
6.70 1
6.73 1
7.58 1
9.00 1
10.00 1
Length: 123, dtype: int64
In [42]:
sns.displot(data=tips,x="tip")
# sns.displot(data=tips["tip"]) 等价
plt.show()
进阶分布图
In [43]:
sns.displot(data=tips,x="tip",hue="sex") # 指定分组
plt.show()
使用kind参数,取值为:[‘hist’, ‘kde’, ‘ecdf’]。hist就是上面默认的情况:
In [44]:
sns.displot(data=tips,x="tip",kind="kde")
# sns.kdeplot(data=tips,x="tip") 等价于kdeplot
plt.show()
ecdf表示累计求和的效果:
In [45]:
# empirical cumulative distribution functions (ECDFs)
sns.displot(data=tips,x="tip",kind="ecdf")
plt.show()
使用直方图结合核密度图:
In [46]:
sns.displot(data=tips,x="tip",kde=True)
plt.show()
箱型图sns.boxplot
基础箱型图
In [47]:
# sns.boxplot(tips["tip"]) # 等价1;默认是x=tips["tip"]
# sns.boxplot(data=tips, x="tip") # 等价2
sns.boxplot(x=tips["tip"])
plt.show()
如果指定为y=tips["tip"]
,则变成垂直箱型图:
In [48]:
# sns.boxplot(data=tips, y="tip") # 等价
sns.boxplot(y=tips["tip"])
plt.show()
同时指定x和y:
In [49]:
sns.boxplot(data=tips, x="day",y="tip")
plt.show()
交换x和y的位置变成水平箱型图:
In [50]:
sns.boxplot(data=tips, y="day",x="tip")
plt.show()
进阶箱型图
hue执行分组,此时x和y必须同时指定:
In [51]:
# hue执行分组
sns.boxplot(data=tips, x="day",y="tip",hue="sex")
plt.show()
dodge参数表示在执行hue分组的时候,不同组别下的数据是否放在一个主体中:
In [52]:
sns.boxplot(data=tips, x="day",y="tip",hue="sex",dodge=False)
plt.show()
设置多个绘图参数:
In [53]:
sns.boxplot(data=tips,
x="day",
y="tip",
hue="sex",
showcaps=False, # 是否显示箱须(横线部分)
notch=True # 是否开启显示V型槽(箱体凹槽)
)
plt.show()
小提琴图sns.violinplot
基础小提琴图
In [54]:
# sns.violinplot(tips["tip"]) # 默认是x=tips["tip"]
# sns.violinplot(x=tips["tip"])
sns.violinplot(data=tips,x="tip")
plt.show()
垂直小提琴图:
In [55]:
# sns.violinplot(data=tips,y="tip")
sns.violinplot(y=tips["tip"])
plt.show()
进阶小提琴图
In [56]:
sns.violinplot(data=tips, x="sex",y="tip",hue="day")
plt.show()
交换x和y的位置,变成水平小提琴图:
In [57]:
# 交换x和y的位置
sns.violinplot(data=tips, y="sex",x="tip",hue="day")
plt.show()
设置其他参数:
In [58]:
sns.violinplot(data=tips,
y="sex",
x="tip",
hue="day",
inner="stick" # 控制内部虚线
)
plt.show()
热力图sns.heatmap
基础热力图
指定条件下的透视表:
In [59]:
table = pd.pivot_table(tips,values="tip",columns=["day"],index=["sex"],aggfunc="mean")
table
Out[59]:
In [60]:
sns.heatmap(table) # 默认
plt.show()
进阶热力图
In [61]:
# 显示文本信息及保留一位小数;设置线宽
sns.heatmap(table, # 数据
annot=True, # 显示文本
fmt=".1f", # 保留一位小数
linewidths=0.5, # 设置线宽
vmin=2, # 颜色棒的最大值和最小值
vmax=3.5,
cbar=True, # 是否显示右边的颜色棒
cmap="crest" # 色谱选择 cmap=sns.cubehelix_palette(as_cmap=True)
)
plt.show()
将x轴刻度显示在上面:
In [62]:
fig = sns.heatmap(table, annot=True,fmt=".1f")
fig.set(xlabel="",ylabel="")
fig.xaxis.tick_top()
聚类热图sns.clustermap
基础聚类热图
In [63]:
iris.dtypes
Out[63]:
sepal_length float64
sepal_width float64
petal_length float64
petal_width float64
species object
species_id int64
dtype: object
In [64]:
# 删除species字段,因为它的取值为字符串信息
iris_new = iris.drop("species",axis=1)
iris_new.head()
Out[64]:
默认情况下的聚类热力图:
In [65]:
sns.clustermap(iris_new)
plt.show()
进阶聚类热图
In [66]:
sns.clustermap(iris_new,
figsize=(10,6), # 大小
cmap="mako", # 色谱
standard_scale=1, # 是否数据缩放标准化(颜色棒取值为0到1)
row_cluster=True, # 是否row方向聚类效果(左侧)
)
plt.show()
分类图sns.catplot
分类图方法sns.catplot主要是通过kind参数来指定生成不同的图形,其作用等效于对应的函数:
- kind=”box”:boxplot
- kind=”violin”:violinplot
- kind=”point”:pointplot
- kind=”bar”:barplot
- kind=”count”:countplot
- kind=”strip”:stripplot
- kind=”swarm”:swarmplot
默认情况
在默认情况下,该函数将会生成散点图:
In [67]:
# 垂直方向
sns.catplot(data=tips,x="day",y="tip")
plt.show()
调换x和y的位置:
In [68]:
# 水平方向
sns.catplot(data=tips,y="day",x="tip")
plt.show()
kind参数
通过kind参数指定生成不同图形:
In [69]:
sns.catplot(data=tips,
x="day",
y="tip",
kind="bar")
plt.show()
In [70]:
sns.catplot(data=tips,
x="day",
y="tip",
kind="box")
plt.show()
In [71]:
sns.catplot(data=tips,
x="day",
y="tip",
kind="violin"
)
plt.show()
In [72]:
sns.catplot(data=tips,
x="day",
y="tip",
kind="swarm")
plt.show()
多图网格sns.FacetGrid
如何理解seaborn.FacetGrid函数?
(1)传入绘图数据
In [73]:
sns.FacetGrid(tips)
Out[73]:
(2)指定行、列元素
In [74]:
sns.FacetGrid(tips,col="day",row="sex")
Out[74]:
(3)调用map函数
In [75]:
f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.scatterplot, "total_bill", "tip")
Out[75]:
In [76]:
f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.violinplot, "total_bill")
In [77]:
f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.histplot, "total_bill")
(4)调用map_dataframe函数
In [78]:
f = sns.FacetGrid(tips,col="sex",row="time")
f.map_dataframe(sns.barplot, y="total_bill")
Out[78]:
In [79]:
f = sns.FacetGrid(tips,col="day")
f.map_dataframe(sns.scatterplot, x="total_bill",y="tip")
Out[79]:
In [80]:
f = sns.FacetGrid(tips, col="time")
f.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")
f.add_legend() # 添加图例(右侧)
Out[80]: