はじめに
pygmtを使用して、図を描画する機会があったが、pygmtで使用できるカラーマップが少なすぎる!となり、自作してみた。
参考にしたサイト
以下のサイトを参考にした。
http://www.healthy-life-food.jp/2018/11/18/gmt-command-makecpt/
PyGMTにおけるカラーマップ
PyGMTとは、GMT(the generic mapping tool)と呼ばれる地図を描くためのオープンソースのソフトウェアツールをpythonで使用できるようにしたもの。
地図の描画に強みがあり、日本地図に標高のグラデーションを入れたやつとかかっこよく作れる。
しかし、かっこよく作るための一つの方法であるカラーマップについてはほとんど種類がなく、以下の24種類である。(余談だが、このカラーマップ自体も、PyGMTの公式サイトからは見つけられず、どういった種類のカラーマップがあるのか探すのさえ苦労した)
そこそこ使えそうではあるが、単純に白から赤のグラデーションで密度出したいとかの時に使えるものがない...。初心者故、これまで基本的に既成のカラーマップに頼っていたが、作成することにした。
(以下のサイトより参照:https://ccsr.aori.u-tokyo.ac.jp/~obase/gmttips.html)
カラーマップ作成
まず、カスタムのカラーマップ作成に使う関数が以下である。
pygmt.makecpt(**kwargs)
詳しい説明は公式ドキュメントを参照してほしい。今回使う引数は、cmapになる。通常は以下のように、カラーマップの名前を記載する(defaultはrainbow)
pygmt.makecpt(cmap="cool", series=[0, 10, 0.1])
が、今回は外部ファイルにカラーマップの詳細を記載し、その内容を取得する方針で行う(別関数を切って、そちらで中身の文字列を作成し、cmapに入れるという方向でもよいかもしれない)。コードは以下の通り。
pygmt.makecpt(
cmap="./red_transparent.cpt",
series=[0, 10, 0.1]
)
そして、このred_transparent.cptに入る内容だが、以下のようにしている。
# Color map from transparent to red
# COLOR_MODEL = RGB
0 255 255 255 1 255 254 254
1 255 254 254 2 255 253 253
2 255 253 253 3 255 252 252
...
253 255 2 2 254 255 1 1
254 255 1 1 255 255 0 0
B 255 255 255
F 255 255 255
N 255 255 255
意味は単純で、3行目の"0 255 255 255 1 255 254 254" が、値が0,1時のRGBの値(255,255,255)と(254,255,255)となっており、これが254まで書かれている。
Bは最小値を下回る値の時のRGB, Fは最大値を上回るときのRGB, NはNaN値に振り分けられるRGBである。
この内容でファイルが構成され、makecptでseriesが指定された際は、ファイルの値がseriesの最大、最小と合致するように修正されている(今回の例では、0→0, 255→10に変更されている)
※ちなみに、このファイルの書き方をミスると(変にタブキーを入れたり等)、特にエラーは出ずに、デフォルトのrainbowのカラーマップが使用されるので注意が必要
終わりに
以上のように、カラーマップのファイルを自作しておけば、グラデーションカラーが色々必要になった際に使いまわせるので便利かなぁと思う。が、そもそももうちょっとグラデーションぐらい整備しておいてほしい...(もしかすると自分が知らない方法があるかもなので、ご存じでしたら教えてほしいです...)