Python

Python初心者向け:seabornでのグラフ作成を基本から解説

スポンサーリンク

▶ Pythonによる描画のまとめ記事もあります。あわせてお読みください。

はじめに

これまでmatplotlibを使ったグラフの描画を扱ってきました。matplotlibでは、細かな設定をすることで、思い通りのグラフを描くことができる、と実感できたかと思います。ただ、反面、細かな設定をすることが難しく感じた面もあるかと思います。seabornはMatplotlibの機能をより美しく、またより簡単に実現するためのラッパー的存在です。今回はseabornによるグラフの描画を扱いましょう。

Seabornを使う準備

Seabornのプロット系の関数は、データとしてpandasライブラリのデータフレームを使います。これは、とても扱いやすいですね。

Seabornで描画する際には、次のようにSeaborn, Matplotlib, Numpy, Pandasの4つのライブラリをインポートしておくとよいでしょう。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline

SeabornはMatplotlibを補完するものなので、セットでインポートします。冒頭に書いたように、データとしてPandasのデータフレームを扱うので、併せてPandasもインポートしておきましょう。Numpyは使用しないこともあるので、状況に合わせてインポートする/しないを判断するとよいでしょう。

サンプルデータの準備

これまでに扱ったのことのある、 seabornに準備されている学習用のデータセットであるtipsデータセットを使うことにしましょう。

tips=sns.load_dataset('tips')
tips.head()

Seabornのスタイルで描く

簡単に、きれいに描画できる、というのをちょっと体感してみましょう。上記のデータサンプルを用いてmatplotlibで散布図を描いてみます。

plt.scatter(tips.query('sex=="Female"')['total_bill'],tips.query('sex=="Female"')['tip'],label='女性',color='orange')
plt.scatter(tips.query('sex=="Male"')['total_bill'],tips.query('sex=="Male"')['tip'],label='男性',color='darkblue')

今回は、グラフタイトルも軸ラベル・凡例も設定していませんが、matplotlibで最低限の設定で散布図を描くとこんな感じです。このコードに1行だけ加えて、Seabornで描くと次のようになります。

sns.set()
plt.scatter(tips.query('sex=="Female"')['total_bill'],tips.query('sex=="Female"')['tip'],label='女性',color='orange')
plt.scatter(tips.query('sex=="Male"')['total_bill'],tips.query('sex=="Male"')['tip'],label='男性',color='darkblue')

どうですか?たった1行加えただけで少し、洗練された形になったと思いませんか?sns.set()は、スタイルをSeabornにする命令です。これだけでもちょっと変わった感じがしますよね。

Seabornを使って描くと、簡単にもっといろんなことができます。

スポンサーリンク

Seabornで散布図を描く

Seabornは、
sns.関数名(’列名(x軸)’, ‘列名(y軸)’, data=データフレーム名)
が基本となります。これに描くグラフによっていろいろな引数を指定していきます。では、まずはシンプルな散布図から描いてみましょう。

sns.relplot('total_bill','tip',data=tips)

たった1行でこれを描くことができます。タイトルはこれまでどおり、plt.title()で設定することができます。文字化けする場合は、sns.set()の中でfontを次のように指定するとよいでしょう。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips)
plt.title('総支払額とチップの関係')

さて、ここまでだと、まだSeabornのすごさが全然伝わってきませんよね。ここからさらにこのグラフに手を加えていきましょう。男性であるか・女性であるかの層別にみてみましょう。層別にみるには、hueという引数を使います。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips,hue='sex')
plt.title('総支払額とチップの関係')

この散布図は実質、sns.relplot(‘total_bill’,’tip’,data=tips,hue=’sex’)の一行で描いています。hueで指定した変数により色分けがされます。

次にマーカーの形でもう一つ別の変量を表してみましょう。マーカーの形はstyle(形状)で指定することができます。ここでは、喫煙者かどうかを表すsmokerという変数を指定してみましょう。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips,hue='sex',style='smoker')
plt.title('総支払額とチップの関係')

性別による色分け、喫煙者かどうかによりマーカーの形状を変えてプロットできます。これも実質たった一行で実現しています。

最後に値の大きさによってマーカーのサイズを変えてプロットしてみましょう。これをおこなうには、引数sizeを使います。Tipsデータセットには、sizeという項目があります。※たまたま引数名と項目名が同じでややこしいですが。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips,size='size')
plt.title('総支払額とチップの関係')

もうちょっとマーカーのサイズにメリハリをつけたければ、マーカーのサイズのmax,minを指定することもできます。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips,size='size',sizes=(10,200))
plt.title('総支払額とチップの関係')

もちろん、性別による色分けと組み合わせてプロットすることもできます。

sns.set(font='IPAexGothic')
sns.relplot('total_bill','tip',data=tips,size='size',sizes=(10,200),hue='sex')
plt.title('総支払額とチップの関係')
スポンサーリンク

まとめ

いかがでしょうか?Seabornの破壊力が伝わったでしょうか?最後に示した例などは、一つのグラフでいろんな情報を与えてくれますよね。これを実質一行のコードで描くことができます。もちろん、matplotlibで地道にこのグラフを描くこともできますが、「簡単に」描いてくれるSeabornはありがたいですよね。しっかり復習しておいてください。

▶ グラフを見やすく設定する記事をまとめています。下記からどうぞ。

コメント

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