web-dev-qa-db-fra.com

Ajouter la légende au complot Seaborn

Je suis en train de tracer plusieurs images sous forme de point en utilisant seaborn. De plus, je trace toutes les images sur le même axe .

Comment puis-je ajouter une légende à l'intrigue?

Mon code prend chacune des données et les trace l'une après l'autre sur la même figure.

Chaque dataframe a les mêmes colonnes

date        count
2017-01-01  35
2017-01-02  43
2017-01-03  12
2017-01-04  27 

Mon code:

f, ax = plt.subplots(1, 1, figsize=figsize)
x_col='date'
y_col = 'count'
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_1,color='blue')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_2,color='green')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df_3,color='red')

Ceci trace 3 lignes sur la même parcelle. Cependant, la légende est manquante. La documentation n'accepte pas l'argument label.

Une solution de contournement qui a fonctionné a été la création d’un nouveau cadre de données et l’utilisation de hue argument.

df_1['region'] = 'A'
df_2['region'] = 'B'
df_3['region'] = 'C'
df = pd.concat([df_1,df_2,df_3])
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df,hue='region')

Mais j'aimerais savoir s'il existe un moyen de créer une légende pour le code qui ajoute d'abord un tracé séquentiel à la figure, puis d'ajouter une légende.

Exemple de sortie:

Seaborn Image

19
Spandan Brahmbhatt

Je suggérerais de ne pas utiliser seaborn pointplot pour le traçage. Cela rend les choses inutilement compliquées.
Utilisez plutôt matplotlib plot_date. Cela permet de définir des étiquettes pour les tracés et de les insérer automatiquement dans une légende avec ax.legend().

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

date = pd.date_range("2017-03", freq="M", periods=15)
count = np.random.Rand(15,4)
df1 = pd.DataFrame({"date":date, "count" : count[:,0]})
df2 = pd.DataFrame({"date":date, "count" : count[:,1]+0.7})
df3 = pd.DataFrame({"date":date, "count" : count[:,2]+2})

f, ax = plt.subplots(1, 1)
x_col='date'
y_col = 'count'

ax.plot_date(df1.date, df1["count"], color="blue", label="A", linestyle="-")
ax.plot_date(df2.date, df2["count"], color="red", label="B", linestyle="-")
ax.plot_date(df3.date, df3["count"], color="green", label="C", linestyle="-")

ax.legend()

plt.gcf().autofmt_xdate()
plt.show()

enter image description here


sns.pointplot(ax=ax,x=x_col,y=y_col,data=df1,color='blue')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df2,color='green')
sns.pointplot(ax=ax,x=x_col,y=y_col,data=df3,color='red')

ax.legend(handles=ax.lines[::len(df1)+1], labels=["A","B","C"])

ax.set_xticklabels([t.get_text().split("T")[0] for t in ax.get_xticklabels()])
plt.gcf().autofmt_xdate()

plt.show()
24

Vieille question, mais il y a un moyen plus facile.

sns.pointplot(x=x_col,y=y_col,data=df_1,color='blue')
sns.pointplot(x=x_col,y=y_col,data=df_2,color='green')
sns.pointplot(x=x_col,y=y_col,data=df_3,color='red')
plt.legend(labels=['legendEntry1', 'legendEntry2', 'legendEntry3'])

Cela vous permet d'ajouter les parcelles de manière séquentielle, sans avoir à vous soucier de la merde matplotlib en dehors de la définition des éléments de légende.

3
Adam B