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