如何使用Seaborn在一行中绘制多个图形

12

我有一个数据框 df,看起来像这样:

df.head()
id        feedback        nlp_model        similarity_score
0xijh4    1               tfidf            0.36
0sdnj7    -1              lda              0.89
kjh458    1               doc2vec          0.78
....

我想使用seaborn将similarity_score与反馈以箱形图的形式绘制出来,针对model列中的每个唯一值:tfidfldadoc2vec。我的代码如下:

fig, ax = plt.subplots(figsize=(10,8))
ax = sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='tfidf'])
ax = sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='tfidf'], color="0.25")

fig, ax = plt.subplots(figsize=(10,8))
ax = sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='lda'])
ax = sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='lda'], color="0.25")

fig, ax = plt.subplots(figsize=(10,8))
ax = sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='doc2vec'])
ax = sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='doc2vec'], color="0.25")

plt.show()

问题在于这会创建三个叠在一起的图表。

enter image description here

我应该如何生成这些相同的图表,但是全部放在一行上,其中一个轴标记为“相似度分数”,仅在最左边的图表上,并且“反馈”轴标签直接位于每个图表下方?

1个回答

21

每次绘制图形时,都会创建新的图形。因此,您可以将所有对 plt.subplots() 的调用除一个外都删除。

seaborn 的 swarmplot()boxplot()接受ax参数,即您可以告诉它要绘制到哪个轴上。因此,使用以下方式创建您的图形、子图和轴:

fig, (ax1, ax2, ax3) = plt.subplots(1, 3)

然后你可以做类似这样的事情:

sns.boxplot(x="x_vals", y="y_vals", data=some_data, ax=ax1)

您可以根据需要对坐标轴进行操作。例如,仅在某些子图上删除y轴标签等。

fig, (ax1, ax2, ax3) = plt.subplots(1,3,figsize=(10,8))

sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='tfidf'], ax=ax1)
sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='tfidf'], color="0.25", ax=ax1)

sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='lda'], ax=ax2)
sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='lda'], color="0.25", ax=ax2)

ax2.set_ylabel("")  # remove y label, but keep ticks

sns.boxplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='doc2vec'], ax=ax3)
sns.swarmplot(x="feedback", y="similarity_score", data=df[df.nlp_model=='doc2vec'], color="0.25", ax=ax3)

ax3.set_ylabel("")  # remove y label, but keep ticks

plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接