matplotlibのデフォルト色を名前で指定する方法と色コードの整理

matplotlibのデフォルト色を名前で指定したグラフ

matplotlibのデフォルト色をグラフの描画色として指定したい場合が時々あります。
例えば、複数の系列を1枚のグラフに描画したあと、その中の一部だけを別の切り口で描画するときなどですね。

都度公式ドキュメントから色コードを書き写してもよいですが、流石に面倒だったのでコピペ用メモとして本記事を書いていたところ、名前でも指定できることが分かったのでまとめたいと思います。

名称で指定する方法

早速今回最良と思われる方法です。
端的に書くと、今描画しようとしている色の前に”tab:”をつけたものが名称になっています。
例えば、”tab:blue”や”tab:green”のような形式です。

具体例を見てみましょう。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots()
data = np.linspace(0,1,100)
ax.plot(data, np.sin(2*np.pi * data), color="tab:green", label="plot1")
ax.plot(data, np.sin(0.5 * np.pi + 2*np.pi * data), color="tab:orange", label="plot2")
ax.legend()
ax.grid()

描画結果はこちらです。
matplotlibのデフォルト色を名前で指定したグラフ

今回は一つ目のプロットに”tab:green”、二つ目のプロットに”tab:orange”を指定しています。
普段は青と水色の中間みたいな色(‘tab:blue’にあたります)が初めに描画されますが、このように指定することで好きな順に色を使うことができます。

名称の背景についてですが、現在のデフォルトカラーは共にTablearuが起源にある、Vegaとd3で使われている10カテゴリーのカラーパレットに由来しています。(参照: https://matplotlib.org/3.1.0/users/dflt_style_changes.html)
そのため、このことが何かしら影響しているのではないかと推測されます。 (ここは完全に筆者の憶測です。)

色の整理

色を表形式で整理します。公式ドキュメントで確認できるほか、後述の方法でmatplot内で名称とカラーコードの対応関係を確認することができます。

インデックス名称カラーコード
0tab:blue#1f77b4
1オレンジtab:orange#ff7f0e
2tab:green#2ca02c
3tab:red#d62728
4tab:purple#9467bd
5tab:brown#8c564b
6ピンクtab:pink#e377c2
7tab:gray#7f7f7f
8オリーブtab:olive#bcbd22
9水色tab:cyan#17becf

カラーコードと実際の色の関係も公式の図を参考にして作成してみました。
コードは末尾に記載します。(後述するmatplotlib内部の情報を使用しています)
[参考(公式)] https://matplotlib.org/3.1.0/users/dflt_style_changes.html
matplotlibデフォルト色の名称、コード、色の対応

matplotlibから呼び出す方法

後回しになってしまいましたが、matplotlib内で保持している情報を利用する方法です。

from matplotlib import colors as mcolors
mcolors.TABLEAU_COLORS # jupyterでない場合はprint分などを適宜仕様のこと

出力結果はこちらです。

OrderedDict([('tab:blue', '#1f77b4'),
    ('tab:orange', '#ff7f0e'),
    ('tab:green', '#2ca02c'),
    ('tab:red', '#d62728'),
    ('tab:purple', '#9467bd'),
    ('tab:brown', '#8c564b'),
    ('tab:pink', '#e377c2'),
    ('tab:gray', '#7f7f7f'),
    ('tab:olive', '#bcbd22'),
    ('tab:cyan', '#17becf')])

これはこれで覚えていれば非常に役に立つと思います。
ただ、今回の目的だと”tab:~”で目的の色が出せることを覚えていれば十分でしょう。
なお、mcolorsでいけそうだなと思ったきっかけはこちらのページでした。
https://matplotlib.org/2.0.2/examples/color/named_colors.html

まとめ

本題はここまでなので、一旦ここでまとめたいと思います。
今回はmatplotlibのデフォルト色を名称で指定する方法と色コードを整理しました。
要は”tab:blue”のように、”tab:~”で指定してあげればいいというのが結論です。
筆者が知らないだけで実は知られている方法だったりするのかもしれませんが…

色と番号の対応グラフのコード

本文中で色と番号の対応を作成したコードはこちらです。
公式ドキュメントの図やコードの方がかっこいいので、そちらをご参照いただいた方がいいかもしれません。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from matplotlib import rcParams
rcParams['font.family'] = 'monospace'
from matplotlib import colors as mcolors

fig, ax = plt.subplots()
data = np.linspace(0, 2, 10)
for i, (cname, color) in enumerate(mcolors.TABLEAU_COLORS.items()):
    plot_data = np.ones(len(data)) * -0.2*i
    ax.plot(data, plot_data, color=color, label=color)
    ax.annotate("{:01d}: {:<10s} {:<10s}".format(i, cname, color), (-1.8, -0.2 * i-0.04 ), color=color, fontsize=11)
    ax.set_xlim(-2, 2)
    ax.axis("off")

参考資料

https://matplotlib.org/3.1.0/users/dflt_style_changes.html
https://matplotlib.org/2.0.2/examples/color/named_colors.html