【Seaborn】手軽に美しく色々なグラフを描画する方法

Python

【はじめに】

Seabornとは、Pythonの可視化ライブラリの一つです。 Matplotlibの機能をより美しく、より簡単に実現するための可視化ライブラリとして人気です。

今回は、Seabornでさまざまなグラフを描画する方法を紹介していきます。

本記事の内容

  • MatplotlibとSeabornをインポート
  • 使用するデータを読み込む
  • 箱ひげ図を作成する | boxplot
  • ヒストグラムを作成する | distplot
  • 散布図を作成する | scatterplot
  • 散布図行列を作成する | pairplot
  • ヒートマップを作成する | headmap

【MatplotlibとSeabornをインポート】

matplotlibの中のpyplotを読み込みます。
また、Jupyter Notebook内にグラフを出力させるために%matplotlib inlineを記述します。
日本語に対応できるようにjapanize_matplotlibも読み込みます。

続いてSeabornをインポートします。

import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
import seaborn as sns

ポイント

seabornsnsという名前でインポートすることが多いです。

【使用するデータを読み込む】

Pythonライブラリである「Pandas」をインポートしてcsvファイルをDataFrameとして読み込みます。

使用するデータは、
seabornのライブラリの中から、サンプルのデータセットをダウンロードできます。

  • iris(アヤメのサンプルデータ)
  • flight(飛行機の乗客数)

二つを使用してきます。

import pandas as pd
iris = sns.load_dataset('iris')
iris.head()
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2setosa
14.931.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
453.61.40.2setosa

それぞれのカラムは次の情報を表しています。

  • sepal_length : ガクの長さ
  • sepal_width : ガクの幅
  • petal_length : 花弁の長さ
  • petal_width : 花弁の幅
  • species : アヤメの種類
flights = sns.load_dataset('flights')
flights.head()
yearmonthpassengers
01949Jan112
11949Feb118
21949Mar132
31949Apr129
41949May121

それぞれのカラムは次の情報を表しています。

  • year : 年
  • month : 月
  • passengers : 乗客数

【箱ひげ図を作成する | boxplot】

figureオブジェクトとaxesオブジェクトを作成することで、グラフを描画するスペースの大きさ(幅、高さ)とその中にいくつのグラフを作成するかを指定することが出来ます。

# figureオブジェクトとaxesオブジェクトの作成
fig, ax = plt.subplots(2, 3, figsize=(15,10), sharey=True)

Image from Gyazo

ポイント

  • plt.subplots()の引数に行と列を指定します。(今回は2行×3列で6つのグラフを作成するようにしています。)
  • 次に引数figsizeに幅と高さを指定します。
  • 引数shareyTrueを指定するとy軸のメモリを共有します。
  • x軸のメモリを共有する場合は、sharexを使用します。
# figureオブジェクトとaxesオブジェクトの作成
fig, ax = plt.subplots(2, 3, figsize=(15,10), sharey=True)

# グラフの作成
sns.boxplot(x="species", y="sepal_length", data=iris, ax=ax[0,0])
sns.stripplot(x="species", y="sepal_length", data=iris, ax=ax[0,1])
sns.violinplot(x="species", y="sepal_length", data=iris, ax=ax[0,2])
sns.boxenplot(x="species", y="sepal_length", data=iris, ax=ax[1,0])
sns.swarmplot(x="species", y="sepal_length", data=iris, ax=ax[1,1])
sns.violinplot(x="species", y="sepal_length", data=iris, ax=ax[1,2], color='whitesmoke', linewidth=0.3)
sns.swarmplot(x="species", y="sepal_length", data=iris, ax=ax[1,2], size=3)

# タイトルの追加
ax[0,0].set_title("boxplot")
ax[0,1].set_title("stripplot")
ax[0,2].set_title("violinplot")
ax[1,0].set_title("boxenplot")
ax[1,1].set_title("swarmplot")
ax[1,2].set_title("violinplot & swarmplot")

# グラフの表示
plt.show()

Image from Gyazo

  • sns.boxplot()の引数xにアヤメの種類、yにガクの長さを指定してみます。
  • 引数dataには元のデータを指定します。
  • 引数axには何行目、何列目にグラフを配置するかを指定します。角括弧[]で囲み、[0,0]から始まります。

箱ひげ図にもさまざまな種類があるため、目的に応じて使い分ける必要があります。

個人的にはboxplotが使えれば問題ないと思います。

【ヒストグラムを作成する | distplot】

y軸に連続変数として、ガクの幅を指定してみます。

sepal_width = iris['sepal_width']
sepal_width.head()
0    3.5
1    3.0
2    3.2
3    3.1
4    3.6
Name: sepal_width, dtype: float64
# figureオブジェクトとaxesオブジェクトの作成
fig, ax = plt.subplots(1,4, figsize=(20,4)) #1行×4列のグラフを作成

# グラフの作成
sns.distplot(sepal_width, ax=ax[0])
sns.distplot(sepal_width, ax=ax[1], bins=20) #階級の数を「20」に指定
sns.distplot(sepal_width, ax=ax[2], kde= False) #カーネル密度推定を非表示に指定
sns.distplot(sepal_width, ax=ax[3], hist=False, rug=True) #ヒストグラムを非表示、ラグを表示に設定

