【matplotlib】散布図でそれぞれの点で違う色を使う方法[Python]

  • URLをコピーしました!
目次

matplotlib

前回、PythonのNumPyで2つのリスト間で1つのリストを条件の判定、その判定結果を使ってもう1つのリストの要素の書き換えをする方法(+Pandasでのやり方)を紹介しました。

今回はmatplotlibの散布図でそれぞれの点で違う色を使う方法を紹介します。

例えばこんな感じで散布図があったとします。

import matplotlib.pyplot as plt
import random

order = range(20)
x_list = [random.randrange(10) for _ in order]
y_list = [random.randrange(10) for _ in order]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list)

plt.show()

実行結果

散布図なのでXの値とYの値は独立している場合があり、それをプロットすると点の順番の情報がなくなってしまいます。

そのためそれぞれの点に異なる色(連続的に変化する色)をつけて、順番をわかるようにしたかったのが今回の発端です。

それでは始めていきましょう。

cとcmap

それぞれの点に異なる色をつけるには「plt.scatter()」のオプションとして「c」と「cmap」を追加します。

cには色のリストを指定することができるのですが、数値を与えるとcmapと連動してそれぞれの点に与えた数値に対応する色をつけることができるようになります。

cmapはカラーマップの指定です。

使えるカラーマップはこちらを参照にしてください。

ということでプログラムはこんな感じになります。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

order = range(20)
x_list = [random.randrange(10) for _ in order]
y_list = [random.randrange(10) for _ in order]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, c=order, cmap=cm.rainbow)

plt.show()

実行結果

これで「order」の数値(つまり点の順番)に対してレインボーのカラーマップでそれぞれの点に色をつけることができました。

ちなみにcmapは指定しなくてもデフォルトで「viridis」が指定されているため、「c」だけ指定しても色分けはできます。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

order = range(20)
x_list = [random.randrange(10) for _ in order]
y_list = [random.randrange(10) for _ in order]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, c=order)

plt.show()

実行結果

逆に「c」を指定せずに、「cmap」だけ指定するとエラーとなるので注意です。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

order = range(20)
x_list = [random.randrange(10) for _ in order]
y_list = [random.randrange(10) for _ in order]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, cmap=cm.rainbow)

plt.show()

実行結果
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_12657/
3745385734.py:12: UserWarning: No data for colormapping provided 
via 'c'. Parameters 'cmap' will be ignored
  plt.scatter(x_list, y_list, cmap=cm.rainbow)

ちなみに「c」に指定する値は何も順番だけではなく、例えば第3軸を指定すれば、三次元データとプロットするという使い方も可能です。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

order = range(20)
x_list = [random.randrange(10) for _ in order]
y_list = [random.randrange(10) for _ in order]
z_list = [random.randrange(10)*2 for x_val in x_list]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, c=z_list, cmap=cm.rainbow)

plt.colorbar()

plt.show()

実行結果

またこの「c」と「cmap」で点をそれぞれ異なる色を使うことができるのは「plt.scatter」だけのようです。

とりあえず「plt.plot()」と「plt.bar()」はやってみたのですが、エラーとなってしまいました。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

x_list = range(20)
y_list = [random.randrange(10) for _ in x_list]
z_list = [x_val*2 for x_val in x_list]

fig = plt.figure()
plt.clf()

plt.plot(x_list, y_list, c=z_list, cmap=cm.rainbow)

plt.colorbar()

plt.show()

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[10], line 12
      9 fig = plt.figure()
     10 plt.clf()
---> 12 plt.plot(x_list, y_list, c=z_list, cmap=cm.rainbow)
     14 plt.colorbar()
     16 plt.show()

(中略)

ValueError: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 
30, 32, 34, 36, 38] is not a valid value for color
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

x_list = range(20)
y_list = [random.randrange(10) for _ in x_list]
z_list = [x_val*2 for x_val in x_list]

fig = plt.figure()
plt.clf()

plt.bar(x_list, y_list, c=z_list, cmap=cm.rainbow)

plt.colorbar()

plt.show()

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[9], line 12
      9 fig = plt.figure()
     10 plt.clf()
---> 12 plt.bar(x_list, y_list, c=z_list, cmap=cm.rainbow)
     14 plt.colorbar()
     16 plt.show()

(中略)

AttributeError: Rectangle.set() got an unexpected keyword argument 'c'

次回はmatplotlibのカラーバーのラベル表示に関して紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次