よくある質問:「psxyで,各点を直線でつなげるにはどうすればいいのでしょうか?」はよく聞かれる質問です.これに対する答えは「psxyを2回呼ぶ」ということです.これはわずらわしく感じられるかもしれませんが,しかし理由があってこういう仕様にしています:多角形は後でクリップされる可能性を考えてメモリにおきっぱなしにしておかねばならないので,メモリの制限はそのまま多角形の描画数の制限になります.しかしシンボルは単に各点をプロットしてそれで終わりですから同様の制限はうけません.ですから,一気に点プロットと線コネクトを両方やるよりも,別々の仕事にしてオーバーレイする方法にしているのです.
たとえば,この方法は次のようになります.
% psxy data -R -JX -B -P -K -W0.5p >! plot.ps % psxy data -R -JX -O -W -Si0.2i >> plot.ps
psxyの最後のサンプルに移りましょう.これはいささか複雑な例です.海岸線を描いたベースマップの上に,いくつかの地震の震央位置をプロットするのです.このとき,シンボルの大きさはマグニチュードの大きさを反映したいですし,シンボルの色は震源の深さを反映したいものです.さて,皆さんのディレクトリにはquakes.ngdcおよびquakes.cptという2つのファイルが見つかることと思います.前者の最初の数行を示すとこんな感じになっています:
Historical Tsunami Earthquakes from the NGDC Database Year Mo Da Lat+N Long+E Dep Mag 1987 01 04 49.77 149.29 489 4.1 1987 01 09 39.90 141.68 067 6.8
つまり,このファイルは3行のヘッダ行(ブランク行も含む)を含むこと,私たちは5,4,6,7番目のコラムだけを必要としていることがわかります.また,マグニチュード(コラム7)をシンボルの大きさにスケーリングしなおす必要があります.コラム7にある数値の範囲を見ますと,どうやらこの数値に0.02を掛けるとシンボルの大きさとして適当になりそうです.
さて,このファイルから必要なデータを切り出してpsxyが要求するフォーマットに変換したファイルを作成するには,いろいろな方法が考えられます.たとえば,手でエディット・MATLABの使用・表計算ソフトの使用・UNIXツール等です.ここではこれ以上苦労を増やさないためにも,UNIXツールであるawkを利用します.上記の作業を行うには,次のようにすればOKです:
% awk '{if (NR > 3) print $5, $4, $6, 0.02*$7}' quakes.ngdc >! quakes.d
このようにすると,生成されたファイルquakes.dは次のようになるはずです(試してみましょう):
149.29 49.77 489 0.082 141.68 39.90 067 0.136 ...etc etc
次に,シンボルの色を決定します.ここでは慣例に従って,浅い地震(震源が0〜100km)を赤,中くらいの深さの地震(100〜300km)を緑,深い地震(300km〜)を青で描くことにします.さてそのとき,色とデータ値の関係を表すquakes.cptファイルの内容はどのようになるかというと:
# color palette for seismicity #z0 red green blue z1 red green blue 0 255 0 0 100 255 0 0 100 0 255 0 300 0 255 0 300 0 0 255 1000 0 0 255
というものになります.
最初が#で始まる行はコメント行なので無視できます.それ以外の行は,z値がz1とz2の間にあるデータがどんな色でプロットされるか指定している行です.各行で二つのr/g/b値を指定しますが,この二つの値が異なる場合は,この「間」にある色を,zの値による補間((z-z1)/(z2-z1))によって求めて各シンボルの色とします.二つの値が同じ場合は,z1とz2の間にあるデータは全て同じ色で描画されます.
さて,ここまでで準備は完了しました.それではメルカトール図法を用いて欲しい図を得てみましょう.ここではオマケにマップスケールもつけてみました:
% pscoast -R130/150/35/50 -JM6i -B5 -P -G200 -Lf134/49/42.5/500 -K >! map.ps % psxy -R -JM -O -Cquakes.cpt quakes.d -Sci -W0.25p >> map.ps
ここで,-Scに付いたiは,シンボルサイズがインチ単位であることを明示的に示しています.