Seaborn绘图——catplot 类别变量的分析

记录利用 Seaborn 中关于类别变量的分析方法。

1 前言

因为需要用到seaborn相关的绘图工具,因此记录一下学习笔记,方便后续自己查阅。
前期代码:

1
2
3
4
5
6
7
8
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

tip_df = sns.load_dataset("tips")
penguin_df = sns.load_dataset("penguins")
diamond_df = sns.load_dataset("diamonds")
car_df = sns.load_dataset("car_crashes")

2 catplot() 绘制类别变量

2.1 类别变量的分布

绘制类别变量的分布可以用countplot() 或者 histplot() 两种函数。histplot() 在专栏的前述文章已经介绍过。

1
2
sns.catplot(data=tip_df, x="time", kind="count")
plt.show()

01

2.2 不同类别中数值变量的均值、中值估计

barplot, pointplot

1
2
3
4
5
6
7
8
9
10
# 绘制数值变量的中值估计,分别为柱状图或者点图,estimator默认是均值
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="bar")
plt.show()
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="point")
plt.show()
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="bar", estimator=np.median)
plt.show()
# 再加入类别
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="point", hue="island")
plt.show()

box-x
box-y

box-x
box-y

2.3 catplot的FacetGrid特性

不同人数对应均值的估计。

1
2
sns.catplot(data=tip_df, x="time", y="tip", kind="bar", col="size", col_wrap=3)
plt.show()

5

2.4 boxplot和boxenplot

1
2
3
4
5
6
7
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="box")
plt.show()
sns.catplot(data=diamond_df, x="clarity", y="price", kind="box")
plt.show()
# boxen 适合大数据集,会逐级绘制
sns.catplot(data=diamond_df, x="clarity", y="price", kind="boxen")
plt.show()
box-x
box-y
box-y

对比上图中的后两幅图,可以看出用 boxenplot 会使得数据集中的异常值更少。

2.5 带状图、小提琴图

stripplot, swarmplot, violinplot 用带状图、小提琴图来对不同类别中数值变量的分布进行刻画。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="strip")
plt.show()
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="strip", jitter=False)
plt.show()
# jitter 在0~1之间,False的时候不会散开
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="strip", jitter=0.3)
plt.show()
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="swarm")
plt.show()
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="violin")
plt.show()
# 第一个用catplot,第二个用swarmplot,可以将它们绘制在一起,并指定大小为3的白色圆点
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", kind="violin")
sns.swarmplot(data=penguin_df, x="species", y="bill_length_mm", color="w", size=3)
plt.show()

box-x
box-y
box-y

box-x
box-y
box-y

1
2
3
4
5
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", hue="sex", kind="violin")
plt.show()
# 将上图两边各取一半合并绘制
sns.catplot(data=penguin_df, x="species", y="bill_length_mm", hue="sex", kind="violin", split=True)
plt.show()
box-x
box-y

3 FacetGrid,PairGrid 中自定义绘制函数

FacetGrid 是将数据集中的数据依据各类别变量划分为不同的子集,再在子集上进行分析。

PairGrid 是在全部数据集上将所有的数值变量成对分析。

1
2
3
4
5
6
7
8
9
10
11
# 创建一个空白的FacetGrid
g = sns.FacetGrid(data=tip_df, row="time", col="smoker")
plt.show()
# 依据smoker和time划分,并绘制其kde函数,row和col必须是类别变量
g = sns.FacetGrid(data=tip_df, row="smoker", col="time")
g.map(sns.kdeplot, "tip")
plt.show()
g = sns.FacetGrid(data=tip_df, row="time", col="smoker")
# 错误:g.map(sns.scatterplot,data=tip_df,x="total_bill",y="tip")
g.map(sns.scatterplot, "total_bill", "tip")
plt.show()
box-x
box-y
box-y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
g = sns.PairGrid(data=penguin_df)  # 创建一个空白的对象
plt.show()
g = sns.PairGrid(data=penguin_df, hue="species")
g.map(sns.scatterplot)
plt.show()
g = sns.PairGrid(data=penguin_df, hue="species")
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.scatterplot) # 非对角线是散点图
plt.show()
g = sns.PairGrid(data=penguin_df)
g.map_diag(sns.histplot) # 对角线上是直方图
g.map_upper(sns.kdeplot) # 上三角是kde
g.map_lower(sns.scatterplot) # 下三角是散点图
plt.show()

20
20
20
20

------ 本文结束感谢您的阅读------
Donate a cup of cola?