こんな人に向けた記事
- pythonでseabornを最近使い始めてboxplot, violinplotなどをやりたい人
- violinplot, boxplotで自分で決めた文字列でラベルを設定したい人
- seabornだとラベルが自動で設定されてしまって困っている人
解決方法
legendのハンドルを設定する以下の2行で簡単に解決!
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["label1", "label2"])
##タイタニックデータを使ったプロット例
データのダウンロード
例としてtitanicのデータを使用します。
titanicのデータセットはいろんなところで説明されています。例えば下記記事など。
参考:「Titanic:タイタニック号乗客者の生存状況(年齢や性別などの13項目)の表形式データセット」
https://www.atmarkit.co.jp/ait/articles/2007/02/news016.html
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set("talk")
df = sns.load_dataset('titanic')
df.head()
出力結果はこんな感じ。
旅客クラスごとの年代分布
ここではpclass(旅客クラス)ごとの年代分布をプロットしてみます。
sns.violinplot(data=df, x='pclass', y='age')
図をみるとpclass3では年代が若い層が多いことがわかります。
更に深堀りして,
「各クラスの年代分布で生死に違いがあったのか」
を見てみたいと思います。
fig,ax=plt.subplots()
sns.violinplot(data=df, x='pclass', y='age',hue="alive",split=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
hueを指定することでviolinplotを2つに分けることができます。
凡例は見やすくするために図の外に配置しています。
ラベルの変更(本題)
ようやく本題です。ここで気になるのは凡例のラベル。
no, yesではあとからみたときなんのことかわからないですよね。
これはdfのalive列の中身no/yesをそのままラベルに指定していることが原因です。
そこで,labelのハンドルをgetして直接指定してあげます。
fig,ax=plt.subplots()
sns.violinplot(data=df, x='pclass', y='age',hue="alive",split=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["dead","alive"],loc='upper left',bbox_to_anchor=(1.05,1))
無事,ラベルがdead/aliveとなりあとから見ても生死に差がないかを判別することができますね。
ちなみに生死で分けることであたらしくわかったこととして
- pclass2,3のとき10代などの若い年代でaliveの割合が高い
- pclass3では30代ではdeadとaliveの割合が同程度だが,pclass2ではdeadの割合が高い
- pclass1は50代以上でdeadの割合が顕著に高くなっている。
など様々なことがわかりますね。
swarmplotの例
もちろんswarmplotでも同じことができます。
fig,ax=plt.subplots()
sns.swarmplot(data=df, x='pclass', y='age',hue="alive",dodge=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["dead","alive"],loc='upper left',bbox_to_anchor=(1.05,1))
まとめ
- seabornでプロットすると列の中身がラベルになる
- ハンドルをgetして直接指定することでラベルを自由に編集できる
参考記事
Python: seaborn を使った可視化を試してみる https://blog.amedama.jp/entry/seaborn-plot