カラーパレットの選択#
Seabornを使用すると、データと視覚化の目標の特性に適した色を簡単に使用できます。この章では、選択を導くべき一般的な原則と、特定のアプリケーションに最適なソリューションをすばやく見つけるのに役立つSeabornのツールについて説明します。
プロットで色を使用する際の一般的な原則#
色の構成要素#
私たちの目がどのように機能するかにより、特定の色は3つのコンポーネントを使用して定義できます。通常、コンピューターで色をプログラムするには、RGB値を指定します。これにより、ディスプレイの赤、緑、青のチャネルの強度を設定します。ただし、色の知覚属性を分析する場合は、*色相*、*彩度*、および*輝度*チャネルで考える方が適切です。
色相は、非技術的な意味で「異なる色」を区別するコンポーネントです。これは、「赤」や「青」のような一次的な名前につながる色の特性です。
彩度(またはクロマ)は*色の鮮やかさ*です。色相が異なる2つの色は、彩度が高いほどよりはっきりと見えます。
明るさは、光がどれだけ放出されるか(または、印刷された色の場合は反射されるか)に対応し、黒から白の範囲です。
カテゴリを区別するために色相を変える#
プロットで複数のカテゴリを表す場合は、通常、要素の色を変える必要があります。この簡単な例を考えてみましょう。これらの2つのプロットのうち、どちらが三角形の点の数を数えやすいでしょうか?

右側のプロットでは、オレンジ色の三角形が「飛び出し」、円と区別しやすくなっています。この飛び出し効果は、私たちの視覚系が色の違いを優先するためです。
青とオレンジの色は、主に色相の点で異なります。色相はカテゴリを表すのに役立ちます。ほとんどの人は、適度な数の色相を比較的簡単に区別でき、色相は異なるが明るさや強度が似ている点は同じように重要に見えます。また、プロットについて話しやすくもなります。この例を考えてみましょう。

ほとんどの人は、左側のプロットには5つの異なるカテゴリがあることをすぐに確認でき、「青」の点を特徴付けるように求められた場合、そうすることができます。
右側のプロットでは、点はすべて青ですが、輝度と彩度が異なり、いくつのユニークなカテゴリが存在するかを言うのは困難です。また、特定のカテゴリについてどのように話しますか?「かなり青いが、あまり青すぎない点?」さらに、灰色の点は背景にフェードインし、より強烈な青い点と比較してそれらを強調しなくなります。カテゴリが同じように重要である場合、これは不適切な表現です。
したがって、一般的なルールとして、色相の変化を使用してカテゴリを表します。そうは言っても、注意すべき点がいくつかあります。プロットに数個以上の色がある場合、カテゴリとそれらを表すために使用される色の間に既存の関連性がない限り、それぞれの意味を覚えておくのが難しくなる可能性があります。これにより、プロットの解釈が難しくなります。閲覧者はデータに焦点を当てるのではなく、表示されている内容を理解するために凡例を常に参照する必要があります。したがって、複雑すぎるプロットを作成しないように努力する必要があります。そして、誰もが同じように色を見ているわけではないことに注意してください。形状(またはその他の属性)と色の両方を変えることで、色覚異常のある人がプロットを理解するのに役立ち、白黒で印刷された場合でも(ある程度)解釈可能に保つことができます。
数値を表現するために輝度を変える#
一方、色相の変化は数値データを表すのには適していません。この例を考えてみましょう。ここでは、2変量ヒストグラムのカウントを表すために色が必要です。左側では、円形のカラーマップを使用します。各ビン内の観測数の段階的な変化は、色相の段階的な変化に対応します。右側では、より明るい色を使用して、より大きなカウントを持つビンを表すパレットを使用します。

