こんにちは。産婦人科医で人工知能の研究に従事しているTommy(Twitter:@obgyntommy)です。
データの可視化はデータ解析する上で、非常に重要です。
機械学習の適用を考える上でも、最初に行うべきこととして、必ずどういったデータなのかを確認する必要があります。
データを綺麗なグラフで表現できることは、データ解析者として必須のスキルです。
この講座でしっかり学習して、身につけていきましょう。
seabornについて学ぶべきことは多く、【前編】【後編】に分けて解説していきます。今回は【前編】となります。
本記事の学習到達目標
- seabornについて理解する
- グラフのスタイルの扱い方を修得する
- グラフの色の設定方法を修得する
- 軸や目盛りの設定方法を修得する
- 凡例の設定方法を修得する
では早速、学習していきましょう。
seabornとは
Pythonでグラフを表示するライブラリといえば、matplotlib を思い浮かべる方も多いかと思います。
しかし、matplotlib よりグラフの見た目を美しく仕上げてくれるのが、seaborn になります。
seaborn はベースに matplotlib を使っているので、今までmatplotlibを使ってきた方も同じような使い方が出来るので、非常に便利です。
以下、seabornを利用した描図の結果になります。
seabornの公式ドキュメントは以下をご覧下さい。
seaborn: statistical data visualization — seaborn 0.13.2 documentation
続きを見る
seabornのインストール方法
インストールは pip
で行いましょう。
ライブラリをインストールする際には、pip
、pip3
のどちらかを使うことになりますが、どちらでもOKです。
普段使っている方で、インストールして下さい。
In[]
1 2 3 4 5 | pip install seaborn 若しくは pip3 install seaborn |
本記事で使用するデータ一覧
本記事では、乱数ではなく、データ解析入門で使われる実データを使います。
実際に、仕事をしている中で実データを解析していくイメージで学習を進めていきましょう。
注意ポイント
seabornではDataFrame型をよく使います。numpyでも使えるグラフもありますが、DataFrameで統一すると良いでしょう。
DataFrameはCSVやデータベースをなどの表データです。
iris
irisデータはアヤメ3種類それぞれのがく片(sepal)、花弁(petal)の幅と長さのデータセットです。
sepal length | 花弁長さ |
sepal width | 花弁幅 |
petal length | がく片長さ |
petal width | がく片幅 |
データの取得の仕方は簡単、sns.load_dataset(“iris”)
で欲しいデータが手に入ります。
データのtype(型)はpandasのDataFrameです。
In[]
1 2 3 4 5 | import seaborn as sns # データの型: pandas.core.frame.DataFrame iris = sns.load_dataset("iris") # データ最初の5行表示 iris.head() |
Out[]
タイタニック
このデータはグラフ表示のところで使用します。
タイタニックのデータはどういった人が生存できたかを予測する問題です。
survived | 0:死亡 1:生存 |
pclass | チケットクラス 1:上級 2:中級 3:初級 |
sex | 性別 |
age | 年齢 |
sibsp | 同乗の兄弟配偶者の数 |
parch | 同乗の親子供の数 |
fare | 料金 |
embarked | 出港地(C=Cherbourg、Q=Queenstown、S=Southampton) |
class | チケットクラス |
who | 男性 / 女性 |
adult_male | 成人男性かどうか |
deck | 乗船していたデッキ |
embark_town | 出港地 |
alive | 生存したかどうか |
alone | 一人であったかどうか |
In[]
1 2 3 | import seaborn as sns taitanic = sns.load_dataset("titanic") taitanic.head() |
Out[]
グラフのスタイル
グラフの見た目を変更していきましょう。
きれいなグラフは見やすく、見る側も気持ちがいいものです。
まず、初期設定の表示をして、そこから違いを見ていきます。
今回使用するグラフは
データ | irisデータのsepal width(x軸) ,sepal length(y軸) |
グラフ | lmplot(散布図と回帰直線) |
凡例 | species(アヤメの種類) |
コード実装してみましょう。下記コードをそのまま実行してください。
lmplotの詳細はこちらを参照ください。グラフの見た目の調整が目的なので、見なくてもOKです。
In[]
1 2 3 4 5 | import seaborn as sns sns.set() iris = sns.load_dataset("iris") # x軸:sepal_width y軸:sepal_length 凡例:species sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
Out[]
如何でしょうか。何も設定していないのに、綺麗なグラフが出てきますね。
簡単にコードの説明をしていきます。
seabornの読み込み
seaborn
のライブラリを sns
として読み込みます。
In[]
1 | import seaborn as sns |
matplotのスタイル変更
ベースで使っている、matplot
のデザインを変更します。
seaborn
ではなく、matplotlib
でグラフを描画してもスタイルが変わります。
In[]
1 | sns.set() |
データ読み込み
今回対象の iris
データを読み込みます。
自分のデータで実行したい時には、ここを置き換えます。
seaborn
では Dataframe 型を主に使うので、読み込む際にも Dataframe 型で読み込みましょう。
In[]
1 | iris = sns.load_dataset("iris") |
lmplot(グラフ)を表示
これからグラフの描画のコードを書きます。lmplot というグラフを描画します。
今回は、$ x=X$ 軸のデータ列名
、$y=Y$ 軸のデータ列名
、hue=凡例
の列名を指定してます。
In[]
1 | sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
グラフのスタイルを見ると、sepal width
と sepal length
に相関がありますね。
又、species
ごとにプロットが分かれるというデータの特徴が見て取れるとおもいます。
グラフのプリセットスタイル
プリセット(用意されている)スタイルは5つあります。
詳しくは、公式ドキュメントのSeaborn figure stylesを参考にして下さい。
種類 | 背景色 | グリッド | 備考 |
darkgrid | 暗め | 有り | 初期設定 |
whitegrid | 白 | 有り | |
dark | 暗め | 無し | |
white | 白 | 無し | |
ticks | 白 | 軸のみ有り |
スタイルの変更ではset_styleを使います。
whitegrid
のコードを紹介して、図は全部の比較したものを紹介します。
お好みのグラフで、試してみましょう。
In[]
1 2 3 4 5 | import seaborn as sns sns.set() sns.set_style("whitegrid") # 追加! iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
Out[]
グラフの大きさ
大きさの設定は4つあります。
詳しくはScaling plot elementsを参考にして下さい。
以下に設定の4種類をまとめました。
種類 | 大きさ | 備考 |
paper | 小さい | |
notebook | 普通 | 初期設定 |
talk | 少し大きい | |
poster | 大きい |
大きさの変更ではset_contextを使います。
paper
のコードを使用して、以下の図は全てを比較したものになります。
In[]
1 2 3 4 5 | import seaborn as sns sns.set() sns.set_context("paper") # 追加! iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
気になるグラフで、試してみましょう。
Out[]
グラフの色の設定
グラフの色の設定を行いましょう。
グラフでは色も重要な要素です。好みかつ、見る側に適切なグラフを描画していきましょう。
seaborn
では簡単にどんな色か見れる機能もあるので、先にそれを確認しましょう。
詳細はcolor palettesを参考にして下さい。
seaborn
の color_palette
メソッドで色の「種類」「数」、「彩度」を指定して、palplot
で表示します。
色の種類はこれから紹介する、matplotlib の colormap
であったり、seaborn の色となります。
In[]
1 2 3 4 5 6 | import seaborn as sns sns.set() # sns.color_palette(色の種類, 色の数, 色の彩度*1以下) current_palette = sns.color_palette("pastel", 10, 1.0) plt = sns.palplot(current_palette) |
彩度は低いほど、暗いイメージになります。以下の図でイメージを掴んでください。
Out[]
matplotlibのcolormap
seaborn は matplotlib をベースしています。そのため、matplot の colormap が使用出来ます。
colormap は非常に多いので、詳しくは下記リンクを参考にして下さい。
Choosing Colormaps — Matplotlib 2.0.2 documentation
続きを見る
本記事では1つだけ紹介しますが、皆さんは色々と試してみてください。
今回試す色は、「Pastel1
」です。
色の変更ではset_paletteを使います。
set_palette
も引数に(色の種類, 色の数, 色の彩度)をとります。
引数をとる際には色の種類のみを指定します。
In[]
1 2 3 4 5 6 7 8 | import seaborn as sns sns.set() # 追加!色の設定 sns.set_palette("Pastel1") iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
Out[]
seabornで色彩を変更する方法
seabornでは6色の色が用意されています。
「muted
」のコードを紹介して、図は全て比較したものを解説していきます。
コードは matplotlib の colormap
と同じで sns.set_palette
を使用します。
In[]
1 2 3 4 5 6 7 8 | import seaborn as sns sns.set() # 追加!色の設定 sns.set_palette("muted") iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
Out[]
hlsによる指定
hlsとは、HLS色空間による色の設定です。
hlsはhls_paletteを使って、以下の指定を行います。
- h:色相
- l:輝度
- s:彩度
In[]
1 2 3 4 5 6 7 8 | import seaborn as sns sns.set() # 追加!hlsの設定。色の数、h:色相、l:輝度、s:彩度を指定 sns.set_palette(sns.hls_palette(3, h=0.6, l=0.3, s=0.8)) iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) |
Out[]
軸、目盛りの設定
次は、グラフの軸や目盛りについての設定をしていきましょう。
ここでは、seaborn の設定ではなく、ベースとなっている matplotlib の設定を行います。
以下の様にimport seaborn as sns
の下に、import matplotlib.pyplot as plt
を追加してください。
In[]
1 2 3 | import seaborn as sns # 追加 import matplotlib.pyplot as plt |
軸範囲を設定する方法
2つ以上のデータを比較するときに、軸の範囲が揃っていないと、パッと比較が出来ず分かりにくいですね。
例えば、以下の図の様に、同じようなデータを違う軸範囲で表示するとします。
右の図の方が、データにまとまりがあるな!っと思いつつ、よーく見ると、レンジが違う!ってなります。
これではグラフを見る側の人には優しくないので、軸範囲を揃えてあげる必要があります。
では早速、軸範囲を設定しましょう。
軸範囲は matplotlib.pyplot
の xlim
(開始, 終了) , ylim
(開始, 終了)を設定するだけです。
- X軸:
xlim
(開始, 終了) - Y軸:
ylim
(開始, 終了)
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) # 軸の範囲指定 # X軸:xlim(開始, 終了) Y軸:ylim(開始, 終了) plt.xlim(0, 10) plt.ylim(0, 10) # グラフ表示 plt.show() |
Out[]
目盛りの間隔
グラフの目盛りの軸の範囲と同じく、目盛りの間隔も適切に設定されていないとデータを正しく見ることができません。
適切な目盛り間隔を設定できるようにしていきましょう。
目盛りの間隔では、matplotlib.pyplot
の axes
を使います。
matplotlib
の公式ドキュメントも一緒に参考にしつつ、matplotlib.pyplot
の figure
と axes
を見ていきます。
matplotlib.pyplot
の plt
では figure
と axes
という考えがあります。
複数グラフを並べて表示するときに出てきますが、今回は axes
を使うということを覚えておいてください。
figure
(図全体)と axes
(グラフ)の違いについては以下の図で把握する様にしましょう。
もう一つ、matplotlib.ticker
という目盛りを調整するライブラリを使っていきます。
実際に動かしてみましょう。
$y$ 軸の目盛りの間隔を 0.2
にしています。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import seaborn as sns import matplotlib.pyplot as plt # 目盛り調整のticker追加 import matplotlib.ticker as ticker sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) # axesを取得 ax = plt.gca() # y軸(yaxis)に対して、0.2ごと目盛りを入れる ax.yaxis.set_major_locator(ticker.MultipleLocator(0.2)) # グラフ表示 plt.show() |
Out[]
詳しくみていきましょう。
まず、axes
を plt.gca()
で取得します。
In[]
1 | ax = plt.gca() |
そうすると、グラフの軸の xaxis
, yaxis
を設定出来るようになります。
$y$ 軸の yaxis
の set_major_locator()
メソッドと ticker.MultipleLocator
を使って目盛り 0.2
ずつと指定します。
In[]
1 | ax.yaxis.set_major_locator(ticker.MultipleLocator(0.2)) |
対数の表示方法
データの通信量やウィルスの感染人数などデータの増加大きいものは対数で表すことがあります。
方法は簡単で plt.yscale(‘log’)
と追加するだけOKです。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) # y軸を対数表示 plt.yscale('log') # グラフ表示 plt.show() |
Out[]
あまり変わっていませんね。
気づかれた方もいるかもしれませんが、今回のirisデータでは対数表示は適していないという事が分かりました。
対数表示が適しているのは増加が激しいものですが、irisは増加が著しいものではないのであまり変わらなかったのです。
軸の非表示
seaborn では軸の表示非表示を設定するができます。
despine
というメソッドを使って、引数に top
, right
, left
, bottom
をTrueかFalseにすることで表示非表示を切り替えます。
despine
実行時の初期値は、top
, right
が False で非表示なっています。
seaborn
のスタイルの「ticks
」では右上の軸が非表示なっているので、左の軸を非表示にしてみます。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import seaborn as sns import matplotlib.pyplot as plt sns.set() #スタイルをticksやwhiteにする sns.set_style('ticks') iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) # 初期は上(top)と右(right)がTrueになって消える設定 # sns.despine() # 左(left)、下(bottom)も指定可能 sns.despine(left=True, bottom=False) |
Out[]
軸のラベルの向きの調整方法
カテゴリ変数や日付等を軸にしていると、軸のラベルの向きを回転した方が見やすい場合があります。
ラベルの回転は、plt.xticks
で rotation
に回転角度を指定するだけです。
In[]
1 2 3 4 5 6 7 8 9 10 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris) # ラベルの回転 plt.xticks(rotation=90) |
Out[]
凡例の表示方法
凡例とはカテゴリなどを表す、図の右等に位置しているもののことです。
エクセルのグラフの凡例と同じです。以下の図でも右側にあるのが凡例です。
凡例は「表示したいカテゴリが多くあれば、下にまとめて横長に表示する」など、データによって適切に配置する必要があります。
凡例をうまく表現できるように、表示方法を学習しましょう。
凡例の表示/非表示
seabornでは初期設定で凡例が表示されているので、非表示にしてみましょう。
lmplot
など、グラフの表示メソッドの引数に legend=False
を追加するだけで凡例を非表示にする事ができます。
In[]
1 2 3 4 5 6 7 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris, legend=False) |
Out[]
非表示になりましたね。
しかし凡例が非表示になると、データがなんなのか全然わかりませんね。
seaborn の凡例は位置調整できないので、次の項では seaborn の凡例を非表示にした上で、matplolib の方の凡例を調整していきましょう。
凡例の位置
matplot の凡例を表示して、位置を指定していきます。
グラフの位置の調整方法
matplotの凡例は axes のlegendメソッドを使います。
配置は全てで11種類あります。
Location String | Location Code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
‘center right’ | 7 |
‘lower center’ | 8 |
‘upper center’ | 9 |
‘center’ | 10 |
まず、Location Stringのうち「best
」を試してみましょう。legend
メソッドに loc=”best”
を渡します。
LocationCode の0を使って、loc=0
でもOKです。
「best
」は LocationCode 1-10 の中で一番良さそうな場所を選んでくれます。
In[]
1 2 3 4 5 6 7 8 9 10 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris, legend=False) ax = plt.gca() ax.legend(loc='best') |
lower right(右下)に配置されました。
Out[]
グラフの位置をより細かく調整する方法
凡例をグラフ枠外に出したり、より細かい調整は、bbox_to_anchor
を引数に追加します。
いくつか引数で使うパラメータがあるので紹介します。
引数 | 説明 |
bbox_to_anchor | 凡例の位置、幅高さ。0-1のfloat値 bbox_to_anchor(x, y, width, height) bbox_to_anchor(x, y) で指定可能 |
ncol | 凡例の列数 |
mode | “expand”とすることで、bbox_to_anchor指定した幅まで広げる |
loc | 指定したlocationは調整する凡例の位置を示す |
例えば、以下の様に調整してみましょう。
- グラフの左下を
(0.0, 0.0)
から右上を(1.0, 1.0)
の位置を示す。 loc
は凡例のどこを合わせるかを指定する。”upper left”
であれば、凡例の左上に合わせる事が出来る。
In[]
1 | ax.legend(loc="upper left", bbox_to_anchor=(0.5, 0.5)) |
この様にすると、凡例の左上をグラフ上の 0.5, 0.5 の位置に合わせることが出来ます。
Out[]
実際に凡例を上に、かつ横長に表示してみましょう。
仕様は以下です。
loc=”lower left”
で凡例の左下を合わせる位置にするbbox_to_anchor=(0., 1., 1.0, 0.05)
で位置は左上(0.0, 1.0)サイズは(1.0, 0.05)mode=”expand”
でbbox_to_anchor
の指定幅まで広げるncol=3
で凡例の列数を3列にする
In[]
1 2 3 4 5 6 7 8 9 10 11 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris, legend=False) ax = plt.gca() # 凡例の左下(lower left)に位置は左上(0.0, 1.0)サイズは(1.0, 0.05)で 凡例の列数を3 ax.legend(loc="lower left", bbox_to_anchor=(0., 1., 1.0, 0.05), mode="expand", ncol=3) |
Out[]
凡例のスタイル
凡例のスタイルもいくつか変更できるので紹介します。
詳細はlegendのドキュメントを参考にして下さい。理解が深まります。
引数 | 説明 | 備考 |
title | 凡例のタイトルを表示 | |
title_fontsize | 凡例のタイトルのフォントサイズ | |
markerscale | 凡例のマーカーの大きさ | 1,2,3などの数値 |
markerfirst | マーカーをラベルの前にするか | True/Falseで指定 |
frameon | 凡例の枠を表示するかどうか | True/Falseで指定 |
fancybox | 凡例の枠の丸みをつけるかどうか | True/Falseで指定 |
shadow | 凡例に影とつけるかどうか | True/Falseで指定 |
framealpha | 凡例の背景の透過具合 | 0-1の値 |
facecolor | 凡例の背景の色 | ‘red’,’blue’など |
edgecolor | 凡例の枠の色 | ‘red’,’blue’など |
基本的な使い方は axes の legend メソッドの引数に与えるだけです。
いろいろ組み合わせて試してみましょう。
サンプルとして、1つコードを実行してみましょう。
上の表のパラメータを色々組み合わせてみます。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import seaborn as sns import matplotlib.pyplot as plt sns.set() iris = sns.load_dataset("iris") sns.lmplot(x='sepal_width', y='sepal_length', hue="species", data=iris, legend=False) ax = plt.gca() ax.legend(loc="best", title="species", frameon=True, fancybox=True, shadow=True, edgecolor="green") |
Out[]
今回は以上となります。お疲れ様でした。
また、seabornについての後半の記事は以下になります。本記事が終わった方は続けて学習しましょう。
PythonのライブラリSeabornの使い方【後編】
続きを見る