Communitygithub.com

rookieplayerjr/pygmt-plotting-skill

PyGMTを用いた出版品質の科学図表作成のためのエージェントスキル:凝縮されたAPIリファレンス、ジャーナルのハウススタイル、ドキュメントには載っていない現場で試された落とし穴。

pygmt-plotting-skill とは?

このスキルは、PyGMT(Generic Mapping ToolsのPythonラッパー)を使用して、出版品質の科学図表を作成するためのエージェント向けスキルです。Claude CodeやCursorなどのAIエージェントが、地図作成やデータ可視化の際に、ジャーナルに提出可能な形式で図表を生成するために必要な、ハウススタイルのルール、投影法やカラーパレットの選択指針、そして頻出する落とし穴を網羅的に提供します。このスキルは、フレーム、パネルラベル、カラーバー、軸ラベルなどのフォーマットルールを強制し、特に地殻変動や地震学の図表において重要な「深度軸は正の値で下向き」というルールを厳守します。また、ラスタ画像のモアレ防止ルールや、図表生成後のセルフチェック手順も含まれており、初心者から専門家まで、PyGMTを用いた図表作成のワークフローを効率化し、質の高いアウトプットを保証します。さらに、GALLERY.mdやGOTCHAS.md、CRAFT.mdなどの補足資料へのリンクも提供されており、詳細なAPIリファレンスやコミュニティで共有されているテクニックにアクセスできます。

対応~Claude Code~Codex CLI~Cursor
npx skills add rookieplayerjr/pygmt-plotting-skill

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

PyGMT プロット

PyGMTはGeneric Mapping Toolsのラッパーです。すべてのメソッドパラメータは、Pythonの完全名(projection)とGMTの一文字エイリアス(J)の両方を受け入れますが、このスキルでは完全名を使用します。グリッド処理関数は、outgrid=Noneの場合にxarray.DataArrayを返すため、結果をプロット関数に直接チェーンできます。

必須の図形式(ハウススタイル)

すべての科学図表は、以下のフォーマットルールに従わなければなりません:

  • フレーム: MAP_FRAME_TYPE='plain'、MAP_FRAME_PEN='1p,black'。フレームを二度描かないこと(フレームを設定するbasemap + プロットの両方で設定しない)。
  • パネルラベル: フレーム内の左上隅に大文字(A、B、C...)、括弧なし、太字10p以上、四角い枠線(白色塗りつぶし + 0.8p黒ペン、clearance='1.5p/1.5p/1.5p/1.5p')。左端と上端から等距離。タイトルテキスト(例:「East」)は上部中央に別途配置。
  • 目盛ラベル: 左(W)と下(S)の端のみ。
  • カラーバー: 下部に水平、単位ラベル付き、軸ラベルから十分なオフセット(+o0c/0.8c)。
  • カラースケール: 発散する変位には vik、連続値には inferno または roma。
  • 深度軸は正の値で下向き(断層/断面/3D図のハードルール):深度軸は 0, 20, 40 …(正のキロメートル)とラベル付けしなければならず、0, -20, -40 としてはならない。深度は正の値として保存し(深度は下向きに増加)、領域の深度範囲を [0, zmax] に設定し、負の高さで軸を反転させる:2D断面図は projection="X<w>c/-<h>c"(負の高さ → y軸が下向きに増加)、3D透視図は zsize="-<h>c"(負 → 深部が下部、ラベルは正)。「上が正」を得るために負のzデータを出力しないこと。そうすると深度軸にマイナス記号が付いてしまいます。この方法で3Dのz軸を反転させると、面内の上昇方向ベクトルの垂直成分も符号が反転します(上昇は現在、正の深度が減少することを意味します)。
  • フレームの二重描画禁止: サブプロットがフレームを処理するため、パネル内でbasemap(frame=) を呼び出さないこと。
  • 自己チェック: 各図を生成した後、それを読み込み/検査します。二重フレーム、クリップされたコンテンツ、一貫性のないラベルをユーザーに表示する前に修正してください。

クイックスタート

import pygmt

