#matplotlibでの図形の色付け
matplotlibで複数図形を描画したとき、
一つ一つ"red"とか”blue"とか指定しない方法を調べてみた。
##はじめにmatplotlib fillを使った図形の描画
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
#図形データ作成
#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])
#四角形をN個用意
N=3
#列数
cn=10
xl=list()
yl=list()
for i in range(N):
xl.append(x+1.2*(i%cn))
yl.append(y-1.2*int(i/cn))
#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')
poly = plt.fill(xl[0],yl[0],fc="red")#ここで"red"とかいちいち書きたくない場合はどうするか
poly = plt.fill(xl[1],yl[1],fc="green")
poly = plt.fill(xl[2],yl[2],fc="blue")
plt.show()
上記のように、3種類の図形くらいならいいが、図形の数に合わせていちいち何色を使うか考えたり、"red","green","blue"と指定していられない。
知らないだけできっといい方法があるはず・・・
##使用する図形が10個以下なら、tab10を使うのが綺麗
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])
#四角形をN個用意
N=10
#列数
cn=10
xl=list()
yl=list()
for i in range(N):
xl.append(x+1.2*(i%cn))
yl.append(y-1.2*int(i/cn))
cmap = plt.get_cmap("tab10") #ここでカラーマップの種類を指定
print(cmap)
#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')
for xx,yy,cc in zip(xl,yl,range(N)):
poly = plt.fill(xx,yy,fc=cmap(cc))
matplotlibのpyplotの中には決まったカラーマップが準備されており、
それをget_cmap関数で呼び出すことができる。
カラーマップの種類として、tab10の他に、Set1が使い易そう。
詳細は以下の記事に詳しく書いてあります。
matplotlibでcolor cycleのN番目の色を指定するいくつかの方法
どういうマップがあるかはリファレンスを参照。
color example code: colormaps_reference.py
##10個以上でも綺麗に出したい場合はどうする
###自分でカラーマップを作成してみる
10個以上必要な機会はないかもしれないが、どうしたらいいか考えてみた。
※前述のtab20を使うのも手ではあるが、色合いが気に入らない。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import colorsys
#ベースの四角形
x=np.array([-0.5,0.5,0.5,-0.5])
y=np.array([0,0,1,1])
#四角形をN個用意
N=20
#列数
cn=5
xl=list()
yl=list()
for i in range(N):
xl.append(x+1.2*(i%cn))
yl.append(y-1.2*int(i/cn))
#カラーマップ作製==========================
hexs=list()
for i in range(N):
rgb=colorsys.hsv_to_rgb(i/N, 1, 1)#(h,s,v)を(r,g,b)に変換
hexs.append(matplotlib.colors.rgb2hex(rgb))#(r,g,b)を16進数のカラーコードに変換
#作図
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axes().set_aspect('equal')
for xx,yy,cc in zip(xl,yl,hexs):
poly = plt.fill(xx,yy,fc=cc)
plt.show()
###色相を単純等分割する
色は赤、緑、青の3成分がどれくらい混ざっているかで表現するRGBが馴染み深いが、色相、再度、明度で表現するHSVという表現がある。
色相を等分割することで、異なる色を持つ任意の大きさのカラーマップを作ってみる。
HSVについてわかりやすい解説は以下を参照
HSV色空間
##まとめ
基本はtab10を使って入れば問題なさそう。
自作のカラーマップはぱっと見綺麗に見えて良いが、
緑色は実際に使うとどれが若い番号の図か区別できないと思う。
もっと良い方法があれば編集したい。
(どうやったら見やすい配色ができるか調べていたら、色のユニバーサルデザインとかいうのがあるらしい。)