# タイトルの追加
ax[0].set_title("hist & kde")
ax[1].set_title("hist (bins=20) & kde")
ax[2].set_title("hist")
ax[3].set_title("kde & rug")

# グラフの表示
plt.show()

Image from Gyazo

ポイント

  • sns.distplot()の最初の引数にSeries型でデータを指定します。
  • 引数binsには階級の数を指定します。
  • 引数kdeFalseを指定すると、カーネル密度推定(曲線で表されているグラフ)を非表示にします。
  • 引数histFalseを指定すると、ヒストグラムを非表示にします。
  • 引数rugTrueを指定すると、ラグを表示します。

【散布図を作成する | scatterplot】

x軸にガクの長さ、y軸にガクの幅を指定して散布図を作成してみます。

# figureオブジェクトとaxesオブジェクトの作成
fig, ax = plt.subplots(1,4, figsize=(24,4), sharey=True)

# グラフの作成
sns.scatterplot(x="sepal_length", y="sepal_width", data=iris, ax=ax[0])
sns.scatterplot(x="sepal_length", y="sepal_width", data=iris, ax=ax[1], hue='species')
sns.scatterplot(x="sepal_length", y="sepal_width", data=iris, ax=ax[2], hue='species', style='species')
sns.scatterplot(x="sepal_length", y="sepal_width", data=iris, ax=ax[3], hue='species', style='species', size='petal_length')

# グラフの表示
plt.show()

Image from Gyazo

ポイント

  • sns.scatterplot()の引数xにガクの長さ、yにガクの幅を指定します。
  • 引数hueに新たな変数(アヤメの種類)を指定することで、各アヤメの種類の情報も加えて可視化することが出来ます。
  • 引数stylehueで指定した変数を指定すると、散布図のマーカーを各種類ごとに変えることが出来ます。
  • 引数sizeにカラムを指定すると、カラムのデータに基づいてマーカーのサイズを変更して、凡例を分かりやすくします。

【散布図行列を作成する | pairplot】

sns.pairplot()の引数dataに元のデータを指定し、hueにプロットしたい変数を指定します。

複数の散布図を行列に整列して表示させたものが、散布図行列です。

# グラフの作成
sns.pairplot(data=iris, hue='species')

# グラフの表示
plt.show()

Image from Gyazo

【ヒートマップを作成する | headmap】

ヒートマップとはデータを可視化するために、行列型の数字データの強弱を色で視覚化する方法です。

「飛行機の乗客数」のデータを使用して、ヒートマップを作成してみます。

# 年と月ごとに乗客を集約した2次元配列データの作成
flights_matrix = flights.pivot_table(index='year', columns='month', values='passengers')
flights_matrix
monthJanFebMarAprMayJunJulAugSepOctNovDec
year
1949112118132129121135148148136119104118
1950115126141135125149170170158133114140
1951145150178163172178199199184162146166
1952171180193181183218230242209191172194
1953196196236235229243264272237211180201
1954204188235227234264302293259229203229
1955242233267269270315364347312274237278
1956284277317313318374413405355306271306
1957315301356348355422465467404347305336
1958340318362348363435491505404359310337
1959360342406396420472548559463407362405
1960417391419461472535622606508461390432
# figureオブジェクトとaxesオブジェクトの作成
fig, ax = plt.subplots(1, 2, figsize=(18, 6))

# グラフの作成
sns.heatmap(data=flights_matrix, ax=ax[0])
sns.heatmap(data=flights_matrix, ax=ax[1], cmap='coolwarm', vmax=450, fmt='d', annot=True)

# 図全体のタイトルの追加
fig.suptitle('ヒートマップ', fontsize=20)

# グラフの表示
plt.show()

Image from Gyazo

ポイント

  • 引数cmapには値の大小をどの色に変換するかを指定します。
  • 公式ドキュメントを参照することが出来ます。
color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation
  • 引数vmaxにはカラーマップと値の範囲を関連付ける必要がある際の最大値を指定します。指定しない場合、データや他の引数から推測されます。
  • 最小値を指定する場合は、vminに値を指定します。
  • 引数annotTrueを指定すると、ヒートマップ内に値を出力します。
  • annotTrueの場合に、引数fmtdを指定すると値を10進整数で表示します。

【さいごに】

今回は、Seabornを使用したグラフの描画方法を紹介しました。

紹介したのはごく一部の可視化手法です。Seabornを使いこなせば多種多様な図を描く事ができます。

是非この機会にSeabornに慣れていきましょう。

使用したCSVファイルやJupyter NotebookはGitHubに公開しています。
Jupyter Notebookは下記コマンドでダウンロードできるので、自由に使って是非練習してみてください。

$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Matplotlib%26Seaborn/Seabornでグラフを描画する.ipynb -O
python-references/Matplotlib&Seaborn at master · nakachan-ing/python-references
Contribute to nakachan-ing/python-references development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました