【问题标题】:How do I get the diagonal of sns.pairplot?如何获得 sns.pairplot 的对角线?
【发布时间】:2020-03-31 09:38:56
【问题描述】:

好的,我可能很厚,但是我如何才能在一个漂亮的行或 2x2 网格中获得对角线(左上角到右下角)的图形:

import seaborn as sns; sns.set(style="ticks", color_codes=True)
iris = sns.load_dataset("iris")
g = sns.pairplot(iris, hue="species", palette="husl")

澄清:我只想要这些图表,我不在乎是否使用pairplot或其他东西。

【问题讨论】:

    标签: python seaborn visualization


    【解决方案1】:

    以海运方式执行此操作将使用FacetGrid。为此,我们需要将宽格式输入转换为长格式数据帧,这样每个观察都是单行。这是通过pandas.melt 完成的。

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    iris = sns.load_dataset("iris")
    df = pd.melt(iris, iris.columns[-1], iris.columns[:-1])
    
    g = sns.FacetGrid(df, col="variable", hue="species", col_wrap=2)
    g.map(sns.kdeplot, "value", shade=True)
    
    plt.show()
    

    【讨论】:

    • 如果将 sharex=False, sharey=False 添加到 FacetGrid 命令,您的绘图会看起来更好。
    • @KRKirov 谢谢,但是共享坐标轴使这些图在数量上具有可比性。所以这是故意的。
    • 如果这是目的就足够了。不过,情节中有大量未使用的空间。
    • 你不是为了赢得艺术比赛而制作情节,而是为了轻松识别数据中的关系。
    • 让我们不要进入关于情节以及它们应该如何构建的哲学辩论。
    【解决方案2】:

    你为什么还要这样做。配对图的对角线为您提供了该特征的分布图。如果您可以将单独的分布图绘制为子图或将它们混合,这将更有效例如:

    import numpy as np
    import pandas as pd
    from sklearn.datasets import load_iris
    import seaborn as sns
    
    iris = load_iris()
    iris = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
                        columns=iris['feature_names'] + ['target'])
    
    # Sort the dataframe by target
    target_0 = iris.loc[iris['target'] == 0]
    target_1 = iris.loc[iris['target'] == 1]
    target_2 = iris.loc[iris['target'] == 2]
    
    sns.distplot(target_0[['sepal length (cm)']], hist=False, rug=True)
    sns.distplot(target_1[['sepal length (cm)']], hist=False, rug=True)
    sns.distplot(target_2[['sepal length (cm)']], hist=False, rug=True)
    
    sns.plt.show()
    

    输出会有点像这样: [1]

    在这里阅读更多:python: distplot with multiple distributions

    【讨论】:

    • 我想要一个网格。但这也很有用。谢谢+1。
    • 很高兴我能帮上忙。
    【解决方案3】:
    import seaborn as sns
    import matplotlib.pyplot as plt
    sns.set(style="ticks", color_codes=True)
    iris = sns.load_dataset("iris")
    
    def hide_current_axis(*args, **kwds):
        plt.gca().set_visible(False)
    
    g = sns.pairplot(iris, hue="species", palette="husl")
    g.map_upper(hide_current_axis)
    g.map_lower(hide_current_axis)
    

    输出:

    【讨论】:

    • 谢谢,但有没有办法将其输出为一行或 2x2 网格?
    【解决方案4】:
    plt.subplots(2, 2)
    for i, col in enumerate(iris.columns[:4]):
        plt.subplot(2, 2, i+1)
        sns.kdeplot(iris.loc[iris['species'] == 'setosa', col], shade=True, label='setosa')
        sns.kdeplot(iris.loc[iris['species'] == 'versicolor', col], shade=True, label='versicolor')
        sns.kdeplot(iris.loc[iris['species'] == 'virginica', col], shade=True, label='virginica')
        plt.xlabel('cm')
        plt.title(col)
        if i == 1:
            plt.legend(loc='upper right')
        else:
            plt.legend().remove()
    
    plt.subplot_tool() # Opens a widget which allows adjusting plot aesthetics
    

    【讨论】:

    • 啊,在接受另一个答案之前,我没有看到这个答案。看起来不错,虽然有点复杂。谢谢。
    猜你喜欢
    • 2018-06-20
    • 2015-08-18
    • 1970-01-01
    • 2018-10-20
    • 2021-08-04
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多