0

我有两个 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()

有人可以帮忙吗?

4

1 回答 1

2

FacetGridcol=是一种图形级函数,根据其和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()

matplotlib 子图上的散点图

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

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

相同的组合数据帧也可以用于例如lmplot

sns.lmplot(data=finalDf_total, x='PC1', y='PC2', hue='L', height=6, col='origin')
于 2021-04-02T11:33:55.727 回答