色相ベースのパレットを使用すると、2変量分布の形状を確認するのが非常に困難です。対照的に、輝度パレットを使用すると、2つの顕著なピークがあることがはるかに明確になります。
輝度を変化させると、データの構造が見やすくなり、輝度の変化は重要度の変化としてより直感的に処理されます。ただし、右側のプロットでは、グレースケールカラーマップは使用していません。その色鮮やかさがより面白くし、微妙な色相の変化が2つの値の知覚的な距離を大きくします。その結果、わずかな違いをわずかに解決しやすくなります。
これらの例は、カラーパレットの選択は美学だけに関するものではないことを示しています。選択した色は、効果的に使用すればデータのパターンを明らかにし、不適切に使用すれば隠す可能性があります。最適なパレットは1つではありませんが、特定のデータセットと視覚化アプローチには、より優れているか劣っているパレットがあります。
そして、美学は重要です。人々が図を見たいと思うほど、図から何かを学ぶ可能性が高くなります。これは、自分自身のためにプロットを作成している場合でも当てはまります。探索的データ分析中には、多くの同様の図が生成される場合があります。カラーパレットを変えると、斬新さが加わり、データのおもしろい特徴に気付く準備ができます。
では、データを見栄えよく表現し、魅力的に見えるカラーパレットをどのように選択すればよいでしょうか?
カラーパレットを選択するためのツール#
カラーパレットを操作するための最も重要な関数は、適切にcolor_palette()
です。この関数は、seabornでカラーパレットを生成できるほとんどすべての方法へのインターフェースを提供します。また、palette
引数を持つすべての関数によって内部的に使用されます。
color_palette()
への主な引数は、通常は文字列です。特定のパレットの名前、または特定のメンバーを選択するためのファミリーの名前と追加の引数のいずれかです。後者の場合、color_palette()
は、cubehelix_palette()
などのより具体的な関数に委任します。また、matplotlibが受け入れる方法(RGBタプル、16進数コード、またはX11テーブルの名前)で指定された色のリストを渡すこともできます。戻り値は、16進数コードへの変換やリッチHTML表現など、いくつかの便利なメソッドを持つRGBタプルのリストをラップするオブジェクトです。
引数なしでcolor_palette()
を呼び出すと、色を別途指定しない場合にmatplotlib(およびほとんどのseaborn関数)が使用する現在のデフォルトのカラーパレットが返されます。このデフォルトのパレットは、対応するset_palette()
関数を使用して設定できます。この関数は、内部的にcolor_palette()
を呼び出し、同じ引数を受け入れます。
color_palette()
が提供するさまざまなオプションを説明するために、カラーパレットの分類スキームを紹介すると便利です。広義には、パレットは3つのカテゴリのいずれかに分類されます。
質的パレット。カテゴリデータを表すのに適しています。
連続パレット。数値データを表すのに適しています。
発散パレット。カテゴリ境界を持つ数値データを表すのに適しています。
質的カラーパレット#
質的パレットは、ほとんどの変動が色相コンポーネントにあるため、カテゴリデータを表すのに適しています。seabornのデフォルトのカラーパレットは、10個の異なる色相を持つ質的パレットです。
sns.color_palette()
これらの色は、デフォルトのmatplotlibカラーパレット"tab10"
と同じ順序ですが、少し強度が低くなっています。比較してみましょう。
sns.color_palette("tab10")
実際、seabornには、deep
、muted
、pastel
、bright
、dark
、およびcolorblind
と呼ばれるmatplotlibのパレットの6つのバリエーションがあります。これらは、平均輝度値と彩度値の範囲に及びます。
多くの人が、デフォルトの "deep"
パレットの穏やかな色合いを美しいと感じる一方で、それらは区別しにくいという側面も持ち合わせています。そのため、出版用の図を作成する際には、いくつかの状況下で識別が難しくなる可能性があることを念頭に置く必要があります。色覚異常のさまざまな形態をシミュレートした際に、seabornのカラーパレットがどのように機能するかを評価する上で、こちらの比較が役立つでしょう。
円形カラーシステムの使用#
任意数のカテゴリがある場合、ユニークな色合いを見つける最も簡単な方法は、円形の色空間(明度と彩度を一定に保ちながら色相が変化する空間)で等間隔に色を配置することです。これは、seabornのほとんどの関数が、デフォルトのカラーサイクルで現在設定されている色数よりも多くの色を使用する必要がある場合のデフォルトの動作です。
この処理で最も一般的な方法は、RGB値の単純な変換であるhls
色空間を使用することです。このカラーパレットは、ヒストグラムのプロット方法の反例として以前に確認しました。
sns.color_palette("hls", 8)
人間の視覚システムの仕組みにより、RGB値の観点から同じ輝度と彩度を持つ色は、必ずしも同じ強度に見えるとは限りません。これを是正するために、seabornはhuslシステム(後にHSLuvに改名)へのインターフェースを提供します。このシステムは、カラーホイールを回転させても強度の変化が少なくなります。
sns.color_palette("husl", 8)
seabornは、現在のデフォルトで使用可能な色数よりも多くの色を持つカテゴリパレットが必要な場合、このアプローチを使用します。
カテゴリカルColor Brewerパレットの使用#
視覚的に心地よいカテゴリカルパレットのもう1つのソースは、Color Brewerツール(以下で説明するように、連続パレットと発散パレットも備えています)です。
sns.color_palette("Set2")
質的なColor Brewerパレットにはさまざまな長さがあることに注意してください。color_palette()
のデフォルトの動作は、完全なリストを提供することです。
sns.color_palette("Paired")
連続カラーパレット#
カラーパレットの2番目の主要なクラスは「連続」と呼ばれます。この種のマッピングは、データが比較的低いまたは面白くない値から比較的高いまたは面白い値まで(またはその逆)範囲にある場合に適切です。上記で見たように、連続パレットの変動の主な次元は輝度です。一部のseaborn関数は、数値データをマッピングする場合、デフォルトで連続パレットを使用します。(歴史的な理由により、カテゴリカルと数値のマッピングの両方が、relplot()
や displot()
のような関数の hue
パラメータで指定されます。ただし、数値マッピングでは色相の変動が比較的少ないカラーパレットが使用されます。)
知覚的に均一なパレット#
数値表現を目的とするため、最適な連続パレットは知覚的に均一である必要があります。つまり、2つの色の相対的な識別可能性は、対応するデータ値の差に比例します。Seabornには、"rocket"
、"mako"
、"flare"
、"crest"
の4つの知覚的に均一な連続カラーマップが含まれています。最初の2つは、非常に広い輝度範囲を持ち、色がプロットされたスペースを埋めるヒートマップなどの用途に適しています。
sns.color_palette("rocket", as_cmap=True)
sns.color_palette("mako", as_cmap=True)
これらのカラーマップの極値は白に近づくため、線や点などの要素の色付けには適していません。白または灰色の背景に対して重要な値を識別することが難しくなります。「flare」と「crest」のカラーマップは、そのようなプロットに適しています。輝度変化の範囲がより制限されており、それを補うために色相の変動がわずかに顕著になっています。輝度ランプのデフォルトの方向も反転されており、小さい値はより明るい色になります。
sns.color_palette("flare", as_cmap=True)
sns.color_palette("crest", as_cmap=True)
matplotlibで提供されている "magma"
や "viridis"
など、知覚的に均一なカラーマップを使用することもできます。
sns.color_palette("magma", as_cmap=True)
sns.color_palette("viridis", as_cmap=True)
matplotlibの慣例と同様に、すべての連続カラーマップには、接尾辞"_r"
が付いた反転バージョンがあります。
sns.color_palette("rocket_r", as_cmap=True)
離散マッピングと連続マッピング#
注意すべき点の1つは、seabornが連続カラーマップから離散値を生成でき、その際に極値を使用しないということです。上記の連続バージョンと比較して、"rocket"
の離散バージョンを比較してください。
sns.color_palette("rocket")
内部的には、seabornはカテゴリカルデータには離散バージョンを使用し、数値マッピングモードでは連続バージョンを使用します。離散連続カラーマップは、特に色相の変動がある場合、固有の順序付けを持つカテゴリカルデータを視覚化するのに適しています。
連続「cubehelix」パレット#
知覚的に均一なカラーマップは、RGB色空間に基づいていないため、プログラムで生成するのが困難です。cubehelixシステムは、RGBベースの妥協案を提供します。つまり、輝度が直線的に増加または減少し、色相に連続的な変動がある連続パレットを生成します。完全に知覚的に均一ではありませんが、結果として得られるカラーマップには多くの優れた特性があります。重要なことに、設計プロセスの多くの側面をパラメータ化できます。
matplotlibには、デフォルトのcubehelixバージョンが組み込まれています。
sns.color_palette("cubehelix", as_cmap=True)
seabornの cubehelix_palette()
関数によって返されるデフォルトのパレットは、色相ホイールをそれほど回転させず、強度範囲をそれほど広くカバーしていないという点で、matplotlibのデフォルトとは少し異なります。また、輝度ランプを反転させます。
sns.cubehelix_palette(as_cmap=True)
cubehelix_palette()
の他の引数は、パレットの外観を制御します。変更する主な2つの要素は、start
(0から3の値) と rot
、または回転数 (任意の値ですが、通常は-1から1の間) です。
sns.cubehelix_palette(start=.5, rot=-.5, as_cmap=True)
回転するほど、色相の変化が大きくなります。
sns.cubehelix_palette(start=.5, rot=-.75, as_cmap=True)
両端の明るさと暗さ、およびそれらの順序を制御できます。
sns.cubehelix_palette(start=2, rot=0, dark=0, light=.95, reverse=True, as_cmap=True)
color_palette()
は、任意のcubehelixパレットを生成するための "ch:"
で始まる文字列コードを受け入れます。文字列にパラメータ名を渡すことができます。
sns.color_palette("ch:start=.2,rot=-.3", as_cmap=True)
コンパクトにするために、各パラメータは最初の文字で指定できます。
sns.color_palette("ch:s=-.2,r=.6", as_cmap=True)
カスタム連続パレット#
カスタム連続パレットのよりシンプルなインターフェースとして、light_palette()
または dark_palette()
を使用できます。これらはどちらも単一の色で初期化され、明るいまたは暗い非彩度の値からその色にランプするパレットを生成します。
sns.light_palette("seagreen", as_cmap=True)
sns.dark_palette("#69d", reverse=True, as_cmap=True)
cubehelixパレットと同様に、color_palette()
を介して、または palette
が受け入れられる場所ならどこでも、明暗パレットを指定することもできます。
sns.color_palette("light:b", as_cmap=True)
"_r"
を追加して、カラーマップを反転させます。
sns.color_palette("dark:salmon_r", as_cmap=True)
連続Color Brewerパレット#
Color Brewerライブラリには、連続パレットに適したオプションもいくつかあります。これらには、1つの主要な色相を持つパレットが含まれます。
sns.color_palette("Blues", as_cmap=True)
マルチ色相オプションも同様です。
sns.color_palette("YlOrBr", as_cmap=True)
発散カラーパレット#
カラーパレットの3番目のクラスは「発散」と呼ばれます。これらは、低い値と高い値の両方が興味深く、強調する必要がある中間値(多くの場合0)にまたがるデータに使用されます。優れた発散パレットを選択するためのルールは、優れた連続パレットに似ていますが、カラーマップには2つの支配的な色相があり、それぞれ極(またはその近く)にある必要があります。また、開始値の輝度と彩度が類似していることも重要です。
知覚的に均一な発散パレット#
Seabornには、"vlag"
と "icefire"
の2つの知覚的に均一な発散パレットが含まれています。どちらも、極に青と赤を使用しており、多くの人が直感的に「冷たい」と「熱い」と認識します。
sns.color_palette("vlag", as_cmap=True)
sns.color_palette("icefire", as_cmap=True)
カスタム発散パレット#
また、seabornの関数diverging_palette()
を使用して、発散データ用のカスタムカラーマップを作成することもできます。この関数は、husl
カラーシステムを使用して発散パレットを作成します。2つの色相(度単位)と、オプションで極値の明度と彩度の値を渡します。husl
を使用するということは、極値と、結果として得られる中間点へのランプが、完全に知覚的に均一ではないものの、バランスが取れていることを意味します。
sns.diverging_palette(220, 20, as_cmap=True)
これは、単調な寒色-暖色のアプローチから逸脱したい場合に便利です。
sns.diverging_palette(145, 300, s=60, as_cmap=True)
中間点が明るいのではなく、暗いパレットを作成することも可能です。
sns.diverging_palette(250, 30, l=65, center="dark", as_cmap=True)
ここで強調すべき重要な点は、赤と緑の使用は直感的ではあるものの、避けるべきということです。
その他の発散パレット#
matplotlibには、Color Brewerパレットなど、いくつかの優れた発散パレットが組み込まれています。
sns.color_palette("Spectral", as_cmap=True)
そして、中間値と極値の間のコントラストが少ないcoolwarm
パレットもあります。
sns.color_palette("coolwarm", as_cmap=True)
ご覧のとおり、視覚化で色を使用するための多くのオプションがあります。Seabornは、適切なデフォルトを使用すると同時に、高い柔軟性を提供しようと努めています。
この議論はほんの始まりに過ぎず、視覚化で色を使用するためのテクニックについてさらに学ぶための優れたリソースが多数あります。その素晴らしい例の1つが、NASA Earth Observatoryの一連のブログ記事です。matplotlibのドキュメントには、カラーマップの知覚特性のいくつかを示す優れたチュートリアルもあります。