我正在尝试针对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)
答案 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])