我正在使用kdeplot绘制两个双变量分布的密度,其中df_c
和df_n
是两个Pandas DataFrames:
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(example plot)生成的边缘直方图。但是,我不能使用jointplot(因为它显然不可能用Jointplot绘制两个不同的分布,因为它会在每次调用时生成一个新的图形),我找不到有关如何重现它产生的边缘直方图的任何信息
使用Seaborn / matplotlib是否有一种简单的方法可以生成具有边缘直方图的kdeplot?或者,我是否忽略了使用关节图绘制两个单独分布的方法?
答案 0 :(得分:3)
您可以使用seaborn.JointGrid
。正如seaborn在this Github issue中的作者所解释的那样,关键是使用
"名为
ax_joint
,ax_marg_x
和ax_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()