gnuplot : rgbcolor variableによる各プロット点の配色について(RGB値についてなど)
はじめに
今回の話は、データファイルの各ポイント点にそれぞれ個別の色を配色する方法(rgbcolor variable)についての解説になります。それと合わせて、始めにgnuplotの色を扱う時の方法について簡単な説明も付け加えていくことにします。gnuplotでの色表現について
gnuplotでプロット点、関数の線、バックグラウンドなどに色を指定する時、複数の方法を用いることが出来ます。簡単に説明すると- 各色に割り当てられている番号(出力端末に依存)で指定する方法
- 色名(redやblueなど)で指定する方法
- RGBについて各色を2桁の16進数で表した文字列で指定する方法
- 上記のものを10進数で表したもので指定する方法
- 透明度も合わせて指定する方法
rgbcolor variableについて
上で説明したように色を指定する方法は各種ありますが、その中で自由度が高いものとして rgbcolor variable という指定方法があります。これは色については10進数の数値で指定され、その数値はデータファイルの列から取得するというものです。(※マニュアルを読むと10進数以外の指定方法もあるように読めるのですが、詳細は調べ切れていません)
(追記 : 2019年5月13日 - 16進数での指定方法 gnuplot : RGBでの色指定で16進数による指定を行う方法(数字の頭に"0x"を付ける))
rgbcolor variableを使った一例 |
使い方としては "using" でプロットに用いる列を指定するとき、最後に色を表す数値を指定する形となります。
二次元プロットの場合、"using" で三列目を追加して指定することになります。
例 : plot test01.dat using 1:2:3 with points lc rgbcolor variable
同様に三次元プロットでは四列目を追加して指定することになります。
では実際に rgbcolor variable で色を指定する場合に、データファイルにはどのような値が記述されていればいいでしょう?これを把握するには24bitで表記するRGBの値を理解しておく必要があります。以下にそれについての簡単な説明をしていきます。
RGBを24 bitで表現、とは?
bit数
RGBではRed、Green、Blueの三つの原色を組み合わせて様々な色を表現します。色は原色それぞれの割合で決まるわけですが、プログラムとして処理するにはそれをある数値で表す必要があります。そしてRGBは24 bitで表現された数値で扱われることが多いです。24 bitで表すというのは、Red、Green、Blueの各色をそれぞれ8 bitで扱うということから来ています。8 bitが3つだから24 bitとなるという計算です。
16進数
RGBを24 bitで表す場合、2進数で書き表すと人間がそのまま読んだ場合に把握し難いです。この場合、24 bit を16進数で書くと把握しやすくなります。8 bit(原色1つ)は2桁の16進数で表すことができます。そして 24 bit(原色3つ)では6桁の16進数となります。実際の数値としては黒が000000、赤がFF0000、その他B2F0FFという表し方となります。
RGBを10進数に変換して表す
上の方でチラっと書いたように、rbgcolor variable では24bitのRGBの値は10進数に変換したものを渡して指定する必要があります(おそらく)。また値はRed、Green、Blueの数値を別々に渡すのではなく、まとめて1つの数値として渡す必要があります。方法としては上で説明した6桁の16進数を直接10進数に変換してもいいでしょう。その場合、何らかの方法でデータファイルに24bitのRGBを10進数で表した列を挿入することが必要になります。ここでは出来るだけ手順を減らし分かりやすさを優先することを考えてみます。ということで、ひとまずRed、Green、Blueの3つの値を、それぞれデータファイルに列として記述するものとして話を進めて行きます。データとしては例えばx、yが以下のような場合
5 10
これにRGBのそれぞれの列を記述すれば
5 10 234 11 56
となります。列は左から
x, y, Red, Green, Blue
の値を示しています。各色は8 bit、10進数なので0〜255の範囲となるようにします。
あとはこの各列をgnuplot側で1つの数値に計算し直してプロットに用いる形となります。この際の計算方法は詳しくは説明しませんが、3つの原色それぞれの値から求めるときの数式を示すと以下のようになります。
RGB = 65536 * r + 256 * g + b
ユーザー関数の作成 rgb(r,g,b)
gnuplotで各列の値をまとめて計算して値を出す方法については、以前解説した以下のブログ記事を参照して下さい。ここで、3つの列それぞれの数値から1つの数値を計算する場合、ユーザー関数を定義しておくとやりやすくなります。
ユーザー関数の一例を挙げると次のようなものになります。
rgb(r,g,b) = 65536*int(r) + 256*int(g) + int(b)
使用例は以下の通り。
plot test01.dat using 1:2:(rgb($3,$4,$5)) with points lc rgb variable
("rgbcolor variable"ではなく"rgb variable"としていますがこれは単に短縮した書き方であって、どちらも同じ意味です)
例 : 2次元プロット
以下、実際にRGBの値を付加したデータファイルをプロットしたものを紹介していきます。2次元プロットの例 |
データファイル(一部抜き出し)
78 78 78 0 0
79 79 79 0 0
80 80 80 0 0
81 81 81 0 0
プロットコマンド
unset key
rgb(r,g,b) = 65536*int(r) + 256*int(g) + int(b)
plot [0:255][0:255] data01.dat every 5 using 1:2:(rgb($3,$4,$5)) w p pt 7 ps 2 lc rgb variable
例 : 3次元プロット
3次元プロットの例 |
データファイル(一部抜き出し)
2 8 8 50 200 200
3 8 8 75 200 200
4 8 8 100 200 200
5 8 8 125 200 200
6 8 8 150 200 200
プロットコマンド
set xyplane 0
rgb(r,g,b) = 65536*int(r) + 256*int(g) + int(b)
splot data01.dat using 1:2:3:(rgb($4,$5,$6)) w p pt 7 ps 0.8 lc rgb variable
透明度を変化させる場合
ここまで24bitのRGBを扱って来ましたが、透明度を加えた32bit のRGBも扱うことが出来ます。データ並びは24 bit の場合がRRGGBBとすると、透明度を加えるとAARRGGBBとなります。この場合、色を表現するのに4つの値が必要となります。上で作ったユーザー関数も対応させると以下のようになります。
rgb(a,r,g,b) = 16777216*int(a) + 65536*int(r) + 256*int(g) + int(b)
まとめ
RGBを数値として扱うには、それがどう数値化されているのか把握しておく必要があって使いこなすのはやや難しいです。ただgnuplotにはこれ以外にも色を指定する方法が用意されているので、自分にとって使いやすいものを適宜選択するといいでしょう。gnuplot関連のブログ記事
コメント
コメントを投稿