前回の記事では、matplotlib を使って、データの分布をグラフ化する方法を紹介しました。
今回紹介する seaborn というライブラリを使うと、matplotlib よりも視覚的に美しいグラフを描いたり、表形式データに対して簡単に総当たりの散布図を描くことが出来るようになります。
そこで、この記事では seaborn を使った 箱ひげ図、ヒストグラム、バィオリンプロットの描き方と、DataFrameに含まれるデータを使って総当たりで散布図を描く方法を解説したいと思います。
インストール方法
Anaconda で Python をインストールしている方は、import するだけで使えると思いますが、もし import エラーが出る場合、もしくは Python の公式サイトから直接 Python をインストールしている方は、あらかじめインストールしておいてください。
1 2 3 4 5 |
# Python を公式サイトからインストールしている場合 pip install seaborn # Python を Anaconda のサイトからインストールしている場合 conda install seaborn |
インストールが完了したら、次の様に import して下さい。
seaborn は matplitlib のラッパーであり、内部で matplotlib を使っていますので、必ず matplotlib も合わせて import して下さい。
1 2 |
import matplotlib.pyplot as plt import seaborn as sns |
matplitlib がインストールされていない場合は、こちらの記事を参考にインストールして下さい。
サンプルデータについて
各グラフを描くためのサンプルデータは下記のプログラムで作成しています。
1 2 3 4 5 6 7 8 |
import numpy as np import pandas as pd #正規分布の乱数を使ってテストデータを作成(平均値:loc、標準偏差:scale、データ数:size) data1 = np.random.normal(loc=50, scale=25, size=100) data2 = np.random.normal(loc=20, scale=10, size=100) data3 = np.random.normal(loc=10, scale=5, size=100) df = pd.DataFrame({'col1':data1,'col2':data2,'col3':data3}) |
箱ひげ図を描く
箱ひげ図は catplot メソッドを使います。
data 引数に描画データを、kind 引数に ‘box’ を指定します。
matplotlib の時はX軸に列名を表示するための指定が必要でしたが、searborn では特に設定せずともDataFrameの列名をX軸に表示してくれます。
1 2 3 4 5 |
import matplotlib.pyplot as plt import seaborn as sns sns.boxplot(data=df) plt.show() |
実行したら下記のグラフが表示されます。
各箱に色がついているので、とっても見やすいですね。

ヒストグラムを描く
箱ひげ図は distplot メソッドを使います。
こちらは複数のヒストグラムが描けないので、1列づつ指定する必要があります。
下記の例は、列名が ‘col1’ のデータを表示するものです。
1 2 3 4 5 |
import matplotlib.pyplot as plt import seaborn as sns sns.distplot(df['col1']) plt.show() |
実行結果は以下の通りです。
特に指定しなくても、線グラフが同時に描画されます。

バィオリンプロットを描く
バィオリンプロットは violinplot メソッドを使います。
1 2 3 4 5 |
import matplotlib.pyplot as plt import seaborn as sns sns.violinplot(data=df) plt.show() |
実行結果は次の通りです。
各バィオリンの背景色に色がついているのと、バィオリンの中に箱ひげが表示されていて、中央値、四分位も判断できるようになっています。

総当たりの散布図を描く
総当たりの散布図を描くには pairplot メソッドを使います。
今回は列が3つなので3×3=9個のグラフが表示されますが、下図が増えると表示までに結構な時間が掛かります。
フリーズしたんではないかと勘違いするかもしれませんが、そこは我慢して待ちましょう。
1 2 3 4 5 |
import matplotlib.pyplot as plt import seaborn as sns sns.pairplot(df) plt.show() |
実行結果は以下の通りです。
散布図なので、対角線(縦、横が同じデータ)に位置するグラフはヒストグラムが表示されています。

グラフの見栄えを良くする
Seaborn でデザインを整えるには set 又は set_style メソッドを使います。
メソッドの引数には以下の5種類が指定できます。
引数の値 | 背景色 | グリッド |
---|---|---|
darkgrid | グレー | 有り |
dark | グレー | 無し |
whitegrid | 白 | 有り |
white | 白 | 無し |
ticks | 白 | 軸のみグリッド有り |
下記は実際の指定例です
1 2 3 |
sns.set_style('darkgrid') #← sns.set(style='darkgrid')でも良い sns.catplot(data=df, kind='box') plt.show() |
実行結果は以下の通りです。
グラフによっては ‘white’と’ticks’が同じデザインになるようです。
少なくとも箱ひげの場合は同じ結果になったため、今回は割愛しました。

グラフのタイトルを表示する
グラフのタイトルを表示する方法はいくつかありますが、1つは sns.boxplot() から返される seaborn の axis オブジェクトを使う方法です。
1 2 3 4 5 6 |
sns.set(style='darkgrid',font='Meiryo') ax = sns.boxplot(data=df) ax.set_title('箱ひげ図') #グラフタイトル ax.set_xlabel('X軸') #横軸タイトル ax.set_ylabel('Y軸') #縦軸タイトル plt.show() |
このサンプルソースでは、sns.set() の引数に font=’Meiryo’ を指定して、タイトルが漢字の場合の文字化けを防いでいます。
記述の順番が重要で、sns.boxplot() の前に sns.set() を記述しないと設定が有効にならないのでご注意ください。

もう1つの方法は、matplotlib に対して設定する方法です。
下記はそのサンプルソースですが、 sns.set_style () の記述位置には注意が必要です。
pltでグラフタイトル、軸タイトルを設定した後で sns.set_style () を 設定しないと文字化けを起こしてしまいます。

くれぐれも順番にはご注意ください。
1 2 3 4 5 6 7 8 9 10 11 |
#箱ひげ図を描画 plt.rcParams['font.family'] = 'Meiryo' plt.title('箱ひげ図') #グラフタイトル plt.xlabel('X軸') #横軸タイトル plt.ylabel('Y軸') #縦軸タイトル sns.set_style('darkgrid') #←スタイルはタイトルの設定が終わってから記述する ax = sns.boxplot(data=df) #箱ひげ図を作成 plt.show() |

まとめ
今回は seaboarn を使った、箱ひげ図、ヒストグラム、バィオリンプロットの描き方と、総当たりの散布図の描き方について解説しました。
箱ひげ図、ヒストグラム、バィオリンプロット については、matplotlib を使った時よりも綺麗なグラフが簡単に描けるようになります。
また、総当たりの散布図については表形式のデータを与えるだけで良いので、大変便利です。
matplotlib に比べて知名度は低いですが、デザイン性は優れていますので、是非ご活用ください。