HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > TIPS 集

gnuplot 3次元カラーマップで補間(interpolate)

文責:遠藤 理平 (2012年1月 5日) カテゴリ:TIPS 集(94)計算物理学(126)

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\leq x \leq 1-1\leq y \leq 1の範囲を10	imes10に分割してファイルに出力します(参考:1次元ガウシアンのスプライン補間を試す)。

(1)

その後、以下のテンプレートを用いてカラーマップ表示する際に、「interpolate」のパラメータを変えてプロットしたのが次の結果です。

「interpolate」 なし
interpolate 5,5
interpolate 10,10
interpolate 15,15

ガウス分布の外形もわからない「「interpolate」なし」の場合と比べて、パラメータの数値が大きいほど、滑らかになっていることがわかります。 「interpolate 5,5」とすることで、たった10	imes10に対するデータでも、ガウシ分布の外形を理解することができます。 ただし、「interpolate 10,10」「interpolate 15,15」では、ガウス分布の中心に本来はないはずの十字の線があるように見えます。 つまり、「interpolate 」オプションを利用した補間時の問題点といえるかもしれません。大きくしすぎないようにすべきですね。

gnuplot によるカラーマップ表示の最適値

本稿では terminalで「gif」を選択し、gifファイルのサイズ「600×480」ピクセルに指定しています。 その際に、上記ののようなx-y平面の分割数が10	imes10では足りません。 そこで、元データで100	imes100に分割に対するデータを用意し、「interpolate」オプションを試してみます。 ちなみに

「interpolate」
interpolate 5,5

「「interpolate」なし」の場合でも、十分ですが、「interpolate 5,5」で、色の段差がほとんどわからなくなりました。 元データのサイズを大きくするほど、描画は正確になり、色合いは滑らかになります。 しかしながら、データサイズは10	ime10100	imes100で100倍と飛躍的に大きくなります。また、計算時間も計算方法によっては100倍となります。 つまり、計算結果を gnuplot を用いて描画するぐらいであれば、100	imes100で「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(服部誠 氏)



▲このページのトップNPO法人 natural science トップ

関連記事

TIPS 集

計算物理学







▲このページのトップNPO法人 natural science トップ