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.
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 à:
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()
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))