web-dev-qa-db-fra.com

Tracer des marqueurs de point et des lignes dans des teintes différentes mais le même style avec Seaborn

Étant donné le bloc de données ci-dessous:

import pandas as pd
df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

J'aimerais utiliser la couleur et uniquement la couleur pour distinguer logic dans un tracé de ligne et marquer des points sur values. Plus précisément, c'est ma sortie souhaitée (tracée par R ggplot2 ):

ggplot(aes(x = n_index, y = value, color = logic), data = df) + geom_line() + geom_point()

desired output

J'ai essayé de faire la même chose avec seaborn.lineplot , et j'ai spécifié markers=True mais il n'y avait pas de marqueur:

import seaborn as sns
sns.set()
sns.lineplot(x="n_index", y="value", hue="logic", markers=True, data=df)

sns no markers

J'ai ensuite essayé d'ajouter style="logic" dans le code, maintenant les marqueurs sont apparus:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=True, data=df)

sns with markers 1

J'ai aussi essayé de forcer les marqueurs à être dans le même style:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=["o", "o"], data=df)

sns with markers 2

Il semble que je dois spécifier style avant de pouvoir avoir des marqueurs. Cependant, cela provoque une sortie de tracé indésirable car je ne veux pas utiliser deux dimensions esthétiques sur une dimension de données. Cela viole les principes de la cartographie esthétique.

Est-il possible que les lignes et les points soient tous dans le même style mais dans des couleurs différentes avec seaborn ou Python? (seaborn est préférable - Je n'aime pas la façon de boucler de matplotlib.)

8
ytu

Vous pouvez directement utiliser pandas pour le traçage.

pandas via groupby

fig, ax = plt.subplots()
df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax)
ax.legend(["False","True"])

enter image description here

L'inconvénient serait que la légende doit être créée manuellement.

pandas via pivot

df.pivot_table("value", "n_index", "logic").plot(marker="o")

enter image description here

tracé de ligne marin

Pour le tracé de ligne né en mer, il semble qu'un seul marqueur soit suffisant pour obtenir le résultat souhaité.

sns.lineplot(x="n_index", y="value", hue="logic", data=df, marker="o")

enter image description here

3

Vous devez définir le paramètre dashes sur False spécifier également le style de la grille sur "darkgrid":

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

sns.set_style("darkgrid")
sns.lineplot(x="n_index", dashes=False, y="value", hue="logic", style="logic", markers=["o", "o"], data=df)
plt.show()

enter image description here

1
Daniel Mesejo