8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonのSeabornでlegendのラベルを自由に変更する

Posted at

こんな人に向けた記事

  • 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()

出力結果はこんな感じ。

WS000147.JPG

旅客クラスごとの年代分布

ここではpclass(旅客クラス)ごとの年代分布をプロットしてみます。

sns.violinplot(data=df, x='pclass', y='age')

ダウンロード (3).png

図をみると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))

ダウンロード.png

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

ダウンロード (1).png

無事,ラベルが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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?