fig = pygmt.Figure()
with pygmt.config(MAP_FRAME_TYPE="plain", MAP_FRAME_PEN="1p,black"):
    fig.basemap(region=[-125, -114, 32, 42], projection="M12c", frame=["WSne", "xaf", "yaf"])
    fig.coast(land="gray90", water="white", shorelines="0.5p,black")
    pygmt.makecpt(cmap="vik", series=[-10, 10])         # セッションCPTを設定
    fig.plot(x=[-119.5], y=[35.3], style="c0.3c", fill=[5.0], cmap=True, pen="0.5p,black")
    fig.colorbar(frame="x+lVelocity (mm/yr)", position="JBC+w8c/0.4c+h+o0c/0.8c")
fig.savefig("map.png", dpi=300, crop=True)

fig.show() でプレビュー、fig.savefig("f.pdf")(ベクター)または .png/.tif(ラスター、dpi=を指定)。

3つのユニバーサルパラメータ

すべてのマップコマンドはこれらを受け取ります。最初のコマンドで設定され、以降のコマンドで再利用されます。

  • region (R) — [W, E, S, N](順序に注意:西、東、南、北)。"g"/"d" = グローバル。"JP" = ISO国コード。コーナー座標には +r を追加。
  • projection (J) — code[params/]width、widthには単位が必要(c/i/p):"M12c" メルカトル、"X10c/6c" 線形、"L-100/35/33/45/12c" ランベルト正角円錐、"G-120/40/12c" 正射影。
  • frame (B) — ["WSne", "xaf", "yaf+lLabel", "+tTitle"]。大文字の辺 = 軸+目盛+注釈、小文字 = 注釈なし。a=注釈/主目盛、f=補助目盛、g=グリッド。軸ラベル +l はデカルト(X)投影でのみ機能し、地理投影では機能しません。

投影法 / CPTの選択(チートシート)

ニーズ投影法
地域図(低〜中緯度、InSAR/群発地震)M メルカトル "M12c"
大陸規模、低歪みL ランベルト正角円錐 "L lon0/lat0/lat1/lat2/w"
位置図インセット / 半球G 正射影 "G lon0/lat0/w"
全球W モルワイデ / N ロビンソン / H ハンマー
深度/距離断面X 線形、負の高さでy軸が下向き:"X12c/-4c"
データの種類CPT
発散(変位、速度、異常;ゼロ中心)vik、roma、broc、polar
連続スカラーinferno、roma、batlow、viridis、turbo
地形geo(陸)、oleron/relief(陸+海)、gray(陰影起伏)
循環(ラップ位相、方位角)romaO、vikO

CPTを作成するには pygmt.makecpt(cmap="vik", series=[-50, 50, 5]) を使用します。output= がない場合、これはセッションCPTとなり、後続の grdimage/plot(cmap=True)/colorbar で自動的に使用されます。グリッドの色をヒストグラム均等化するには pygmt.grd2cpt(grid=g, cmap="geo") を使用します。

ハウススタイル(すべての図で適用)

これらはこのスキルの意見が反映されたデフォルト設定です。対象ジャーナルが別の指示をする場合は上書きしてください:

  1. 描画を with pygmt.config(MAP_FRAME_TYPE="plain", MAP_FRAME_PEN="1p,black"): でラップします。フレームを二度描かないこと(サブプロット/basemapが処理するため、パネル内で frame= を再渡ししない)。
  2. 目盛ラベルは W(左) と S(下) の端のみ → frame=["WSne", ...]。
  3. パネルラベル:大文字(A、B、C…)、括弧なし、太字10p以上、白い四角い枠線(白色塗りつぶし + 0.8p黒ペン)、左端と上端から等しいオフセット:
    fig.text(position="TL", text="A", font="12p,Helvetica-Bold,black",
             justify="TL", offset="j0.2c", fill="white", pen="0.8p,black", clearance="1.5p/1.5p")
    
  4. カラーバー:下部に水平、単位ラベル付き、軸ラベルから十分なオフセット:position="JBC+w8c/0.4c+h+o0c/0.8c"、frame="x+lQuantity (unit)"。
  5. 発散する変位 → vik。連続値 → inferno/roma。
  6. ラスタ解像度 — モアレ禁止(ハードルール):干渉縞/スペックルグリッド(ラップ位相干渉図、コヒーレンス)を画像化する場合、レンダリングされるパネルのピクセル数はグリッドの元の列数以上でなければなりません:panel_cm × dpi / 2.54 >= n_columns。デフォルト:単一パネルは dpi=400 で16cm以上(GMTモダンモード:gmt begin fig png E400)。マルチパネルレイアウトでサンプリング不足になる場合は、縮小する代わりに単一パネルの図に分割します。サンプリング不足の密な干渉縞はモアレ縞にエイリアシングされます — ScanSARのラップ位相パネルで繰り返し発生する失敗モードです。
  7. 自己チェック:保存後、出力画像を読み取り、二重フレーム、クリップされたコンテンツ、一貫性のないラベル、または密な干渉縞領域のモアレ/グリッド状の偽テクスチャをユーザーに表示する前に修正します。

