[matplotlib] 135. 自作カラーマップでデータを可視化

matplotlib

はじめに

matplotlibでは、デフォルトで多くのカラーマップが用意されていますが、独自のカラーマップを作成することで、データの可視化をより効果的に行うことができます。この記事では、自作カラーマップの作成方法について解説します。

モジュールのインポート

バージョン

基本的な自作カラーマップの作成

LinearSegmentedColormapを使用する方法

最も一般的な方法は、matplotlib.colors.LinearSegmentedColormapを使用する方法です。

このコードは、matplotlibで自作カラーマップを作成してランダムデータを可視化する例です。

カラーマップの定義

  • colors = ['blue', 'cyan', 'yellow', 'red']: 青→シアン→黄色→赤の4色で構成されるカラーマップを定義
  • n_bins = 100: 色の段階数を100に設定し、滑らかなグラデーションを作成

カスタムカラーマップの作成

  • LinearSegmentedColormap.from_list(): 色のリストから線形補間でカラーマップを生成
  • cmap_name: カラーマップに「my_colormap」という名前を付与

データの可視化

  • np.random.rand(10, 10): 10×10のランダムな数値データを生成
  • ax.imshow(data, cmap=cm): 作成したカラーマップを使ってデータを画像として表示
  • plt.colorbar(image): 色と数値の対応を示すカラーバーを追加
  • plt.savefig(): 図を「own_cmap.png」として保存(解像度100dpi、余白を最小化)

このコードは、データの値の大きさを色で直感的に理解できる可視化を実現しています。

RGB値を指定する方法

より詳細な制御が必要な場合は、RGB値を直接指定することができます。

このコードは、RGB値を使用してカスタムカラーマップを作成し、ランダムデータを可視化する例です。

RGB値でのカラーマップ定義

  • colorsリスト: RGB値をタプルで指定(各値は0.0〜1.0の範囲)
  • 青(0.0, 0.0, 1.0) → シアン(0.0, 1.0, 1.0) → 黄色(1.0, 1.0, 0.0) → 赤(1.0, 0.0, 0.0)の4色で構成

カラーマップの作成

  • LinearSegmentedColormap.from_list('custom', colors): RGB値のリストから「custom」という名前のカラーマップを生成
  • 指定した色の間を線形補間して滑らかなグラデーションを作成

RGB値を直接指定することで、色の詳細な制御が可能になり、データの特性に合わせた最適な可視化を実現できます。

高度なカラーマップの作成

色の位置を指定する

色の変化する位置を細かく制御したい場合は、位置情報を含むタプルのリストを使用します。

このコードは、カラーマップの色の変化する位置を細かく制御する方法を示しています。

色と位置の定義

  • colorsリスト: (位置, 色名)のタプルで構成され、位置は0.0〜1.0の範囲で指定
  • 0.0で濃い青、0.25で青、0.5で緑、0.75で黄色、1.0で赤と、5つのポイントで色を定義

データの分離

  • positions: リスト内包表記で各タプルから位置情報のみを抽出
  • color_list: 各タプルから色名のみを抽出

カラーマップの作成

  • zip(positions, color_list): 位置と色を再びペアにして結合
  • LinearSegmentedColormap.from_list(): 「custom_positioned」という名前で、指定した位置で色が変化するカラーマップを生成

この方法により、データの特定の範囲で色の変化を強調したり、特定の値で急激に色を変えたりすることが可能になります。等間隔でない位置指定により、データの特性に合わせた柔軟な可視化が実現できます。

カラーマップの登録と再利用

作成したカラーマップをmatplotlibに登録することで、文字列で指定して再利用できます。

このコードは、カスタムカラーマップを作成してmatplotlibに登録し、再利用可能にする方法を示しています。

ライブラリのインポート

  • import matplotlib as mpl: カラーマップを登録するためにmatplotlibのメインモジュールをインポート

カスタムカラーマップの作成

  • colors = ['purple', 'blue', 'green', 'yellow', 'orange', 'red']: 紫→青→緑→黄→オレンジ→赤の6色を定義
  • LinearSegmentedColormap.from_list('my_cmap', colors): 「my_cmap」という名前で、指定した色を線形補間するカラーマップを生成

カラーマップの登録

  • mpl.colormaps.register(cmap): 作成したカラーマップをmatplotlibに登録し、後から文字列名で呼び出せるようにする

カラーマップを登録することで、同じプログラム内の別の場所や、次回実行時にもcmap='my_cmap'として文字列で簡単に呼び出せるようになります。

上記コードで登録されたcmapを確認できます。

カラーマップの反転

既存のカラーマップを反転させることもできます。

このコードは、カラーマップの反転機能を使って、オリジナルと反転したカラーマップを並べて比較表示する例です。

カラーマップの反転

  • cmap_reversed = cmap.reversed(): 既存のカラーマップcmapを反転させた新しいカラーマップを作成します。色の順序が逆になります。

サブプロットの作成

  • fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)): 1行2列のサブプロットを作成し、横幅10インチ、縦幅4インチのサイズで表示領域を確保します。

ランダムデータの生成

  • data = np.random.rand(10, 10): 10×10のランダムな数値配列を生成し、両方のプロットで同じデータを使用します。

左側のプロット(オリジナル)

  • ax1.imshow(data, cmap=cmap): オリジナルのカラーマップでデータを表示
  • ax1.set_title('オリジナル'): タイトルを設定
  • plt.colorbar(ax1.images[0], ax=ax1): カラーバーを追加

右側のプロット(反転)

  • ax2.imshow(data, cmap=cmap_reversed): 反転したカラーマップでデータを表示
  • ax2.set_title('反転'): タイトルを設定
  • plt.colorbar(ax2.images[0], ax=ax2): カラーバーを追加

レイアウト調整と保存

  • plt.tight_layout(): サブプロット間の余白を自動調整
  • plt.savefig('own_cmap5.png', dpi=100, bbox_inches='tight'): 画像を保存

この方法により、カラーマップの反転がデータの見え方にどう影響するかを視覚的に比較できます。

まとめ

matplotlibで自作カラーマップを作成する主な方法は以下の通りです:

  • LinearSegmentedColormap.from_list()を使用した簡単な作成
  • RGB値を直接指定する方法
  • 位置情報を含めた詳細な制御

データの特性に合わせて適切なカラーマップを作成することで、より効果的なデータ可視化が可能になります。

コメント