web-dev-qa-db-fra.com

python: distplot avec plusieurs distributions

J'utilise seaborn pour tracer une parcelle de distribution. Je voudrais tracer plusieurs distributions sur la même parcelle avec des couleurs différentes:

Voici comment je commence le diagramme de distribution:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],columns= iris['feature_names'] + ['target'])

sns.distplot(iris[['sepal length (cm)']], hist=False, rug=True);

La colonne 'cible' contient 3 valeurs: 0,1,2.

Je voudrais voir un tracé de distribution pour la longueur des sépales où cible == 0, cible == 1 et cible == 2 pour un total de 3 tracés.

Est-ce que quelqu'un sait comment je fais ça?

Je vous remercie.

29
Trexion Kameha

L'important est de trier le cadre de données par valeurs où target est 0, 1, ou 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()

La sortie ressemble à:

enter image description here

Si vous ne savez pas combien de valeurs target peuvent avoir, recherchez les valeurs uniques dans la colonne target, découpez le cadre de données en tranches et ajoutez-les au tracé de manière appropriée.

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'])

unique_vals = iris['target'].unique()  # [0, 1, 2]

# Sort the dataframe by target
# Use a list comprehension to create list of sliced dataframes
targets = [iris.loc[iris['target'] == val] for val in unique_vals]

# Iterate through list and plot the sliced dataframe
for target in targets:
    sns.distplot(target[['sepal length (cm)']], hist=False, rug=True)

sns.plt.show()
31
Arda Arslan

Une approche plus courante pour ce type de problèmes consiste à reformater vos données en format long à l'aide de la fusion, puis à laisser la carte faire le reste.

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'])

# recast into long format 
df = iris.melt(['target'], var_name='cols',  value_name='vals')

df.head()

   target               cols  vals
0     0.0  sepal length (cm)   5.1
1     0.0  sepal length (cm)   4.9
2     0.0  sepal length (cm)   4.7
3     0.0  sepal length (cm)   4.6
4     0.0  sepal length (cm)   5.0

Vous pouvez maintenant tracer simplement en créant un FacetGrid et en utilisant map:

g = sns.FacetGrid(df, col='cols', hue="target", palette="Set1")
g = (g.map(sns.distplot, "vals", hist=False, rug=True))

enter image description here

23
Abbas