新しい図を作成するワークフロー

  1. 上記のチートシートから領域、投影法、CPTを決定します。
  2. GALLERY.md または scripts/ から最も近いテンプレートを選択し、適応させます。
  3. ハウススタイルの config ブロック内で描画します。ボトムレイヤー → トップレイヤーの順に構築します(陰影起伏 → 海岸線 → データ → 注釈 → カラーバー)。
  4. fig.savefig(..., dpi=300)(dpi=400以上で、干渉縞/スペックルラスタのピクセル数ルールを確認)、次に画像を読み取り、自己チェックします(上記ステップ7)。

参考文献

  • REFERENCE.md — 完全なAPI:図のライフサイクル、coast/plot/text、grdimage/grdcontour/grdview、makecpt/colorbar、データセット、グリッド処理(grdcut/grdgradient/grdtrack/surface…)、xarray、meca、velo、project、subplot/inset/shift_origin/legend。
  • GOTCHAS.md — APIドキュメントに記載されていない、コミュニティから寄せられた落とし穴:領域/日付変更線/投影法の罠、セッションCPTの上書きと「zスライスなし」エラー、算術演算後のxarray gtype/registrationリセット、grdimage全面黒、earth_reliefキャッシュ、フォント設定のスコープ、マルチパネルのカラーバー、0.xパラメータの名称変更、Ghostscript/condaインストールの修正。§8 現場で試された罠: インセットのbasemapが注釈/ラベルを削除する(手動で描画するか shift_origin を使用する)。インセットはデフォルトのフレームを強制するため、box="+p" で二重フレームになる。meca +m のMwスケーリングは不可視(ビーチボールを手動でサイズ設定する)。負の深度で meca(cmap=True) はセグメンテーションフォールト。手書きのrasterio tif → grdimage でセグメンテーションフォールト(代わりにxarrayを使用)。shading の次元不一致(最初にgrdsample)。インセットのカラーバーラベルオーバーフロー(+mal)。fig.plot(fill="white") で不要な黒い境界線が追加される。§9 ベクトル矢印(style="v"): +g/+h は壊れていません — 矢じりは +e/+b も渡した場合にのみ表示され、ベクトルが矢じりの長さより短いと静かに矢じりが失われ(+n<len> で修正)、+h が1に近いと矢じりが退化して塗りつぶしが消えます。PyGMTの図が誤動作したり、予期せずエラーになった場合はこれを読んでください。
  • CRAFT.md — コミュニティの出版技術:ペインターモデルのレイヤー順序、科学的カラーマップ(発散はゼロ中心で対称でなければならない)、陰影起伏の方位角規則、スケールバー/コンパス/経緯線、マルチパネルの位置合わせと共有カラーバー、ベクター vs ラスター出力、地震テクトニクスのレイヤー構成。図を見栄え良くし、投稿準備を整えるためにこれを読んでください。
  • GALLERY.md — 13のすぐに適応できるシナリオテンプレート(ベースマップ、マルチパネル、インセット、分類散布図、速度場、ヒストグラム、ローズ図、3D、コンター、断面図、デュアル軸)。
  • scripts/ — 実行可能でパラメータ化されたテンプレート:displacement_map.py、seismicity_map.py、cross_section.py、multipanel_components.py。それぞれデモデータでスタンドアロン実行可能です。上部のCONFIGブロックを編集してください。

関連スキル