【问题标题】:Plotting two subplots in one figure在一个图中绘制两个子图
【发布时间】:2021-04-02 21:59:13
【问题描述】:

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

有人可以帮忙吗?

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    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()
    

    连接数据帧如下所示:

    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()
    

    同样的组合数据框也可以用于例如lmplot

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

    【讨论】:

    • 我收到“ValueError: zero-size array to reduction operation minimum which has no identity” 下面是我执行的代码,但它的抛出错误。 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 ()
    • 您运行的是最新的 seaborn (0.11.1) 和 pandas (1.2.3) 版本吗?您的旧代码是否适用于这些相同的数据帧?我的代码和我的测试数据可以在你的电脑上运行吗?你能edit你的问题并添加完整的错误跟踪(作为文本)吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多