matplotlib
前回、matplotlibの標準の色を手動で設定する方法を解説しました。
今回はmatplotlibでカラーマップを使って複数のグラフの色を自動(グラデーションなど)で被らないように設定する方法を解説していきます。
まずは20個のグラフの色を自動で設定した場合を見てみましょう。
import matplotlib.pyplot as plt
num_points = 10
num_graph = 20
x = range(num_points)
y_list = []
for i in range(num_graph):
y_list.append([i for _ in range(num_points)])
fig = plt.figure()
plt.clf()
for y in y_list:
plt.plot(x, y)
plt.show()
実行結果
「num_points」は1つのグラフ上の点の数、「num_graph」は作成するグラフの数です。
出力されたグラフの色をみてみると下から10本までは異なる色になっていますが、11本目からは1本目から10本目までのグラフの色と同じ、つまり繰り返しになっています。
これでは1本目と11本目の区別をつけることができません。
そういった場合に今回解説するカラーマップから色が被らないように自動で設定する方法は重宝します。
それでは始めていきましょう。
カラーマップから色を自動で設定する方法
まずカラーマップに関してですが、カラーマップとは値と色をまとめたもので、値を指定すると色が決まるという関係があります。
どういうものがあるかはこちらのサイトを見てもらう方がいいでしょう。
いくつもグラデーションの帯になっているものがありますが、それぞれが名前のついたカラーマップです。
このカラーマップを使って、複数のグラフそれぞれがカラーマップのどの位置の色を使うか指定してあげます。
そうすることで全てのグラフに対して色の被りなく色を設定できるというわけです。
ただ気をつけることは「Cyclic colormaps」や「Qualitative colormaps」、一部の「Miscellaneous colormaps」のように同じ色が繰り返されているカラーマップの場合は色が被ることがあるのでご注意ください。
今回はMiscellaneous colormapの「jet」を使います。
先ほどと同じ20本のグラフに対して「jet」のカラーマップを使って、それぞれ異なる色を指定してみます。
import matplotlib.pyplot as plt
import matplotlib.cm as cm
num_points = 10
num_graph = 20
x = range(num_points)
y_list = []
for i in range(num_graph):
y_list.append([i for _ in range(num_points)])
fig = plt.figure()
plt.clf()
for i, y in enumerate(y_list):
plt.plot(x, y, color=cm.jet(i/len(y_list)))
plt.show()
実行結果
必要なのはカラーマップのライブラリのインポート(「import matplotlib.cm as cm」)と色の位置の指定です。
色の位置の指定はこの部分。
for i, y in enumerate(y_list):
plt.plot(x, y, color=cm.jet(i/len(y_list)))
「cm.jet(「色の場所」)」で特定の色を取得しています。
「色の場所」とはカラーマップの帯の左端を0 、右端を1とした時に取得したい色の場所はどこかということです。
つまり真ん中なら「0.5」となるわけです。
ただ上記の例で20本のグラフがあります。
これを一つ一つ指定するのはかなり手間ですし、さらにグラフの本数が増えた場合は対応できません。
ということでenumerate関数を使って、何番目のグラフか(変数i)を取得し、グラフの本数(len(y_list))で割ることで色の場所の数値を作成しています。
ちなみにenumerate関数に関してはこちらの記事で解説していますので、よかったらどうぞ。
なのでグラフが何本あろうが、必ず1本目はカラーマップの左端の色、最後のグラフは右端の色になります。
途中のグラフは分割数(グラフの総数)に応じて色が決定されるということです。
先ほどの例ではグラフの数は20本でしたが、このやり方をしておくともっと増えても対応できます。
ちなみに100本のグラフの例はこちらです。
import matplotlib.pyplot as plt
import matplotlib.cm as cm
num_points = 10
num_graph = 100
x = range(num_points)
y_list = []
for i in range(num_graph):
y_list.append([i for _ in range(num_points)])
fig = plt.figure()
plt.clf()
for i, y in enumerate(y_list):
plt.plot(x, y, color=cm.jet(i/len(y_list)))
plt.show()
実行結果
この方法のデメリットとしては、グラフの番目が近いものほど、近い色となってしまうので見分けがつきにくくなるということがあります。
なのでその場合はどのカラーマップを使うのかしっかりと選定する必要があります。
カラーマップを使ってグラフの色を指定する方法は絶対に知っておいて損はないので、頭の片隅にでも入れておいてもらえるといいかと思います。
次回はmatplotlibで3軸グラフの作成方法を解説していきます。
ではでは今回はこんな感じで。
コメント