seabornを使用すると、Pythonを使用してデータを可視化することができます。
本記事では、seabornによるFacetGridの使用方法について、詳しくご説明します。
- Pythonを使用したデータの可視化方法を知りたい人
- seabornによるFacetGridの使用方法を知りたい人
seabornとは
seabornは、Pythonを使用してデータを可視化するための外部ライブラリの1つです。
データ可視化用ライブラリは他にも複数あり、その中でも特にMatplotlibが有名です。
seabornはMatplotlibをベースに作られており、Matplotlibの描画機能を利用しています。
seabornの長所は、Matplotlibよりも美しい図を、より少ないコードで簡単に描ける点です。
本記事では、seabornによるFacetGridの使用方法をご紹介します。
seabornのインストール
「seaborn」は、以下コマンドを入力することで、インストールすることができます。
コマンドの入力は、コマンドプロンプトあるいはターミナルから行います。
pip install seaborn
動作確認として、試しに以下を入力します。
import seaborn as sns
上記を入力してもエラーが発生しなければ、正常にインストールされています。
FacetGridの使用方法
seaborn.FacetGrid()関数を使用することで、FacetGridを使用することができます。
FacetGridとは、異なる水準で条件付けられた関係をプロットするためのマルチプロットグリッドのことです。
FacetGrid()関数の引数には、データセット、行データ、列データ等を指定します。
データセットの「tips」を用いて、FacetGridを使用してみます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
sns.FacetGrid(tips)
plt.show()

上グラフの通り、データセットのみの指定では何もプロットされません。
列変数や行変数を割り当てることで、サブプロットを追加することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
sns.FacetGrid(tips, col="time", row="sex")
plt.show()

関数とデータフレーム内の1つ以上の列の名前をFacetGrid.map()に渡すことで、すべてのファセットでプロットを描画することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time", row="sex")
g.map(sns.scatterplot, "total_bill", "tip")
plt.show()

FacetGrid.map_dataframe()を使用して、名前付き変数を代入することもできます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time", row="sex")
g.map_dataframe(sns.histplot, x="total_bill")
plt.show()

追加のキーワード引数を渡すことでビンの幅を同期することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time", row="sex")
g.map_dataframe(sns.histplot, x="total_bill", binwidth=2, binrange=(0, 60))
plt.show()

hueを指定すると、カテゴリ別に描画できます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time", hue="sex")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.add_legend()
plt.show()

FacetGrid.map_dataframe()にhueを指定することもできます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")
g.add_legend()
plt.show()

heightを指定すると、プロットの高さを変更することができます。
aspectを指定すると、プロットの幅(割合)を変更することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65)
g.map(sns.histplot, "total_bill")
plt.show()

colに多くのレベルがある場合、複数の行にまたがるように変数を「ラップ」することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="size", height=2.5, col_wrap=3)
g.map(sns.histplot, "total_bill")
plt.show()

FacetGrid.refline()を使用することで、すべてのファセットに水平または垂直の基準線を追加することができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="time", margin_titles=True)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.refline(y=tips["tip"].median())
plt.show()

カスタム関数を渡すことで、プロットしたり、各ファセットに注釈を付けたりすることができます。
データ数を示す注釈をつけてみます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
import matplotlib.pyplot as plt
def annotate(data, **kws):
n = len(data)
ax = plt.gca()
ax.text(.1, .6, f"N = {n}", transform=ax.transAxes)
g = sns.FacetGrid(tips, col="time")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.map_dataframe(annotate)
plt.show()

カスタム関数を渡すことで、プロットしたり、各ファセットに注釈を付けたりすることができます。
データ数を示す注釈をつけてみます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.set_axis_labels("Total bill ($)", "Tip ($)")
g.set_titles(col_template="{col_name} patrons", row_template="{row_name}")
g.set(xlim=(0, 60), ylim=(0, 12), xticks=[10, 30, 50], yticks=[2, 6, 10])
g.tight_layout()
g.savefig("facet_plot.png")
plt.show()

追加の調整のために、基になる matplotlib オブジェクトにもアクセスすることができます。
#input
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# データセットの読み込み
tips = sns.load_dataset("tips")
# FacetGridの指定・描画
g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True, despine=False)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.figure.subplots_adjust(wspace=0, hspace=0)
for (row_val, col_val), ax in g.axes_dict.items():
if row_val == "Lunch" and col_val == "Female":
ax.set_facecolor(".95")
else:
ax.set_facecolor((0, 0, 0, 0))
plt.show()

まとめ
この記事では、seabornによるFacetGridの使用方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!