LoginSignup
21
11

More than 3 years have passed since last update.

matplotlibのcolormapにブランドイメージカラーを適応してみよう!

Posted at

はじめに

matplotlibでグラフを描画する際、皆さんはどんなカラーを利用していますか?
matplotlibにはデフォルトで綺麗なcolormapが用意されていますが、
プレゼンのために異なるカラーバリエーションを使いたいとか資料とグラフの
カラーイメージを統一したいとか思ったことはないでしょうか。

本記事では、matplotlibのcolormapへのブランドカラーイメージの
適応にチャレンジしてみます!

利用するクラス

matplotlibには独自でcolormapを作成するためのクラスが2種類用意されています。

1. matplotlib.colors.ListedColormap

colormapを構成するカラーコードをlistまたはarrayで設定して作成します。
作成されるcolormapの構成色は離散的に変化します。

【利用例】

import matplotlib as mpl
color_list = ['red', 'green', 'blue']
cmap = mpl.colors.ListedColormap(color_list)

【作成されるcolormap】
image.png

2. matplotlib.colors.LinearSegmentedColormap

colormapを構成するRGB情報を規定のデータ形式で設定して作成します。
作成されるcolormapの構成色は連続的に変化します。

【利用例】

import matplotlib as mpl

#########################################################################
# 
# 【構成色の設定】
#
# 構成色のデータは,
# [
#  (x_0, y_0, z_0)
#  ...
#  (x_i, y_i, z_i)
# ]
# の構造をとり、RGB値を0~1の値で設定する。
# colormapの構成色は z_0 -> y_1, z_1 -> y_2, ... の順で連続的に変化する。
# 下記の設定だと red -> green, green -> blue の変化を意味する。
#
#########################################################################

segment_data = {    
    'red':
        [
            (0.0,   0/255, 255/255),
            (0.5,   0/255,   0/255),
            (1.0,   0/255,   0/255),
        ],
    'green':
        [
            (0.0,   0/255,   0/255),
            (0.5, 128/255, 128/255),
            (1.0,   0/255,   0/255),
        ],
    'blue':
        [
            (0.0,   0/255,   0/255),
            (0.5,   0/255,   0/255),
            (1.0, 255/255,   0/255),
        ],
}
cmap = mpl.colors.LinearSegmentedColormap('colormap_name', segment_data)

上記の実装だと構成色の設定が直観的でなくちょっと大変ですが、
matplotlib.colors.LinearSegmentedColormap.from_listを利用すると
カラーコードのlistで作成できます。

# listで作成する場合
import matplotlib as mpl
color_list = ['red', 'green', 'blue']
cmap = mpl.colors.LinearSegmentedColormap.from_list('colormap_name', color_list)

【作成されるcolormap】
image.png

実装

実際に自作colormapを作成する際は、matplotlib.cm.register_cmapで作成したcolormapを
登録しておくと便利です。

import matplotlib.pyplot as plt
import matplotlib as mpl

def set_custom_colormap(name: str, color_list: list):

    """
    color_listをcolormap化し、nameでmatplotlibに登録する。
    colormapは離散型と連続型の2パターン及び逆順で4パターン登録される。
    """

    cmap_dis = mpl.colors.ListedColormap(color_list)
    cmap_seq = mpl.colors.LinearSegmentedColormap.from_list(name, color_list)

    plt.register_cmap(name + '_dis', cmap_dis)
    plt.register_cmap(name + '_dis_r', cmap_dis.reversed())
    plt.register_cmap(name + '_seq', cmap_seq)
    plt.register_cmap(name + '_seq_r', cmap_seq.reversed())

    return

後は自分の設定したい色のカラーコードを調べればOKです。

SENSY colormap

COLORMAP_SOURCE_DICT = {

    # 単色グラデーション
    'sensy_single_1': ['#FFFFFF', '#F4458C'],
    'sensy_single_2': ['#FFFFFF', '#FF6B9A'],
    'sensy_single_3': ['#FFFFFF', '#FA8EB5'],
    'sensy_single_4': ['#FFFFFF', '#A7C0FD'],
    'sensy_single_5': ['#FFFFFF', '#5073ED'],
    'sensy_single_6': ['#FFFFFF', '#4E6FF0'],
    'sensy_single_7': ['#FFFFFF', '#4B4C80'],
    'sensy_single_8': ['#FFFFFF', '#2B2C4B'],

    # 多色グラデーション
    'sensy': ['#FF6B9A', '#4E6FF0'],
    'sensy_diverge': ['#FF6B9A', '#FFFFFF', '#4E6FF0'],
    'sensy_accent': ['#5073ED', '#FA8EB5', '#A7C0FD', '#2B2C4B', '#F4458C', '#4B4C80'],

}

# colormap作成&登録
for name, color_list in COLORMAP_SOURCE_DICT.items():
    set_custom_colormap(name, color_list)


# 初期設定 ###################

# 初期colormap
DEFAULT_COLORMAP = 'sensy_accent_dis'

# matplotlibを利用する場合
mpl.rcParams['image.cmap'] = DEFAULT_COLORMAP

# seabornを利用する場合
import seaborn as sns
sns.set()
sns.set_palette(DEFAULT_COLORMAP)


【colormapイメージ】
image.png
image.png
 ※ colormap名のsuffixが'seq'は連続型、'dis'は離散型になります。
  また末尾に'_r'をつけると色の順序が逆転します。

【適応イメージ】

グラフの種類 イメージ
棒グラフ image.png
散布図 image.png
等高線 image.png
ヒートマップ image.png

※ グラフ描画に利用したデータとコードは Official seaborn tutorial を参考にしています。

おわりに

利用したいカラーコードが分かるのであれば、簡単に自作のcolormapを作成することができました。
普段利用しているグラフのカラーバリエーションに物足りなさや統一感のなさを感じてきたら、
自分で綺麗なcolormapを作ってみるのも楽しいかもしれませんね。

参考

21
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
11