大家好,我是Peter~
今天给大家带来一篇关于可视化库seaborn库的文章。
Seaborn是一个基于Python的数据可视化库,它建立在Matplotlib之上,提供了一种更简单、更美观的方式来创建统计图形。Seaborn旨在帮助用户轻松地生成有吸引力和信息丰富的可视化结果。
以下是Seaborn库的一些主要特点:
seaborn绘图的高级技巧:http://seaborn.pydata.org/examples/different_scatter_variables.html
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()
Out2:
导入iris数据集:
In 3:
iris = sns.load_dataset("iris") # 需要网络环境
iris
Out3:
下面的图形主要是基于两份数据进行绘制,包含的图形有:
希望帮助读者快速上手seaborn绘图,文章有点长,欢迎点赞收藏。
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()
显示散点图中回归趋势线:使用lmplot方法
In 7:
sns.lmplot(x="total_bill",
y="tip",
hue="time", # 分组
data=tips)
plt.title("better scatter with seaborn") # 添加标题
plt.show()
在默认情况下,只会对数据中数值型字段进行绘图:
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()
在默认情况下,只会对数据中数值型字段进行绘图:
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()
如果只给定x和y,barplot方法实际上进行一个聚合汇总求均值的操作:
In 22:
tips.groupby("day")["tip"].mean()
Out22:
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()
用于统计DataFrame中某个字段的不同取值数量。比如我们想统计sex中不同性别下的人数:
In 27:
tips.groupby("sex").size()
Out27:
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()
如果不传入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()
默认情况下是统计DataFrame中某个属性中不同取值出现的次数:以柱状图的形式显示
In 41:
tips.groupby("tip").size()
Out41:
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()
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()
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()
指定条件下的透视表:
In 59:
table = pd.pivot_table(tips,values="tip",columns=["day"],index=["sex"],aggfunc="mean")
table
Out59:
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()
In 63:
iris.dtypes
Out63:
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()
Out64:
默认情况下的聚类热力图:
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主要是通过kind参数来指定生成不同的图形,其作用等效于对应的函数:
在默认情况下,该函数将会生成散点图:
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参数指定生成不同图形:
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()
如何理解seaborn.FacetGrid函数?
(1)传入绘图数据
In 73:
sns.FacetGrid(tips)
Out73:
(2)指定行、列元素
In 74:
sns.FacetGrid(tips,col="day",row="sex")
Out74:
(3)调用map函数
In 75:
f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.scatterplot, "total_bill", "tip")
Out75:
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")
Out78:
In 79:
f = sns.FacetGrid(tips,col="day")
f.map_dataframe(sns.scatterplot, x="total_bill",y="tip")
Out79:
In 80:
f = sns.FacetGrid(tips, col="time")
f.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")
f.add_legend() # 添加图例(右侧)
Out80:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。