Seaborn绘图——绘制两个变量的联合分布

记录利用 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 displot() 绘制两个变量的联合分布

1
2
3
4
5
6
7
8
9
sns.displot(data=penguin_df, x="bill_length_mm", y="bill_depth_mm", kind="kde", rug=True)
plt.show()
# thresh是0~1之间,越大画出来的越少;levels用来决定画出来的线多少,即稀疏程度,范围不止1
sns.displot(data=penguin_df, x="bill_length_mm", y="bill_depth_mm", kind="kde", thresh=0.7)
plt.show()
sns.displot(data=penguin_df, x="bill_length_mm", y="bill_depth_mm", kind="kde", thresh=0.2, levels=5)
plt.show()
sns.displot(data=penguin_df, x="bill_length_mm", y="bill_depth_mm", kind="kde", thresh=0.2, levels=50)
plt.show()
box-x
box-y
box-x
box-y
1
2
3
4
5
sns.displot(data=diamond_df, x="price", y="clarity", log_scale=[True, False])
plt.show()
# 两个类别变量
sns.displot(data=penguin_df, x="island", y="species")
plt.show()

结果如下:

box-x
box-y

上图中第一幅图进行了对数变换,越黑的地方表示价格越高。第二幅图是类别变量的分布。

3 jointplot()

jointplot() 可以用来绘制两个变量的联合分布和各自分布。

1
2
3
4
5
6
7
8
9
10
11
12
13
# kind : { "scatter" | "kde" | "hist" | "hex" | "reg" | "resid" }, default kind is scatter
sns.jointplot(data=tip_df, x="total_bill", y="tip")
plt.show()
sns.jointplot(data=tip_df, x="total_bill", y="tip", kind="kde")
plt.show()
sns.jointplot(data=tip_df, x="total_bill", y="tip", kind="hist")
plt.show()
sns.jointplot(data=tip_df, x="total_bill", y="tip", kind="hex")
plt.show()
sns.jointplot(data=tip_df, x="total_bill", y="tip", kind="reg")
plt.show()
sns.jointplot(data=tip_df, x="total_bill", y="tip", kind="resid")
plt.show()

结果如下:

box-x
box-x
box-y

box-x
box-x
box-y

1
2
sns.jointplot(data=tip_df, x="total_bill", y="tip", hue="sex")
plt.show()

加入hue来分类,结果如下:
06

1
2
3
# 绘制两个类型变量之间的分布
sns.jointplot(data=penguin_df, x="island", y="species", kind="hist")
plt.show()

07

4 JointGrid()

JointGrid() 是 joinplot() 的升级版,jointplot() 一般是选定 kind 类型,两个变量的分布和各自分布的类型就定下来了,而 JointGrid() 可以对其进行自定义,有两种写法。

1
2
3
4
5
6
7
g = sns.JointGrid(data=tip_df, x="total_bill", y="tip")
g.plot(sns.histplot, sns.boxplot)
plt.show()
g = sns.JointGrid(data=tip_df, x="total_bill", y="tip")
g.plot_joint(sns.kdeplot)
g.plot_marginals(sns.histplot, kde=True)
plt.show()

box-x
box-x

5 pairplot()

pairplot() 用来成对绘制所有数值变量的联合分布。

1
2
3
4
5
6
7
8
9
# kind : {'scatter', 'kde', 'hist', 'reg'}
sns.pairplot(data=tip_df)
plt.show()
sns.pairplot(data=tip_df, kind="kde")
plt.show()
sns.pairplot(data=tip_df, kind="hist")
plt.show()
sns.pairplot(data=tip_df, kind="reg")
plt.show()

box-x
box-x

box-x
box-x

1
2
3
4
5
6
7
# 加载一个数据量更多的数据集
car_df=sns.load_dataset("car_crashes")
sns.pairplot(data=car_df, kind="reg")
plt.show()
# 仅绘制两种
sns.pairplot(data=car_df, x_vars=["speeding", "alcohol"], y_vars=["total"])
plt.show()
box-x
box-x

6 PairGrid()

PairGrid() 是 pairplot() 的升级版,PairGrid() 中是通过 g.map() 来自定义绘制函数。

1
2
3
4
5
g = sns.PairGrid(data=car_df, x_vars=["total", "speeding", "alcohol"], y_vars=["total", "speeding", "alcohol"])
g.map_upper(sns.scatterplot) # 上三角绘制散点图
g.map_diag(sns.histplot, kde=True) # 对角线绘制直方图叠加kde曲线
g.map_lower(sns.regplot) # 下三角绘制回归曲线
plt.show()

14

7 heatmap()

heatmap() 是热力图,用来成对绘制所有数值变量的相关系数。

1
2
3
4
5
6
7
8
9
10
11
12
car_cor = car_df.corr()
print(car_cor)
sns.heatmap(car_cor, cmap="Blues")
plt.show()
# linewidth使格子分隔开,显示更清晰
sns.heatmap(car_cor, cmap="Blues", linewidth=0.5)
plt.show()
sns.heatmap(car_cor, cmap="coolwarm")
plt.show()
# 指定各格子上的数据显示小数点后两位
sns.heatmap(car_cor, cmap="coolwarm", annot=True, fmt=".2f", linewidth=0.5)
plt.show()

相关系数计算结果如下:
18

绘图结果如下:

box-x
box-x

box-x
box-x

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