[Python][Matplotlib] 色の形式を変換する

環境
Windows10 + Python 3.7.6 + Matplotlib 3.1.1

maptlotlib.colorsモジュールには、色を表現する変数を変換する関数が用意されており、なかなか便利そうだったのでまとめてみた。

matplotlib.org

HSV(0~1)からRGB(0~1)へ

hsv_to_rgb(hsv)

  • 引数
    • hsv : HSVに対応する長さ3のシーケンス
  • 返り値
    • rgb : RGBに対応する長さ3のシーケンス

import matplotlib.colors as mcolors

color_hsv = (0, 1, 1)
color_rgb = mcolors.hsv_to_rgb(color_hsv)
print(color_rgb)
[1. 0. 0.]

RGB(0~1)からHSV(0~1)へ

rgb_to_hsv(rgb)

  • 引数
    • rgb : RGBに対応する長さ3のシーケンス
  • 返り値
    • hsv : HSVに対応する長さ3のシーケンス

import matplotlib.colors as mcolors

color_rgb = (1, 0, 0)
color_hsv = mcolors.rgb_to_hsv(color_rgb)
print(color_hsv)
[0. 1. 1.]

RGB(0~1)から16進数へ

to_hex(c[, keep_alpha])

  • 引数
    • c : RGBに対応する長さ3のシーケンスなど
  • 返り値
    • hex : 16進数の文字列

import matplotlib.colors as mcolors

color_rgb = (1, 0, 0)
color_hex = mcolors.to_hex(color_rgb)
print(color_hex)
#ff0000

16進数からRGB(0~1)へ

to_rgb(c)

  • 引数
    • c : 16進数の文字列など
  • 返り値
    • rgb : RGBに対応する長さ3のシーケンス

import matplotlib.colors as mcolors

color_hex = '#ff0000'
color_rgb = mcolors.to_rgb(color_hex)
print(color_rgb)
(1.0, 0.0, 0.0)

Matplotlibで名前の付いている色の一覧の取得

get_named_colors_mapping()

  • 引数:なし
  • 返り値
    • matplotlib.colors._ColorMapping:色の名前と16進数表記が対応づけられた辞書のようなオブジェクト

import matplotlib.colors as mcolors

named_colors = mcolors.get_named_colors_mapping()
print(named_colors['red'])
print(named_colors['xkcd:rust brown'])
#FF0000
#8b3103

メモ:matplotlib.colors._ColorMappingについて

このオブジェクトについて公式ドキュメントで説明を見つけられなかったので、実装を見に行ったところ、次のようなコードを見つけた。ほとんど組み込みの辞書と変わらないオブジェクトと思われる。

class _ColorMapping(dict):
    def __init__(self, mapping):
        super().__init__(mapping)
        self.cache = {}

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.cache.clear()

    def __delitem__(self, key):
        super().__delitem__(key)
        self.cache.clear()

matplotlib.org

ちなみにget_named_colors_mapping()は次のように実装されていた。_colors_full_map変数を返すだけ。_colors_full_map変数ははじめは組み込みの辞書だが、最後に_ColorMappingオブジェクトに変換されている。

_colors_full_map = {}
# Set by reverse priority order.
_colors_full_map.update(XKCD_COLORS)
_colors_full_map.update({k.replace('grey', 'gray'): v
                         for k, v in XKCD_COLORS.items()
                         if 'grey' in k})
_colors_full_map.update(CSS4_COLORS)
_colors_full_map.update(TABLEAU_COLORS)
_colors_full_map.update({k.replace('gray', 'grey'): v
                         for k, v in TABLEAU_COLORS.items()
                         if 'gray' in k})
_colors_full_map.update(BASE_COLORS)
_colors_full_map = _ColorMapping(_colors_full_map)


def get_named_colors_mapping():
    """Return the global mapping of names to named colors."""
    return _colors_full_map

参考リンク

matplotlib.org