seaborn
seaborn: statistical data visualization — seaborn 0.8.1 documentation
グラフ描画ツール。
PythonでグラフというとまずMatplotlibが有名。けど設定項目が大量で、難しい。
seabornは、少ない設定項目で統計的にわかりやすいグラフがすぐ描ける。また、デフォルト色がパステル系でオシャレという評価が多い。
特徴
seabornも内部ではMatplotlibを使っている。ラップすることで、
- グラフに適した統計値を計算
- 複数の関連するグラフを組み合わせて表示
などを自動でしてくれるため、(統計上、各値が何を示すかの知識さえあれば)簡単にデータ概要を掴みやすくなっている。 Example galleryを見れば、大体できあがるグラフの雰囲気は掴めるだろう。
ただし、エクセルで作れるような“よくある”グラフとは一線を画すため、慣れていない人に見せるにはきちんとした説明が必要と思われる。
matplotlibの上位互換ではない
使いやすくしたとはいえ、やはりグラフは設定項目が多い。ちょっと整形したければ、結局、matplotlibやseabornのAPIを調べなければいけない。 最初からmatplotlibだけで書けばmatplotlibだけの知識で良いが、seabornを使うと両方について調べないといけないので、時間がかかる。その点は一長一短という所。
ヒストグラム
Distribution plot options — seaborn 0.8.1 documentation
引数表は一部抜粋(以下同)
| 引数 | 型 | 初期値 | 説明 |
|---|---|---|---|
| bins | int List[number] | None | 柱の幅・数を設定 * 整数値: 柱の数 * 数値List: 各値を柱の区切りとする * None: フリードマン=ダイアコニスの法則を用いて決定 |
| kde | bool | True | カーネル密度推定(Kernel density estimation)のグラフを重ねて描く |
| rug | bool | False | 各データの詳細な位置をグラフ下部に短い線で示す。絨毯みたいだから? |
| axlabel | string | None | x軸のラベル |
| return | |||
| <class 'matplotlib.axes._subplots.AxesSubplot'> (Document) | |||
import seaborn as sns
d = [] # ←1次元データが入っているものとする
ax = sns.distplot(d, kde=False)
# 描画するx, y軸の範囲を固定
ax.axes.set_xlim(0, 100)
ax.axes.set_ylim(0, 500)
# 画像を保存
ax.get_figure().savefig('graph/path.png')
2軸目を使いつつ、凡例をまとめる
これはどちらかというとmatplotlibのTipsだが、左右で別のy軸を使って2つのグラフをまとめて描画するには、第1軸目を使用するグラフを描いたaxオブジェクトからax.twinx()を使用して第2軸目を使用するaxオブジェクトを生成し、そこに2つめのグラフを描く。
しかしその際、凡例を出すと、一方の凡例しか表示されない。 凡例はax内の要素に紐付くもので、1軸目と2軸目は別々に扱われるからのようだ。axから凡例情報を取得し、結合しないといけない。
[python]matplotlibで左右に2つの軸があるグラフを書く方法 - Qiita
import seaborn as sns
d1 = [] # ←1次元データが入っているものとする
d2 = [] # ←1次元データが入っているものとする
# 最初の軸でグラフを描き、axオブジェクトを取得
ax1 = sns.distplot(d1, kde=False, label='ax1')
# 2軸目を使うためのaxを作成
ax2 = ax1.twinx()
# 2軸目でグラフを描く。'ax'引数で、描画するaxを指定できる
sns.distplot(d2, kde=False, label='ax2', ax=ax2)
# 凡例情報を取得する
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
# 凡例情報を結合し、ax1の凡例として描画する
ax1.legend(h1 + h2, l1 + l2)
# 画像を保存
plt.savefig('graph/path.png')
plt.close()
散布図
seaborn.jointplot — seaborn 0.8.1 documentation
散布図は、JointPlotまたはJointGridを用いる。plotは、gridのラッパーで、より簡素に扱える。細かい部分をいじりたい場合はgridを用いる。
散布図に加え、x軸、y軸それぞれ単体でのヒストグラムも上と右に描画されるため、点が重なってしまっても全体のピークが把握しやすくなっている。
どちらのメソッドを呼んでも、seaborn.axisgrid.JointGrid オブジェクトが返る。
import seaborn as sns
import matplotlib.pyplot as plt
# 元データ
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 1, 4, 1, 5])
fig = sns.jointplot(x, y, stat_func=None)
# x軸, y軸のラベルを指定
fig.set_axis_labels('x-axis', 'y-axis')
# タイトルを指定
plt.title('Title')
# 上記の指定方法ではラベルがはみ出る場合があるので、描画範囲を自動再計算させる
plt.tight_layout()
# 画像を保存
plt.savefig('graph/path.png')
# 連続して描画する際は、pltを閉じる
plt.close()
折れ線
seaborn.tsplot — seaborn 0.8.1 documentation
折れ線グラフは、tsplotで描く。
seaborn.pointplot — seaborn 0.8.1 documentation
一応、pointplot()も折れ線っぽいグラフを描ける。が、横軸が数値データでなくカテゴリデータとして扱われる。つまり、(x,y)=(1,1)(2,2)(3,3)(5,5)とデータがあった場合、折れ線グラフであれば3と5の間には1つ分のスペースを空けるのが妥当だが、seabornでは等間隔で描かれる。
x軸が等間隔であることが保証されていたり、カテゴリデータであるなら、pointplot()は使える。特に、任意の集計値とその信頼区間を描ける点はmatplotlibには無い利点である。
通常、折れ線グラフに与えるデータは1次元(x軸の項目に対応するy軸の値が1対1対応で存在している)。
pointplotでは、1つのx軸の項目に対応する値が複数個あるようなデータを渡すと、任意の集計値(初期設定は平均値)とその信頼区間を描いてくれるので、データの概要を掴みやすい。
x y ↑ |
A [ 5, 10, 15] | |/|
B [10, 20, 30] -> | |/|
C [40, 30, 20] | |
┼────→
A B C
| 引数 | 型 | 初期値 | 説明 |
|---|---|---|---|
| estimator | function | 平均値 | x軸の各項目に対応するベクトルデータを、集計値(折れ線グラフの“●”が描かれるy軸の値)に変換する関数 |
| ci | float “sd” None | 95 | “●”の上下に伸びる線の示す意味 数値: ブートストラップ法で求めた(数値)%信頼区間 'sd': 標準偏差 None: 何も描かない |
| n_boot | int | 1000 | ブートストラップ法の試行回数 |
| dodge | bool | False | hueで重ねて描いたグラフが重ならないように、同じx値でも少しずらして描画する |
| return | |||
| <class 'matplotlib.axes._subplots.AxesSubplot'> (Document) | |||

