FacetGrid创建自己的图形。将几个数字组合成一个不是一件容易的事。此外,不存在可添加到图形的子图行之类的东西。因此,需要单独操纵轴。
也就是说,找到解决方法可能会更容易。例如,如果要显示的数据帧具有与问题代码相同的结构,则可以将数据帧合并为带有新列的单个帧,并将其用作
row构面网格的属性。
import numpy as np; np.random.seed(3)import pandas as pdimport seaborn.apionly as snsimport matplotlib.pyplot as pltdef 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=[7,19])data3 = get_data(s=[1,27])#option1 combinefor i, df in enumerate([data1,data2,data3]): df["data"] = ["data{}".format(i+1)] * len(df)data = data1.append(data2)data = data.append(data3)bw = 2a = sns.FacetGrid(data, col="overlap", hue="comp", row="data")a = (a.map(sns.kdeplot, "val",bw=bw ))plt.show()您还可以遍历数据框和轴以获得所需的结果。
import numpy as np; np.random.seed(3)import pandas as pdimport seaborn.apionly as snsimport matplotlib.pyplot as pltdef 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=[7,19])data3 = get_data(s=[1,27])#option2 plot each subplot individuallydata = [data1,data2,data3]bw = 2fig, axes = plt.subplots(3,3, sharex=True, sharey=True)for i in range(3): for j in range(3): x = data[i] x = x[x["overlap"] == x["overlap"].unique()[j]] for hue in x["comp"].unique(): d = x[x["comp"] == hue] sns.kdeplot(d["val"], ax=axes[i,j], bw=bw, label=hue )plt.show()


