▶ 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はありがたいですよね。しっかり復習しておいてください。
▶ グラフを見やすく設定する記事をまとめています。下記からどうぞ。
コメント