1. ホーム
  2. python

[解決済み] Seaborn点描画に凡例を追加

2022-02-18 11:49:50

質問

を使って複数のデータフレームを点描画する。 seaborn . また、私はすべてのデータフレームをプロットしています。 同じ軸に .

プロットに凡例を追加するにはどうしたらいいですか?

私のコードは、各データフレームを取り込んで、同じ図に次々とプロットします。

各データフレームは同じ列を持つ

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

私のコード:

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')

これは同じプロット上に3本の線を描きます。しかし、凡例がありません。 ドキュメント を受け付けません。 label 引数で指定します。

回避策として、新規にデータフレームを作成して 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')

しかし、まず図に順次ポイントプロットを追加し、次に凡例を追加するコードのために凡例を作成する方法があれば知りたいのです。

出力例 :

解決方法は?

シーボーンを使用しないことをお勧めします pointplot をプロットすることができます。これは不必要に物事を複雑にしてしまいます。
代わりに matplotlib を使用します。 plot_date . これにより、プロットにラベルを設定し、それらを自動的に以下のように凡例に入れることができます。 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()