読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

簡単に美しいグラフ描画ができるPythonライブラリSeaborn入門

Python Programming

目次

PythonライブラリのSeabornとは?

SeabornはPythonのグラフ描画ライブラリとして有名な

matplotlibをベースにしたグラフ描画ライブラリです。

myenigma.hatenablog.com

 

今回は、このPythonのグラフ描画ライブラリSeabornの

基本的な使い方について説明したいと思います。

Seabornのインストール

下記のようにpipでインストールできます。

pip install seaborn

 

下記のライブラリも必要なので、

まだインストールしていない場合は、

インストールしましょう。

pip install numpy

pip install scipy

pip install matplotlib

pip install pandas

Seabornの特徴

Seabornはmatplotlibよりも

美しいライブラリを簡単に描画できるように設計されています。

SeabornのHPには、Seabornの特徴として、下記の特徴を上げています。

  1. matplotlibのデフォルトよりも美しいグラフテーマ群

  2. データのパターンを明らかにする美しいプロットのためのカラー選択ツール

  3. データのサブセット間の分布を可視化するための関数群

  4. 複数種類のデータの線形回帰と可視化ツール群

  5. 時系列データの状態推定と誤差推定の関数

  6. グリット状の複雑なグラフを簡単に描画するシステム

 

下記のSeabornのグラフギャラリーを見るとわかりますが、

色合いがグラフのスタイルが、matplotlibと比べて非常に綺麗であることがわかります。

スタイルの変更方法

Seabornによるグラフのスタイルの変更方法について説明します。

matplotlibのグラフをSeabornのデフォルトスタイルに変更する

下記のようなコードを実行すると、

import numpy as np
import matplotlib.pyplot as plt

flip=1
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

plt.show()

下記のようなmatplotlibのグラフができます。

f:id:meison_amsl:20151007220031p:plain

 

このグラフをSeabornのスタイルにするには、

seabornをimportするだけです。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #importするだけでスタイルがSeabornになる

flip=1
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

plt.show()

f:id:meison_amsl:20151007220415p:plain

 

Seabornのスタイルを変更する

Seabornのスタイルは5つあります。

darkgrid, whitegrid, dark, white, ticksです。

先ほどのグラフはデフォルトのdarkgridです。

デフォルト以外のスタイルにするには、

set_style()関数を使います。

グラフを描画する前にset_style関数を呼ぶだけです。

whitegrid

Seabornのマニュアルによると、

描画のデータ数が多い時におすすめのスタイルです。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style("whitegrid")

x = np.random.normal(size=100)
sns.distplot(x);

plt.show()

f:id:meison_amsl:20151007222040p:plain

dark

こちらはグリッドが要らない場合におすすめのスタイルです。

sns.set_style("dark")

f:id:meison_amsl:20151007222250p:plain

white

こちらもグリッドが要らない場合におすすめのスタイルです。

sns.set_style("white")

f:id:meison_amsl:20151007222436p:plain

ticks

こちらは軸にのみ刻みの線を追加するスタイルです。

sns.set_style("ticks")

f:id:meison_amsl:20151007222446p:plain

右と上のグラフの枠線を無くす

plt.showする前に、

sns.despine() という関数を呼ぶと、

下記のように、右と上のグラフの枠線を無くすことができます。

f:id:meison_amsl:20151008215213p:plain

 

グラフ描画機能

Seabornで重要なグラフ描画機能について説明します。

 

折れ線グラフ

折れ線グラフはpointplot関数を使います。

引数のx,yに縦軸と横軸のデータ、

hueはカテゴリーデータ、

paletteでグラフの色(カテゴリー名と色の辞書データとして与える)

markersとlinestylesでマーカと線種をそれぞれリストで与えることができます。

titanic = sns.load_dataset("titanic")
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"]);

sns.plt.show()

すると、下記のようなグラフが得られます。

f:id:meison_amsl:20151009222944p:plain

 

マーカを無くしたりしたい時は、

markers=[""]のように空で指定すればOKです。

 

棒グラフ

棒グラフはbarplot関数を使います。

横軸と縦軸はxとy変数に、

棒グラフのカテゴリーデータはhueに、

そしてデータセットはdata変数に代入します。

titanic = sns.load_dataset("titanic")
sns.barplot(x="sex", y="survived", hue="class", data=titanic);
sns.plt.show()

