はじめに
Matplotlibでグラフを描くとき、r
やk
といった略語で色を指定することがよくあります。多くの略語はフルネームと同じ色を指しますが、c
とcyan
、m
とmagenta
、そしてy
とyellow
は実は異なる色です。この記事では、これらの色の違いを解説し、なぜこのような差が生じるのかを一緒に見ていきたいと思います。
略語とフルネームの色の違い
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
colors_short = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']
colors_full = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'white']
fig, ax = plt.subplots(figsize=(8, 4))
# 左側:略語の色
for i, short in enumerate(colors_short):
ax.barh(i, 1, color=short, label=f'{short}')
# 右側:フルネームの色
ax2 = ax.twinx()
for i, full in enumerate(colors_full):
ax2.barh(i, 0.5, left=0.5, color=full, label=f'{full}')
# y軸設定
ax.set_yticks(range(len(colors_short)))
ax.set_yticklabels(colors_short)
ax2.set_yticks(range(len(colors_full)))
ax2.set_yticklabels(colors_full)
# y軸を反転
ax.invert_yaxis()
ax2.invert_yaxis()
# 不要な要素を削除
ax.set_xticks([])
ax2.set_xticks([])
ax.xaxis.set_visible(False)
ax2.xaxis.set_visible(False)
ax.set_xlim(0, 1)
plt.title('Color Comparison in Matplotlib: Short vs Full Name')
plt.savefig('short_vs_full.png')
plt.show()
左側が略語、右側がフルネームの結果です。
cyan、magenta、yellowの色が少し違うことがわかります。
なぜ色が違うのか?
Matplotlibでは、c
, m
, y
といった略語は Base colors として定義されています。
一方、cyan
, magenta
, yellow
はHTML/CSS標準の色に基づいているため、わずかな色の差が生じます。
略語とフルネームを間違えないために
-
常にフルネームで色を指定する
plt.plot(x, y, color='cyan') # 安定して同じ色を使える
-
事前に
mcolors.to_rgb()
で確認するimport matplotlib.colors as mcolors print(mcolors.to_rgb('c'))
略語とフルネームのRGB値
略語 (フルネーム) | 略語のRGB値 | フルネームのRGB値 | 同じ色か? |
---|---|---|---|
b (blue) | (0.0, 0.0, 1.0) | (0.0, 0.0, 1.0) | True |
g (green) | (0.0, 0.5, 0.0) | (0.0, 0.5019607843137255, 0.0) | False |
r (red) | (1.0, 0.0, 0.0) | (1.0, 0.0, 0.0) | True |
c (cyan) | (0.0, 0.75, 0.75) | (0.0, 1.0, 1.0) | False |
m (magenta) | (0.75, 0.0, 0.75) | (1.0, 0.0, 1.0) | False |
y (yellow) | (0.75, 0.75, 0.0) | (1.0, 1.0, 0.0) | False |
k (black) | (0.0, 0.0, 0.0) | (0.0, 0.0, 0.0) | True |
w (white) | (1.0, 1.0, 1.0) | (1.0, 1.0, 1.0) | True |
補足:他の色はどうなのか?
補足として、b(blue)
やr(red)
などはフルネームと略語で同じ色ですが、g(green)
には微妙な違いがあります。
print(mcolors.to_rgb('green')) # (0.0, 0.5019607843137255, 0.0)
print(mcolors.to_rgb('g')) # (0.0, 0.5, 0.0)
-
green
はHTML/CSSで標準的に使われる#008000
を基準にしています。この#008000
は(R=0, G=128, B=0)で表され、RGB値は128/255 ≈ 0.50196になります。 - 一方で
g
はMatplotlib独自の簡略指定で、0.5
とシンプルに定義されています。
つまり、HTML基準のgreen
と、Matplotlibのg
ではスケールの扱い方が異なるため、わずかに数値が異なります。
まとめ
Matplotlibで色を指定する際、略語とフルネームで異なる色が使われることがあります。特にc
とcyan
、m
とmagenta
、y
とyellow
は見た目が異なります。思わぬ色の違いを避けるためには、常にフルネームで色を指定するか、mcolors.to_rgb()
で事前に確認することをおすすめします。