画像の保存#

以下の例を考えましょう.

import pygmt
fig = pygmt.Figure()

fig.coast(
    projection  = 'N138/12c',                         
    region      = (128, 146, 30, 46),                 
    shorelines  = 'default,black',                    
    area_thresh = 100,                                
    resolution  = 'f',                                
    land        = '249/243/202',                      
    water       = '190/220/250',                      
    map_scale   = '142.5/32/32/400',                  
    frame       = ['WSen+t"Figure"', 'xafg', 'yafg']  
)

savefig メソッド#

PyGMTの基本 で紹介したように,もっとも簡単に画像を保存するには,以下のように savefig メソッドを用います.

fig.savefig('fig/map-by-savefig.png')

このように出力した画像をそのまま表示したのが以下です.showメソッドで表示したものとほぼかわりません.

_images/map-by-savefig.png

ファイル種別はファイル名の拡張子で自動的に判断されます.上記のpngのほか,画像としてはpdf, jpg, bmp, tif, epsが使えます.たとえば以下のようにするとPDFで保存できます.

fig.savefig('fig/map-by-savefig.pdf')

savefigメソッドは,デフォルトでは画像の描画範囲ギリギリまで余白を切り落とします.場合によっては,描画された最外部がわずかに切り落とされてしまうこともあるようです.以下のようにcropオプションをつけることで,この問題を回避できます. ここではその効果をはっきり確認するため,あえて大きめの余白をとってみましょう.

fig.savefig('fig/map-by-savefig-crop.png', crop='5c')
_images/map-by-savefig-crop.png

たしかに周りに余白が作られていることがわかります.

Danger

savefigメソッドのマニュアルには,cropオプションはBoolTrue or False)をとる,と書いてあります. ところが,crop=Falseを指定してみたところ,筆者の環境では処理が終わらなくなってしまいました.上記の例のように,マニュアルに記載がないものの,文字列として余白の大きさをcm単位で指定することで正常に処理されました.

また,出力がpng, jpg, tif形式のときは,デフォルトで anti_alias=True が仮定されており,画像化するときにアンチエイリアス処理がおこなわれます.アンチエイリアス処理の有無で劇的な変化はないようですが,文字のエッジ部分はやや綺麗になるようです.

そのほか,dpiオプションに数値を渡すと,画像の解像度を指定できます.デフォルト値はかなり高めです.

KML出力#

面白いところではGoogle Earthなどで表示可能な kml フォーマットが選べます.ただし,

  • 投影法(projection)はXで,かつ大きさは角度単位(d)で指定すべき

  • savefig の出力ファイル名にディレクトリを含むとうまくいかない

  • frame を描画すると位置がズレる

という制限があるようです.そこで,上記のスクリプトをKML用に変更してみると,以下のようになります.

fig_kml = pygmt.Figure()

fig_kml.coast(
    projection  = 'X18d/16d',         
    region      = (128, 146, 30, 46), 
    shorelines  = 'default,black',    
    area_thresh = 100,                
    resolution  = 'f',                
    land        = '249/243/202',      
    water       = '190/220/250',      
    map_scale   = '142.5/32/32/400'   
)

fig_kml.savefig('map.kml')

こうしてできたKMLファイルをGoogle Earthで表示したものが以下のスクリーンショットです.ただし,Google Earthの地形が背景に透けて見えるよう,同アプリ上で透過処理を行いました.

_images/GE.png

たしかに,PyGMTで作成した海岸線とGoogle Earthの海岸線がよく一致していることが確かめられます.

coastで地図を描いただけのものをGoogle Earthで表示してもあまり意味はありませんが,地図上のデータプロットがインタラクティブに操作できる地図アプリ上に表示できるのは有用かもしれません.

psconvertメソッド#

savefigよりももう少し細かい制御ができるのが psconvert メソッドです.これまで savefigで指定してきたオプションとほぼ互換なオプションは以下の通りです.下記にある調整は基本的に savefig メソッドで実現できます.

fig.psconvert(crop='0.5c',                   # 切り落とし
              dpi=300,                       # 解像度(PDFは不要)
              fmt='g',                       # g: png, f: pdf
              prefix='fig/map-by-psconvert', # 拡張子の手前までの名前
              anti_aliasing=['g4', 't4']     # これが一番強いアンチエイリアス
)