LoginSignup
1
5

More than 3 years have passed since last update.

pythonで描画した図形の色付けに時間を使わないために

Posted at

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

cap1.PNG

上記のように、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))


cap2.PNG

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

cap3.PNG

色相を単純等分割する

色は赤、緑、青の3成分がどれくらい混ざっているかで表現するRGBが馴染み深いが、色相、再度、明度で表現するHSVという表現がある。
色相を等分割することで、異なる色を持つ任意の大きさのカラーマップを作ってみる。

HSVについてわかりやすい解説は以下を参照
HSV色空間

まとめ

基本はtab10を使って入れば問題なさそう。
自作のカラーマップはぱっと見綺麗に見えて良いが、
緑色は実際に使うとどれが若い番号の図か区別できないと思う。

もっと良い方法があれば編集したい。

(どうやったら見やすい配色ができるか調べていたら、色のユニバーサルデザインとかいうのがあるらしい。)

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