1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Matplotlibで c, m, y と cyan, magenta, yellow は実は違う色なんです

Last updated at Posted at 2025-02-13

はじめに

Matplotlibでグラフを描くとき、rkといった略語で色を指定することがよくあります。多くの略語はフルネームと同じ色を指しますが、ccyanmmagenta、そしてyyellowは実は異なる色です。この記事では、これらの色の違いを解説し、なぜこのような差が生じるのかを一緒に見ていきたいと思います。

略語とフルネームの色の違い

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()

左側が略語、右側がフルネームの結果です。

image.png

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で色を指定する際、略語とフルネームで異なる色が使われることがあります。特にccyanmmagentayyellowは見た目が異なります。思わぬ色の違いを避けるためには、常にフルネームで色を指定するか、mcolors.to_rgb()で事前に確認することをおすすめします。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?