Python

Python seaborn チュートリアル マルチプロットグリッド プロット機能 構造化と構築 (2)

原文のドキュメントはこちらから。

カスタム関数の使用

FacetGridを使用する際には、既存のmatplotlibやseaborn関数に制限されることはない。しかし、正しく動作させるためには、使用するどの関数もいくつかのルールに従う必要がある。

  1. “現在アクティブな “matplotlib Axesの上にプロットする必要がある。これは、matplotlib.pyplot名前空間内の関数に当てはまり、そのメソッドで直接作業したい場合は、matplotlib.pyplot.gca()を呼び出して現在のAxesへの参照を得ることができる。
  2. 位置引数でプロットするデータを受け入れなければならない。内部的には、FacetGrid.map()に渡された名前付き位置引数のそれぞれについて、FacetGridはデータのSeriesを渡す。
  3. カラーとラベルのキーワード引数を受け入れることができなければならず、理想的には、それらを使って何か有用なことをする。ほとんどの場合、**kwargsの一般的な辞書をキャッチして、それを基礎となるプロット関数に渡すのが最も簡単である。

プロットできる関数の最低限の例を確認する。この関数は、各ファセットのデータの単一のベクトルを取得する。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")

from scipy import stats
def quantile_plot(x, **kwargs):
    quantiles, xr = stats.probplot(x, fit=False)
    plt.scatter(xr, quantiles, **kwargs)

g = sns.FacetGrid(tips, col="sex", height=4)
g.map(quantile_plot, "total_bill")

plt.show()

二変量プロットをしたい場合は、x軸の変数を最初に、y軸の変数を2番目に受け入れるように関数を書く必要がある。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")

from scipy import stats
def qqplot(x, y, **kwargs):
    _, xr = stats.probplot(x, fit=False)
    _, yr = stats.probplot(y, fit=False)
    plt.scatter(xr, yr, **kwargs)

g = sns.FacetGrid(tips, col="smoker", height=4)
g.map(qqplot, "total_bill", "tip")

plt.show()

matplotlib.pyplot.scatter()は色とラベルのキーワード引数を受け付けて、それらを適切に処理するので、色相ファセットを追加できる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")

from scipy import stats
def qqplot(x, y, **kwargs):
    _, xr = stats.probplot(x, fit=False)
    _, yr = stats.probplot(y, fit=False)
    plt.scatter(xr, yr, **kwargs)

g = sns.FacetGrid(tips, hue="time", col="sex", height=4)
g.map(qqplot, "total_bill", "tip")
g.add_legend()

plt.show()

color および label キーワード引数で期待通りに動作しない関数をマップしたいことがある。この場合、それらを明示的にキャッチして、カスタム関数のロジックで処理したいと考えられる。例えば、このアプローチでは、matplotlib.pyplot.hexbin()をマップできる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")

def hexbin(x, y, color, **kwargs):
    cmap = sns.light_palette(color, as_cmap=True)
    plt.hexbin(x, y, gridsize=15, cmap=cmap, **kwargs)

with sns.axes_style("dark"):
    g = sns.FacetGrid(tips, hue="time", col="time", height=4)
g.map(hexbin, "total_bill", "tip", extent=[0, 50, 0, 10])

plt.show()