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