0
1

pygmtでカラーマップを新規作成したい場合

Last updated at Posted at 2023-08-21

はじめに

 pygmtを使用して、図を描画する機会があったが、pygmtで使用できるカラーマップが少なすぎる!となり、自作してみた。

参考にしたサイト

 以下のサイトを参考にした。
http://www.healthy-life-food.jp/2018/11/18/gmt-command-makecpt/

PyGMTにおけるカラーマップ

 PyGMTとは、GMT(the generic mapping tool)と呼ばれる地図を描くためのオープンソースのソフトウェアツールをpythonで使用できるようにしたもの。
 地図の描画に強みがあり、日本地図に標高のグラデーションを入れたやつとかかっこよく作れる。

 しかし、かっこよく作るための一つの方法であるカラーマップについてはほとんど種類がなく、以下の24種類である。(余談だが、このカラーマップ自体も、PyGMTの公式サイトからは見つけられず、どういった種類のカラーマップがあるのか探すのさえ苦労した)
 そこそこ使えそうではあるが、単純に白から赤のグラデーションで密度出したいとかの時に使えるものがない...。初心者故、これまで基本的に既成のカラーマップに頼っていたが、作成することにした。

image.png
(以下のサイトより参照: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のカラーマップが使用されるので注意が必要

終わりに

 以上のように、カラーマップのファイルを自作しておけば、グラデーションカラーが色々必要になった際に使いまわせるので便利かなぁと思う。が、そもそももうちょっとグラデーションぐらい整備しておいてほしい...(もしかすると自分が知らない方法があるかもなので、ご存じでしたら教えてほしいです...)

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