jointplot - plot histogram python
python: distplot con distribuciones mĂșltiples (2)
Lo importante es ordenar la trama de datos por valores donde el target
es 0
, 1
o 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 salida se ve como:
Si no sabe cuántos valores puede tener el target
, busque los valores únicos en la columna de target
, luego divida la trama de datos y añádala a la gráfica de manera apropiada.
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()
Estoy utilizando el transporte marítimo para trazar una parcela de distribución. Me gustaría trazar múltiples distribuciones en la misma parcela en diferentes colores:
Así es como empiezo el diagrama de distribución:
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 columna ''target'' contiene 3 valores: 0,1,2.
Me gustaría ver un gráfico de distribución para la longitud del sépalo donde target == 0, target == 1, y target == 2 para un total de 3 gráficos.
¿Alguien sabe cómo hago eso?
Gracias.
Un enfoque más común para este tipo de problemas es refundir sus datos en un formato largo usando Melt, y luego dejar que el mapa haga el resto.
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
Ahora puedes trazar simplemente creando un FacetGrid y usando el mapa:
g = sns.FacetGrid(df, col=''cols'', hue="target", palette="Set1")
g = (g.map(sns.distplot, "vals", hist=False, rug=True))