gnuplot 3次元カラーマップで補間(interpolate)
3次元の計算結果をプロットする際によく利用するのが gnuplot の カラーマップ表示(set pm3d map)です。 「pm3d」のデフォルトの設定では、与えたデータ数が少ないとデータ間を単一色で塗りつぶされてしまい、パッチワークの様になってしまいます。その際に、データ間を中間色で補間する設定を行うのがpm3dの「interpolate」オプションです。
※関数に対する描画間隔の設定は samples、 isosamples オプションで設定することができます。
interpolate 設定方法
set pm3d interpolate <steps in scan>,<steps between scans>
パラメタの詳細については、下記の外部ページを参考ください。
■43.49 Pm3d (竹野茂治 氏)
■タイトル未定: Gnuplot (新開健一氏)
interpolate の使用例
次のような2次元ガウス分布を用意し、、の範囲をに分割してファイルに出力します(参考:1次元ガウシアンのスプライン補間を試す)。
その後、以下のテンプレートを用いてカラーマップ表示する際に、「interpolate」のパラメータを変えてプロットしたのが次の結果です。
ガウス分布の外形もわからない「「interpolate」なし」の場合と比べて、パラメータの数値が大きいほど、滑らかになっていることがわかります。 「interpolate 5,5」とすることで、たったに対するデータでも、ガウシ分布の外形を理解することができます。 ただし、「interpolate 10,10」「interpolate 15,15」では、ガウス分布の中心に本来はないはずの十字の線があるように見えます。 つまり、「interpolate 」オプションを利用した補間時の問題点といえるかもしれません。大きくしすぎないようにすべきですね。
gnuplot によるカラーマップ表示の最適値
本稿では terminalで「gif」を選択し、gifファイルのサイズ「600×480」ピクセルに指定しています。 その際に、上記ののような平面の分割数がでは足りません。 そこで、元データでに分割に対するデータを用意し、「interpolate」オプションを試してみます。 ちなみに
「「interpolate」なし」の場合でも、十分ですが、「interpolate 5,5」で、色の段差がほとんどわからなくなりました。 元データのサイズを大きくするほど、描画は正確になり、色合いは滑らかになります。 しかしながら、データサイズは→で100倍と飛躍的に大きくなります。また、計算時間も計算方法によっては100倍となります。 つまり、計算結果を gnuplot を用いて描画するぐらいであれば、で「interpolate 5,5」と設定するのが最適ですね。
プログラムソース
gnuplot テンプレート
set pm3d ## 3次元カラー表示 set pm3d map ## カラーマップ表示 set ticslevel 0 set cbrange[0:1] set palette defined ( 0 "black", 1 "white") set nokey set tics font 'Times,14' set size square set xr[-1:1] ##<---------描画x軸の範囲 set yr[-1:1] ##<---------描画y軸の範囲 set terminal gif optimize size 600, 480 set output '0.gif' splot "f.data" u 1:2:3 with pm3d set pm3d interpolate 5, 5 ## 補間 set output '5.gif' splot "f.data" u 1:2:3 with pm3d set pm3d interpolate 10, 10 ## 補間 set output '5.gif' splot "f.data" u 1:2:3 with pm3d set pm3d interpolate 15, 15 ## 補間 set output '15.gif' splot "f.data" u 1:2:3 with pm3d
2次元ガウス分布の出力(C言語)
/* 2次元ガウス分布 */ #include <math.h> #include <stdlib.h> #include <fstream> #include <string> #include <direct.h> // Windowsフォルダ作成用 using namespace std; const int N=10; char str[200]; string folder = "data";//作成するフォルダ名 int main(){ #if defined(_MSC_VER) _mkdir(folder.c_str()); // Windowsフォルダ作成 #elif defined(__GNUC__) mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成 #endif string str1; ofstream fout_s; sprintf(str, "/f.data"); str1 = folder + str; fout_s.open(str1.c_str()); double x_min=-1.0, x_max =1.0; double y_min=-1.0, y_max =1.0; for(int i=0; i<=N; i++){ for(int j=0; j<=N; j++){ double x = x_min + (x_max - x_min) * double(i)/double(N); double y = y_min + (y_max - y_min) * double(j)/double(N); double f = exp(-10.0*(pow(x,2)+pow(y,2))); fout_s << x << " " << y << " " << f << endl; } fout_s <<endl; } fout_s.close(); }
その他の参考ページ
■ gnuplot tips (not so Frequently Asked Questions)(kawano 氏)
■ Members/chinone/覚書/Gnuplot - Cosmological Experiment Group(服部誠 氏)