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

时间:2019-12-06 11:36:07

标签: python seaborn visualization

好吧,我可能正在变厚,但是如何在对角线(从左上到右下)中的图表中得到漂亮的行或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还是其他图形。

4 个答案:

答案 0 :(得分:1)

您为什么还要这么做。成对图的对角线为您提供了该特征的分布图。如果您可以将单个可分配的散点图绘制为子图或将其混合,例如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()

输出将如下所示: Distplot [1]

在此处了解更多信息:python: distplot with multiple distributions

答案 1 :(得分: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()

enter image description here

答案 2 :(得分:0)

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)

输出:

Pairplot Diagonal

答案 3 :(得分:0)

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

enter image description here