如何获得 sns.pairplot 的对角线?

How do I get the diagonal of sns.pairplot?

好吧,我可能太厚了,但我如何才能在一个漂亮的行或 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 或其他东西。

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)

输出:

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

你为什么要这么做。 pairplot 的对角线为您提供了该特征的 distplot。如果您可以将个人 distplots 绘制为子图或 mux 它们,它将更有效 Ex:

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]

在此处阅读更多内容:

以 seaborn 方式执行此操作将使用 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()