見出し画像

高校向けPython入門(9)実習課題例:色の表現

今回はプログラムコードの部分が結構多いです。適当に読み飛ばして結構。

7.1.3 色の表現

 コンピュータでよく使う色の表現が,RGB 各 8 ビットを使った 24 ビットカラーだ。情報の教科書には Web セーフカラーなどの色サンプルが載っている。SVG で使うのもこの色コードだ。そこで,RGB をそれぞれ決めて混色の結果を見るものを作ろう。次のようなものだ。

画像1

 色塗りをした長方形を描くには,matplotlib.patches の Rectangle(位置,横幅,縦幅,色) を使う。たとえば,描画ウィンドウを 800x400 のサイズにして,x 軸の範囲を 0 ≦ 𝑥 ≦ 8, 0 ≦ 𝑦 ≦ 4 として,長方形の位置と大きさを指定して描く。その上方に,カラーコードを表示する。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
plt.figure(figsize=(8,4))
ax = plt.axes()
plt.axis([0,8,0,4])
rgbcode = "#ffcccc"
rcode = "#ff0000"
gcode = "#00cc00"
bcode = "#0000cc"
r = patches.Rectangle((1,2),1.9,1,color = rcode)
g = patches.Rectangle((3,2),1.9,1,color = gcode)
b = patches.Rectangle((5,2),1.9,1,color = bcode)
rgb = patches.Rectangle((1,0.5),5.9,1,color = rgbcode)
ax.add_patch(r)
ax.add_patch(g)
ax.add_patch(b)
ax.add_patch(rgb)
plt.text(1.4,3.2,rcode,size = 16)
plt.text(3.4,3.2,gcode,size = 16)
plt.text(5.4,3.2,bcode,size = 16)
plt.text(3.4,1.6,rgbcode,size = 16)
plt.show()


同じような行が続くので,コピー・アンドペーストを使えばよいが,打ち間違えたものを コピーすると修正が大変だ。このようなものを書くときは,まず一つだけ書いて動作を確か め,うまく動けばコピーして変更箇所だけ書き換えるようにする。テキストには説明のため にコメント文も書くだろうが,実際にはコメント文は打たなくてよいので,次のようになる。

   import matplotlib.pyplot as plt
   import matplotlib.patches as patches
   plt.figure(figsize=(8,4))
   ax = plt.axes()
   plt.axis([0,8,0,4])
   rcode = "#ff0000"
   r = patches.Rectangle((1,2),1.9,1,color = rcode)
   ax.add_patch(r)
   plt.text(1.4,3.2,rcode,size = 16)
   plt.show()

 これで動けば,6 行目から 9 行目までの 4 行分をコピーして,gcode, bcode, rgbcode を追加していけばよい。
 あるいは,全部書いたものを渡して,RGB コードだけを変えさせるということも考えられ る。その場合は,RGB コードだけを変えれば各色のコードをそこから生成するようにしたい。文字列の処理を使って,次のようにすればよい。また,目盛は不要なので ticks() の引数に空リストを与えて非表示にする。変更箇所は 6 行目から 9 行目までで,次のように書きかえる。

plt.xticks([])      # 目盛を非表示にする 
plt.yticks([])
rgbcode = "#ccffee" # ここだけを変えれば色が変わる 
rcode = "#" + rgbcode[1:3] + "0000"
gcode = "#00" + rgbcode[3:5] + "00"
bcode = "#0000" + rgbcode[5:]

画像2

 各色のコードを見ると, cc は ff より暗いが,単独で示すとその違いがわかりにくい。そ こで,ff のものを上に追加して比べてみるのもよいだろう。しかしまた 3 色分 9 行を追加す るのも面倒だ。こういうときに,ユーザー定義関数が効力を発揮する。
 必要なのは,表示位置と幅と高さ,そして RGB コードだ。これらを引数にして表示する関数を作ればよい。これを colorsample(x,y,w,h,code) としよう。

import matplotlib.pyplot as plt
import matplotlib.patches as patches
plt.figure(figsize=(8,6))
ax = plt.axes()
plt.axis([0,8,0,6])
RGB = "#ccaa88" # ここだけ変える
def colorsample(x,y,w,h,code):
    c = patches.Rectangle((x,y),w,h,color = code)
    ax.add_patch(c)
    plt.text(x + w/2 - 0.5,y + h + 0.1,code,size = 16)
plt.xticks([])
plt.yticks([])
r = "#" + RGB[1:3] + "0000"
g = "#00" + RGB[3:5] + "00"
b = "#0000" + RGB[5:]
colorsample(1,4.1,1.9,1,"#ff0000")
colorsample(3,4.1,1.9,1,"#00ff00")
colorsample(5,4.1,1.9,1,"#0000ff")
colorsample(1,2.3,1.9,1,r)
colorsample(3,2.3,1.9,1,g)
colorsample(5,2.3,1.9,1,b)
colorsample(1,0.5,5.9,1,RGB)
plt.show()

画像3

 RGB カラーコードと混色した色の変化を学ぶのが主目的ならば,これを渡して RGB の行だけを変えさせればよい。プログラミング実習を兼ねるなら,説明をしたのち打ち込ませてもいいだろう。演習にするなら,関数を呼び出すところだけを空欄にしてひな形とし,colorsample() を使って色見本の配置をさせるということも考えられる。その際,自由に並べさせるというのもあるだろうし,見本のサイズを変えてもよい。学習の進行状況や生徒の状況によっていろいろな応用が考えられる。