するとこのようなグラフが書けます

f:id:meison_amsl:20151009222618p:plain

一次元分布データの描画(ヒストグラムや確率密度関数)

distplotという関数を使うことで

一次元データのグラフを作成することができます。

import numpy as np
import seaborn as sns

x = np.random.normal(size=100)
sns.distplot(x);
sns.plt.show()

f:id:meison_amsl:20151008221348p:plain

デフォルトでヒストグラムとカーネル密度推定による

確率密度関数が表示されます。

 

ヒストグラム表示

kde=Falseとすることで、確率密度関数を非表示にして、

ヒストグラムのみを表示することができます。

sns.distplot(x, kde=False);

 

また、

sns.distplot(x, kde=False, rug=True);

と設定することにより、

データの分布をグラフの下部に表示することができます。

f:id:meison_amsl:20151008222217p:plain

 

加えて、

bins変数を指定することで、ヒストグラムのビンの数を設定することができます。

sns.distplot(x,kde=False, rug=True, bins=5);

f:id:meison_amsl:20151008222902p:plain

 

二次元の分布データの描画

続いて、二次元分布データの描画の説明をします。

散布図のプロット

jointplot関数を使うと、

二次元の変数の散布図と、

各次元のヒストグラムを表示することができます。

import numpy as np
import seaborn as sns
import pandas as pd

mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df);
sns.plt.show()

f:id:meison_amsl:20151008223543p:plain

グラフ内のpeasorという値は、

ピアソンの相関係数、

pはP値です。

相関係数 - Wikipedia

myenigma.hatenablog.com

 

kind="hex"とすることで、六角形プロットを表示することができます。

sns.jointplot(x="x", y="y", kind="hex", data=df);

f:id:meison_amsl:20151008224641p:plain

 

kind="kde"とすることでカーネル密度法による確率密度関数が表示されます。

sns.jointplot(x="x", y="y", kind="kde", data=df);

f:id:meison_amsl:20151008224931p:plain

データセットの相関分析

seabornの素晴らしい機能の一つに、

データセットの各変数同士の相関分析を簡単に実施できる関数があります。

それはpairplot関数です。

import seaborn as sns

iris = sns.load_dataset("iris") #サンプルデータセット
sns.pairplot(iris);
sns.plt.show()

すると、下記のグラフのように簡単に相関分析をすることができます。

f:id:meison_amsl:20151009220322p:plain

 

カテゴリーデータがあれば、

下記のように変数hueにカテゴリー変数名を入れれば、

カテゴリーを色分けしてくれます。

sns.pairplot(iris,hue="species");

f:id:meison_amsl:20151009221249p:plain

 

ヒートマップ

heatmap関数を使うことで、

簡単にヒートマップやグレースケール画像データを

グラフ化することができます。

 

使い方はheadmap関数に二次元のリストを渡すだけです。

import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set()
uniform_data = np.random.rand(100, 100)
ax = sns.heatmap(uniform_data)
sns.plt.axis("off")
sns.plt.show()

f:id:meison_amsl:20151012105330p:plain

 

ヒートマップの最大値と最小値はvmin, vmax変数で指定します。

ax = sns.heatmap(uniform_data, vmin=0, vmax=0.5)

f:id:meison_amsl:20151012110218p:plain

 

グリッドの間に間隔が欲しい場合は、

linewidth引数に値を渡します

ax = sns.heatmap(uniform_data, linewidths=.5)

f:id:meison_amsl:20151012110440p:plain

 

右のカラーバーが要らない場合は、

cbar引数をfalseにすればOKです。

ax = sns.heatmap(uniform_data, cbar=False)

f:id:meison_amsl:20151012110817p:plain

Mac OSXでtight_layoutのエラーが出た時の対処法

グラフ描画時に

下記のようなエラーが出る時は、

/System/Library/Frameworks/Python.framework/Versions/2.7/ Extras/lib/python/matplotlib/tight_layout.py:225: UserWarning: tight_layout : falling back to Agg renderer warnings.warn ("tight_layout : falling back to Agg renderer")

下記のコマンドでmatplotlibを最新バージョンにアップデートしましょう。

pip install matplotlib -U

 

最後に

やはりかっこいいグラフはいいですね。

プレゼンで使いたくなりました。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com