我使用kdeplot来绘制两个二元分布的密度,如下所示,其中df_c和df_n是两个 Pandas DataFrame:
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)
Run Code Online (Sandbox Code Playgroud)
我还想包括边际直方图,例如由jointplot生成的边际直方图(示例图)。但是,我无法使用 jointplot (因为显然不可能用 jointplot 绘制两个不同的分布,因为每次调用它时它都会生成一个新的图形),并且我找不到有关如何重现它生成的边际直方图的任何信息。
有没有一种简单的方法可以使用 Seaborn / matplotlib 生成带有边缘直方图的 kdeplot?或者,我是否忽略了使用联合图绘制两个单独分布的方法?
hue组的 aseaborn.kdeplot或seaborn.displotwithkind='kde'赋予不同的值linestyle?
strfor linestyle/ls,它适用于所有hue组。import seaborn as sns
import matplotlib.pyplot as plt
# load sample data
iris = sns.load_dataset("iris")
# convert data to long form
im = iris.melt(id_vars='species')
# axes-level plot works with 1 linestyle
fig = plt.figure(figsize=(6, 5))
p1 = sns.kdeplot(data=im, x='value', hue='variable', fill=True, ls='-.')
# figure-level plot works with 1 linestyle
p2 = sns.displot(kind='kde', data=im, x='value', hue='variable', fill=True, ls='-.')
Run Code Online (Sandbox Code Playgroud)
kdeplotdisplot我有这样的数据集
import numpy as np; np.random.seed(3)
import pandas as pd
import seaborn.apionly as sns
import matplotlib.pyplot as plt
def get_data(n=266, s=[5,13]):
val = np.c_[np.random.poisson(lam=s[0], size=n),
np.random.poisson(lam=s[1], size=n)].T.flatten()
comp = [s[0]]*n + [s[1]]*n
ov = np.random.choice(list("ABC"), size=2*n)
return pd.DataFrame({"val":val, "overlap":ov, "comp":comp})
data1 = get_data(s=[9,11])
data2 = get_data(s=[9,11])
data3 = get_data(s=[9,11])
#option1 combine
for i, df in enumerate([data1,data2,data3]):
df["data"] = ["data{}".format(i+1)] * len(df)
data = data1.append(data2)
data = data.append(data3)
bw = 2
a = sns.FacetGrid(data, col="overlap", hue="comp", row="data")
a = (a.map(sns.kdeplot, "val",bw=bw …Run Code Online (Sandbox Code Playgroud)