如何使用seaborn连续绘制多个图形

PyR*_*red 7 python data-visualization matplotlib seaborn

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

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

我想对similairty_score列中的每个唯一值使用 seaborn 以箱线图形式绘制与反馈的关系modeltfidf, lda, doc2vec。我的代码如下:

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()
Run Code Online (Sandbox Code Playgroud)

问题是这会创建 3 个图,一个在另一个之上。

在此处输入图片说明

如何生成这些相同的图但都在一条线上,一个轴仅在最左侧的图上标记“相似度得分”,而每个图正下方的“反馈”轴标签?

Dav*_*idG 14

每次绘制时,您都在创建新图形。所以你可以删除除了一个调用之外的所有调用plt.subplots()

seabornswarmplot()boxplot()acceptax参数,即您可以告诉它要绘制到哪些轴。因此,使用以下方法创建图形、子图和轴:

fig, (ax1, ax2, ax3) = plt.subplots(1, 3)
Run Code Online (Sandbox Code Playgroud)

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

sns.boxplot(x="x_vals", y="y_vals", data=some_data, ax=ax1)
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要操作轴。例如,仅在某些子图上删除 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()
Run Code Online (Sandbox Code Playgroud)