[[seaborn]]

以前のリビジョンの文書です


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

引数表は一部抜粋(以下同)

引数初期値説明
binsint
List[number]
None柱の幅・数を設定
* 整数値: 柱の数
* 数値List: 各値を柱の区切りとする
* None: フリードマン=ダイアコニスの法則を用いて決定
kdeboolTrueカーネル密度推定(Kernel density estimation)のグラフを重ねて描く
rugboolFalse各データの詳細な位置をグラフ下部に短い線で示す。絨毯みたいだから?
axlabelstringNonex軸のラベル
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.pointplot — seaborn 0.8.1 documentation

折れ線グラフは、seabornではなくmatplotlib純正のplot()を使った方がよい。というかseabornには存在しない。

一応、pointplot()がそれっぽいが、横軸が数値データでなくカテゴリデータとして扱われる。つまり、(x,y)=(1,1)(2,2)(3,3)(5,5)とデータがあった場合、折れ線グラフであれば3と5の間には1つ分のスペースを空けるのが妥当だが、seabornでは等間隔で描かれる。ので、やはり素直にmatplotlibを使いましょう。

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)
programming/python/packages/graph/seaborn.1521119889.txt.gz · 最終更新: 2018/03/15 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0