在一个图中绘制两个子图

时间:2021-04-02 09:08:23

标签: python matplotlib seaborn

我有两个 PCA 图:一个用于训练数据和测试测试。使用 seaborn,我想将这两者结合起来,并像子图一样绘制。

sns.FacetGrid(finalDf_test, hue="L", height=6).map(plt.scatter, 'PC1_test', 'PC2_test').add_legend()
sns.FacetGrid(finalDf_train, hue="L", height=6).map(plt.scatter, 'PC1_train', 'PC2_train').add_legend()

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

FacetGrid 是一种图形级函数,它根据其 col=row= 参数创建一个或多个子图。在这种情况下,只创建了一个子图。

由于 FacetGrid 仅适用于一个数据帧,您可以连接数据帧,引入一个新列来区分测试和训练。此外,两个数据帧的“PC1”和“PC2”列应该具有相同的名称。

更简单的方法是使用 matplotlib 创建图形,然后为每个子图调用 sns.scatterplot(...., ax=...)。 它看起来像:

from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

# create some dummy data
l = np.random.randint(0,2,500)
p1 = np.random.rand(500)*10
p2 = p1 + np.random.randn(500) + l
finalDf_test = pd.DataFrame({'PC1_test': p1[:100], 'PC2_test': p2[:100], 'L':l[:100] })
finalDf_train = pd.DataFrame({'PC1_train': p1[100:], 'PC2_train': p2[100:], 'L':l[100:] })

sns.set()
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 6), sharex=True, sharey=True)
sns.scatterplot(data=finalDf_test, x='PC1_test', y='PC2_test', hue='L', ax=ax1)
sns.scatterplot(data=finalDf_train, x='PC1_train', y='PC2_train', hue='L', ax=ax2)
plt.show()

scatterplots on matplotlib subplots

连接数据帧可能如下所示:

sns.set()
finalDf_total = pd.concat({'test': finalDf_test.rename(columns={'PC1_test': 'PC1', 'PC2_test': 'PC2' }),
                          'train':finalDf_train.rename(columns={'PC1_train': 'PC1', 'PC2_train': 'PC2' })})
finalDf_total.index.rename(['origin', None], inplace=True) # rename the first index column to "origin"
finalDf_total.reset_index(level=0, inplace=True) # convert the first index to a regular column
sns.FacetGrid(finalDf_total, hue='L', height=6, col='origin').map(plt.scatter, 'PC1', 'PC2').add_legend()
plt.show()

facetgrid with combined dataframes

同样的组合数据框也可以用在 lmplot 中:

sns.lmplot(data=finalDf_total, x='PC1', y='PC2', hue='L', height=6, col='origin')