Seaborn: 带边际直方图的核密度估计图

4

我正在使用kdeplot绘制两个双变量分布的密度图,如下所示,其中df_cdf_n是两个Pandas数据帧:

f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df_c['attr1'], df_c['attr2'], ax=ax, cmap='Blues', shade_lowest=False)
sns.kdeplot(df_n['attr1'], df_n['attr2'], ax=ax, cmap='Reds',  shade_lowest=False)

我想要添加类似于jointplot的边缘直方图(示例图)。然而,我不能使用jointplot(因为一次只能绘制一个分布图,每次调用都会生成一个新的Figure),并且我找不到任何关于如何重现它所生成的边缘直方图的信息。
有没有一种简单的方法可以使用Seaborn / matplotlib生成带边缘直方图的kdeplot?或者,我是否忽略了使用jointplot绘制两个独立分布图的方式?
1个回答

5
您可以使用seaborn.JointGrid。正如seaborn作者在这个Github问题中所解释的那样,关键是使用称为ax_jointax_marg_xax_marg_y的三个组件轴。

希望下面的例子能满足您的需求:

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]

g = sns.JointGrid(x="sepal_width", y="petal_length", data=iris)
sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds",
            shade=True, shade_lowest=False, ax=g.ax_joint)
sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues",
            shade=True, shade_lowest=False, ax=g.ax_joint)
sns.distplot(setosa.sepal_width, kde=False, color="r", ax=g.ax_marg_x)
sns.distplot(virginica.sepal_width, kde=False, color="b", ax=g.ax_marg_x)
sns.distplot(setosa.sepal_length, kde=False, color="r", ax=g.ax_marg_y, vertical=True)
sns.distplot(virginica.sepal_length, kde=False, color="b", ax=g.ax_marg_y, vertical=True)
plt.show()

enter image description here


谢谢,运行得很顺利。(我觉得您忘记添加到您所指的GitHub问题的链接了。) - malexmave
1
@malexmave 抱歉,我刚刚添加了链接。谢谢你指出来。 - Y. Luo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接