pm3d: グラフの色が本来の値と違う?(2008/06/13)
下の図,何かおかしいです.
わかりますか?
右軸の値は 43 くらいまであるのに,グラフは赤さが足りません.
つまり値が正しい色で表示されていません.
- 解決策その 1: corners2color で色補間方法の変更
では,pm3d ではどうやって色を決めているのでしょうか?
pm3d アルゴリズムでは、
最初の走査で検出された隣り合う 2 点と、
次の走査で検出された他の 2 点の間の領域が、
これら 4 点の z の値 (または追加された 'color' 用の列の値、 using 参照) に従って
灰色で (または カラーで) 塗られます。
デフォルトでは 4 つの角の値の平均値が使われますが、
それはオプション corners2color で変更できます。
(43.49 Pm3d
【gnuplot (Takeno Lab)】
から引用)
デフォルトでは 4 つの角の値の平均値が使われ
とあるので,当然色は小さい方向に表示されることになります.
では,補間方法を corners2color で変えてみましょう.
最初の図で
set pm3d corners2color max
とすると,以下の図になります.

ちゃんと最大値がでました.
また,
set pm3d corners2color c[1234]
とすることで 4 つの角のうちある角の値のみで描画する,ということもできます.
- 解決策その 2: interpolate で色補間分解能の変更 (ver. 4.1 以上)
データ点が増えれば,例え corners2color が mean でも,
隣の点との値が急激に変わることがなくなり,滑らかなグラフが描画できます.
しかしデータ点を増やすのは計算コスト的に厳しいという場合も多々あるでしょう.
set pm3d interpolate <steps in scan>,<steps between scans>
で分解能を変えることができます.
参考: ●*** 2 splot questions - Application Development and Programming
【Application Development and Programming】
<steps in scan> は一回の走査の評価回数だと思うのですが,値を変えても描画が変わりませんでした.
<steps between scan> は走査間で色地図の反復計算を行う回数だと思います.
データ点数が<steps between scan>2 倍 (2Dプロットの場合)
されたものとして計算してくれるようです (多分).
set pm3d interpolate 5, 5
とした結果が下図です.

なんとも滑らかになりました.
BoundingBox いじって EPS のグラフサイズ変更(2008/03/24)
Y2 軸を使ったりするとたまにグラフのラベルが表示できていないことがあります.
そのような画像を GSview で「Options」→「EPS Clip」オフ,「Show Bounding Box」オン
で表示すると以下のようになります.

点線部が Bounding Box で,図を描画するために確保する領域となっています.
つまり,この図は Y 軸の "Z-position [um]" という文字列が
(表示すべきデータとしては存在するのに) 表示できていません.
さて,この EPS ファイルをテキストエディタで開いてみましょう.
以下のような文字列が見えると思います.
%!PS-Adobe-2.0 EPSF-2.0
%%Title: DTMap_5.eps
%%Creator: gnuplot 4.2 patchlevel 0
%%CreationDate: Mon Feb 25 18:07:00 2008
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 410 302
%%EndComments
...
この
%%BoundingBox: 50 50 410 302
の部分を編集してやればいいわけです.
自分で見ながらやってもいいのですが,面倒なので eps2eps を使います.
eps2eps は gs に付属のシェルスクリプトです.
Windows の場合は cygwin を使うと楽.
eps2eps before.eps after.eps
のように打つと before.eps から after.eps が生成されます.
after.eps をエディタで見ると以下.
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 35 66 414 257
%%HiResBoundingBox: 35.000000 66.100000 413.800000 256.850000
%.....................................
%%Creator: GPL Ghostscript 850 (epswrite)
%%CreationDate: 2008/03/24 19:01:15
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%EndComments
BoundingBox が変わっているのが分かると思います.
%%BoundingBox
を元の before.eps に上書きしてやれば OK です
(after.eps は多分解像度が低くなっているのでそのままでは使わない方が良いでしょう).
%%HiResBoundingBox
は通常指定しなくてもいいです.
HiResBoundingBoxに対応しているソフトウェア【DTPWiki】
を使い,凄く微妙なサイズをこだわる際には書くと良いと思います.
参考:
●
PostScriptファイルのBoundingBoxについて【Gnuplot入門 第0.08版】
BoundingBox について知らない人は一度.
●
gnuplot / postscript【gnuplot tips (not so Frequently Asked Questions)】
eps2eps の存在を初めて知りました…(これを書いた当時).
●
IllustratorでTeX数式【物理のかぎしっぽ】
ていうか eps2eps って eps をアウトライン化してるんですね.
●
EPS, PDF, PS と R や Linux (出版時に使う EPS ファイル)【気象学研究室 - buran】
eps2eps で文字がビットマップ化されるのを回避するために解像度を上げる方法.
pm3d(2005/10/10)
pm3dを使えば,こんな感じ→→→→→→→→→→
のカラー表示ができます.
.png)
やり方はというと簡単で,
set pm3d
のように指定するだけです.
pm3dを使い出した時,plotしても全く表示されないということがありました.
日本語のサイトを見てもなかなかpm3dについては書いてないので,本家を見ると…↓.
●
3.10 Pm3d splot from a datafile does not draw anything[Gnuplot FAQ]
以下要約.
データファイルをpm3d・splotしても何も表示されないのはどうして?
"set pm3d"をしているのにプロットが真っ白でカラーボックスも出ていない――
そういう時はデータファイル内の等値線ブロックの間に改行がないはず.
具体的に知りたかったらGnuplotディレクトリ下のdemo/glass.datやdemo/triangle.datを見てみよう.
(あとは1列目の数字が変わったら空行を追加するawkスクリプトの説明だから割愛)
これは例を見た方が分かりやすいでしょう.
GLASS.DATは
0.380066 -0.422106 -0.911000
0.518894 -0.231027 -0.911000
0.568000 -0.000000 -0.911000
0.341741 0.000000 -0.905215
0.312196 0.138999 -0.905215
0.228669 0.253963 -0.905215
……
のように,TRIANGLE.DATは
0 0 1
1 0 2
0 1 1
1 1 2
2 1 3
3 1 4
0 2 1
1 2 2
2 2 3
3 2 4
4 2 5
5 2 6
……
のようになっている.
つまり,ある程度 (どの程度かは場合による) の固まり毎に空行を入れろということ.
真面目に人力で空行を入れると疲れるので,スクリプトを走らせると楽です.
例えばx,y,zを昇順に並べる(優先度はx,y,zの順)perlスクリプトの概要は以下のファイルのように.
xyzAscend.txt
実際使用するときは自分に合ったように手直しして,拡張子を".pl"にして下さい.
# 元あったスクリプトをだいぶ書き換えたので動作保障はしません
●
カラーマップを使った3次元表示 (pm3d)[T.Kawano's Web Page]
とってもわかりやすいです.
●
gnuplot-4.0.0 デモ画像[OHTA'S HOME PAGE]
pm3dを使ったカラーのデモ画像 (ソース付き) がたくさんあります.
pm3dのグラフを作るときには大変参考になります.