図の美しさを制御する#

魅力的な図を作成することは重要です。データセットを探索する場合に自分で図を作成する際には、見ていて楽しいプロットがあるとよいです。また、可視化は定量的な洞察をオーディエンスに伝えるときにも重要であり、その場合はなおさら、注意を引き、視聴者を惹き付ける図が必要になります。

Matplotlibのカスタマイズ性は非常に高いですが、魅力的なプロットを作成するためにどの設定を調整するかを理解するのは難しい場合があります。Seabornには、カスタマイズされたテーマと、matplotlib figureの見栄えを制御するための高レベルインターフェースが用意されています。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

オフセット正弦波をいくつかプロットする簡単な関数を定義します。これにより、調整可能なさまざまなスタイルパラメーターを確認できます。

def sinplot(n=10, flip=1):
    x = np.linspace(0, 14, 100)
    for i in range(1, n + 1):
        plt.plot(x, np.sin(x + i * .5) * (n + 2 - i) * flip)

これがmatplotlibのデフォルトを使用したプロットの外観です。

sinplot()
../_images/aesthetics_7_0.png

seabornのデフォルトに切り替えるには、set_theme()関数を呼び出すだけです。

sns.set_theme()
sinplot()
../_images/aesthetics_9_0.png

(seabornのバージョン0.8より前は、set_theme()はインポート時に呼び出されていました。それ以降のバージョンでは、明示的に呼び出す必要があります)。

Seabornはmatplotlibパラメーターを2つの独立したグループに分割します。最初のグループはプロットの美的なスタイルを設定し、2番目のグループはさまざまなfigure要素をスケーリングして、それらを異なるコンテキストに容易に取り込むことができます。

これらのパラメーターを操作するためのインターフェースは、2組の関数です。axes_style()関数とset_style()関数はスタイルを制御します。プロットをスケールするには、plotting_context()関数とset_context()関数を使用します。どちらの場合も、最初の関数はパラメーターの辞書を返し、2番目の関数はmatplotlibのデフォルトを設定します。

Seaborn figureスタイル#

シーボーンのテーマにはダークグリッド、ホワイトグリッド、ダーク、ホワイト、ティックの5つのプリセットがあります。それぞれが異なるアプリケーションと個人的な好みに適しています。デフォルトのテーマはダークグリッドです。上で述べたように、グリッドはプロットを定量情報の検索テーブルとして利用するのに役立ち、グレーのホワイトにより、グリッドがデータを表す線と競合しないようになります。ホワイトグリッドのテーマは似ていますが、データ要素の多いプロットにより適しています

sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data);
../_images/aesthetics_11_0.png

多くのプロットでは(主にデータのパターンの印象を提供するために図を使用する講演などの設定で)グリッドは不要です。

sns.set_style("dark")
sinplot()
../_images/aesthetics_13_0.png
sns.set_style("white")
sinplot()
../_images/aesthetics_14_0.png

プロットに少し追加の構造を与えたい場合もあります。そこではティックが便利になります。

sns.set_style("ticks")
sinplot()
../_images/aesthetics_16_0.png

軸の線を削除#

ホワイトとティックの両方のスタイルは、不要な上と右の軸の線を削除することから恩恵を受けます。シーボーンの関数despine()を呼び出すと、それらを削除できます。

sinplot()
sns.despine()
../_images/aesthetics_18_0.png

一部のプロットは、データを避けて線をオフセットすることから恩恵を受けます。これはdespine()の呼び出し時に実行することもできます。ティックが軸の範囲全体をカバーしていない場合、trimパラメータは残っている線の範囲を制限します。

f, ax = plt.subplots()
sns.violinplot(data=data)
sns.despine(offset=10, trim=True);
../_images/aesthetics_20_0.png

追加の引数をdespine()に渡すことで、どの線を削除するかを制御することもできます。

sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True)
../_images/aesthetics_22_0.png

描画のスタイルを一時的に設定#

前後に切り替える方が簡単ですが、axes_style()関数をwithステートメントで使用して、プロットパラメータを一時的に設定することもできます。これにより、スタイルの異なる軸を持つ図を作成することもできます。

f = plt.figure(figsize=(6, 6))
gs = f.add_gridspec(2, 2)

with sns.axes_style("darkgrid"):
    ax = f.add_subplot(gs[0, 0])
    sinplot(6)

with sns.axes_style("white"):
    ax = f.add_subplot(gs[0, 1])
    sinplot(6)

with sns.axes_style("ticks"):
    ax = f.add_subplot(gs[1, 0])
    sinplot(6)

with sns.axes_style("whitegrid"):
    ax = f.add_subplot(gs[1, 1])
    sinplot(6)

f.tight_layout()
../_images/aesthetics_24_0.png

シーボーンスタイルの要素をオーバーライド#

シーボーンのスタイルをカスタマイズする場合は、rc引数のパラメータのディクショナリをaxes_style()set_style()に渡します。このメソッドでは、スタイル定義の一部であるパラメータしかオーバーライドできないことに注意してください。(ただし、より上位のset_theme()関数は、Matplotlibのパラメータのディクショナリを取得します)。

含まれるパラメータを確認したい場合は、引数なしで関数を呼び出すだけで、現在の設定が返されます。

sns.axes_style()

その後、これらのパラメータの異なるバージョンを設定できます。

sns.set_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
../_images/aesthetics_28_0.png

プロットエレメントの拡大縮小#

別のパラメータのセットは、プロットエレメントのスケールを制御します。これにより、大型プロまたは小規模プロットが適切な場面でプロットを作成するために同じコードを使用できます。

まず、set_theme()をコールして、デフォルトパラメータをリセットします。

sns.set_theme()

4つのプリセットコンテキスト、相対サイズ順に、papernotebooktalk、およびposterがあります。notebookスタイルはデフォルトで、上のプロットで使用されています。

sns.set_context("paper")
sinplot()
../_images/aesthetics_32_0.png
sns.set_context("talk")
sinplot()
../_images/aesthetics_33_0.png
sns.set_context("poster")
sinplot()
../_images/aesthetics_34_0.png

スタイル関数について知っていることのほとんどがコンテキスト関数に引き継がれます。

set_context()をこれらの名前のいずれかでコールして、パラメータを設定できます。パラメータ値の辞書を提供することで、パラメータを無効にできます。

コンテキストを変更するときに、フォント要素のサイズを個別にスケールすることもできます。(このオプションは、最上位のset()関数でも使用できます)。

sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
../_images/aesthetics_36_0.png

同様に、with文の下にネストされている図のスケールを一時的に制御できます。

スタイルとコンテキストの両方を、set()関数で素早く設定できます。この関数はデフォルトの色パレットも設定しますが、チュートリアルの次のセクションで詳しく説明します。