记录利用 Seaborn 中关于两个变量的联合分布绘图方法。
1 前言
因为需要用到seaborn相关的绘图工具,因此记录一下学习笔记,方便后续自己查阅。
前期代码:1
2
3
4
5
6
7
8import 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 | sns.displot(data=penguin_df, x="bill_length_mm", y="bill_depth_mm", kind="kde", rug=True) |




1 | sns.displot(data=diamond_df, x="price", y="clarity", log_scale=[True, False]) |
结果如下:


上图中第一幅图进行了对数变换,越黑的地方表示价格越高。第二幅图是类别变量的分布。
3 jointplot()
jointplot() 可以用来绘制两个变量的联合分布和各自分布。
1 | # kind : { "scatter" | "kde" | "hist" | "hex" | "reg" | "resid" }, default kind is scatter |
结果如下:






1 | sns.jointplot(data=tip_df, x="total_bill", y="tip", hue="sex") |
加入hue来分类,结果如下:
1 | # 绘制两个类型变量之间的分布 |
4 JointGrid()
JointGrid() 是 joinplot() 的升级版,jointplot() 一般是选定 kind 类型,两个变量的分布和各自分布的类型就定下来了,而 JointGrid() 可以对其进行自定义,有两种写法。1
2
3
4
5
6
7g = 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()


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()




1 | # 加载一个数据量更多的数据集 |


6 PairGrid()
PairGrid() 是 pairplot() 的升级版,PairGrid() 中是通过 g.map() 来自定义绘制函数。1
2
3
4
5g = 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()
7 heatmap()
heatmap() 是热力图,用来成对绘制所有数值变量的相关系数。1
2
3
4
5
6
7
8
9
10
11
12car_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()
相关系数计算结果如下:
绘图结果如下:



