使用Seaborn的子图

时间:2019-10-30 12:11:12

标签: python pandas matplotlib seaborn

我正在尝试针对3X2子图形式中的变量绘制三个变量的箱形图和小提琴图。但是我不知道如何在子图函数中包含sns lib。

2019-10-30 14:56:23.909 661-661/com.zarringovar.zarrincenter E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.zarringovar.zarrincenter, PID: 661
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:5259)

2 个答案:

答案 0 :(得分:1)

我认为您有两个问题。

首先,plt.subplots(nrows=3, ncols=2)返回一个图形对象和一个坐标轴对象数组,因此您应该将以下行替换为: fig, ax = plt.subplots(nrows=3, ncols=2)ax对象现在是3x2的numpy轴对象数组。

您可以使用ax = ax.flatten()将其转换为一维数组,但是鉴于我认为您要尝试做的事情,我认为将其保持为3x2更为容易。 (顺便说一句,我假设ncols=3是一个错字)

第二,正如Ewoud答案在seaborn中提到的那样,您将要绘制的轴作为绘图调用的参数传递。

我认为以下对您有用:

fig, ax = plt.subplots(nrows=3, ncols=2)
for i, feature in enumerate(list(df.columns.values)[:-1]):
    # for each feature create two plots on the same row
    sns.boxplot(data=df, x='survival_status_after_5yrs',y=feature, ax=ax[i, 0])
    sns.violinplot(data=df, x='survival_status_after_5yrs', y=feature, ax=ax[i, 1])
plt.show()

答案 1 :(得分:0)

大多数seaborn绘图函数的轴都为kwarg,所以不是

axis[i].plot(sns.boxplot(data=df,x='survival_status_after_5yrs',y=feature))

尝试

sns.boxplot(data=df,x='survival_status_after_5yrs',y=feature,axis=axis[i])