11 votes

Seaborn : Changer le style des lignes dans kdeplot

J'utilise seaborn pour créer un kdeplot avec une distribution marginale comme décrit dans cette réponse . J'ai adapté un peu le code pour obtenir ceci :

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]

g = sns.JointGrid(x="sepal_width", y="petal_length", data=iris)
sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds",
        shade=False, shade_lowest=False, ax=g.ax_joint)
sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues",
        shade=False, shade_lowest=False, ax=g.ax_joint)
sns.distplot(setosa.sepal_width, kde=True, hist=False, color="r", ax=g.ax_marg_x)
sns.distplot(virginica.sepal_width, kde=True, hist=False, color="b", ax=g.ax_marg_x)
sns.distplot(setosa.sepal_length, kde=True, hist=False, color="r", ax=g.ax_marg_y, vertical=True)
sns.distplot(virginica.sepal_length, kde=True, hist=False, color="b", ax=g.ax_marg_y, vertical=True)
plt.show()

enter image description here

Il est impossible de l'imprimer en noir et blanc. Comment puis-je faire en sorte que seaborn imprime les lignes kdeplot et distplot d'une manière spécifique (en pointillés / en tirets / ...) afin qu'elles puissent être distinguées lorsqu'elles sont imprimées en noir et blanc ?

En Questions connexes traiter d'autres types de parcelles qui semblent aller dans ce sens, mais cela ne semble pas être le cas pour les autres types de parcelles. kdeplot y distplot .

15voto

ImportanceOfBeingErnest Points 119438

Marginaux

Pour afficher les lignes d'un tracé kde avec un style de ligne différent, vous utilisez l'option linestyle qui est transmis à la fonction plot de matplotlib.

sns.kdeplot(setosa.sepal_width, color="r", ax=g.ax_marg_x, linestyle="--")

Pour fournir cet argument au tracé kde qui est produit via distplot vous pouvez utiliser le kde_kws argument.

sns.distplot(..., kde_kws={"linestyle":"--"})

Cependant, il ne semble pas y avoir de raison d'utiliser un distplot ici.

KDE commun

Dans le cas de la 2D, l'argument du style de ligne n'a pas d'effet. Un kdeplot 2D est un contour parcelle. Vous devez donc utiliser la fonction contour 's linestyles (et non le s ).

sns.kdeplot(, linestyles="--")

Code complet

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]

g = sns.JointGrid(x="sepal_width", y="petal_length", data=iris)

sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds",
        shade=False, shade_lowest=False, ax=g.ax_joint, linestyles="--")
sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues",
        shade=False, shade_lowest=False, ax=g.ax_joint, linestyles=":")

sns.kdeplot(setosa.sepal_width, color="r", legend=False,  
             ax=g.ax_marg_x, linestyle="--")
sns.kdeplot(virginica.sepal_width, color="b", legend=False, 
             ax=g.ax_marg_x, linestyle=":")
sns.kdeplot(setosa.sepal_length, color="r", legend=False, 
             ax=g.ax_marg_y, vertical=True, linestyle="--")
sns.kdeplot(virginica.sepal_length, color="b", legend=False, 
             ax=g.ax_marg_y, vertical=True, linestyle=":")
plt.show()

enter image description here

6voto

Thomas Kühn Points 4894

Tous les mots-clés qui sns.kdeplot ne reconnaissent pas sont transmises à plt.contour() o plt.contourf() . Dans votre cas, il s'agit de contourf Vous pouvez donc passer le mot-clé linestyles (notez le pluriel). sns.distplot possède un mot-clé appelé kde_kws qui accepte un dictionnaire de mots-clés qui sont transmis à plt.plot . Dans ce cas, vous pouvez utiliser ls o linestyle (notez le singulier). Voici un exemple complet :

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]

g = sns.JointGrid(x="sepal_width", y="petal_length", data=iris)
sns.kdeplot(
    setosa.sepal_width, setosa.sepal_length, cmap="Greys",
    shade=False, shade_lowest=False, ax=g.ax_joint,
    linestyles='--'
)
sns.kdeplot(
    virginica.sepal_width, virginica.sepal_length, cmap="Greys",
    shade=False, shade_lowest=False, ax=g.ax_joint,
    linestyles=':'
)
sns.distplot(
    setosa.sepal_width, kde=True, hist=False, color="k",
    kde_kws=dict(ls ='--'), ax=g.ax_marg_x
)
sns.distplot(
    virginica.sepal_width, kde=True, hist=False, color="k",
    kde_kws=dict(ls=':'), ax=g.ax_marg_x
)
sns.distplot(
    setosa.sepal_length, kde=True, hist=False, color="k",
    kde_kws=dict(ls ='--'), ax=g.ax_marg_y, vertical=True
)
sns.distplot(
    virginica.sepal_length, kde=True, hist=False, color="k",
    kde_kws=dict(ls=':'), ax=g.ax_marg_y, vertical=True
)
plt.show()

Le résultat est le suivant :

result of the above code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X