Gnuplot

2008/12/15

pm3dの表示をレインボーにする

デフォルトのままpm3dを使うと、

Pm3d_default_2


なんかものすごい色で表示されてしまうので、

Pm3d_2

このようにレインボー表示するように設定してみる。

直接パレットを設定する方法もあるが、最も簡単な方法は

gnuplot> set palette rgbformulae 22, 13, -31

とする。ちなみに、

gnuplot> help set palette rgbformulae

とするとプリセットのパターンが表示される。

| | コメント (0) | トラックバック (0)

2008/12/11

Gnuplotの起動時のTerminal

Gnuplot起動時のTerminalを指定したければ、ホームディレクトリに「.gnuplot」なるファイルを作って、例えばx11にしたいときは

set terminal x11

と書いておけばいいのか。

| | コメント (0) | トラックバック (0)

2008/11/17

等高線を制御

gnuplotで等高線の引き方を変えたいときは次のようにする。

gnuplot> set contour
gnuplot> set cntrparam levels 等高線の本数
gnuplot> set cntrparam levels incremental 最小値, 間隔, 最大値
gnuplot> set cntrparam levels discrete n1, n2, n3, n4
                                       (等高線を引く値を直接列挙)

デフォルトのまま等高線を引くと、等高線の本数が少なくなり過ぎてよくわからない図になってしまうことがある。そういうときにはcntrparamで設定してみる。

| | コメント (0) | トラックバック (0)

2008/11/03

gnuplotでベクトル場を表示させたい

例えば、v=(vx,vy)のベクトル場を表示するにはどうしたらいいのだろう?

[追記]

v(x, y)=(vx(x,y), vy(x,y))のベクトル場を表示させるにはこのようなフォーマットでデータファイルを作成すればいいようだ。

x座標 y座標 x成分        y成分

 x_1   y_1  vx(x1, y1)  vy(x1, y1)

ベクトルの矢印大きすぎるようなら成分を任意の定数で割り、矢印の大きさを調節する。

| | コメント (0) | トラックバック (0)

2008/10/12

WindowsにコンソールモードのGnuplotをインストールする

数値計算のデータをプロットするとき大変お世話になるGnuplotをWindowsにインストールする。

GnuplotにはWindows用のwgnuplotが用意されているが、このwgnuplotはLinuxで使うgnuplotとは使い方が異なる。そこで今回は、次のような方針でGnuplotをインストールする。

  • wgnuplotのように起動後に別のウィンドウを起動することなくコマンドプロンプト上で操作する。
  • Linux上で作ったGnuplotを呼び出すコードをWindowsでも書き換えることなしに使えるようにする。(terminal x11は除く)

まずはSourceForgeからgp424win32.zipをダウンロードして解凍する。解凍したら、後で使うのでとりあえず放置。このwgnuplotはbinフォルダ内のwgnuplot.exeを起動するだけで使えるけど、コンソールモードがないし、プログラムから呼び出すパイプ処理もLinuxのそれとは違う。

ではコンソールモードはどうするのかと言うと、「gnuplotメモ」にこんな文言がある。

Octave3.0.2+Forge20080831 Mingw版 にコンソールモードのgnuplot 4.3 (CVS)が添付されています

というわけでSourceForgeからOctave3.0.2のインストーラをダウンロードしてくる。次にインストーラを起動してCドライブ直下にでもインストールする。

インストールしたら「gnuplotメモ」にもあるとおりOctaveのbinフォルダ内にある次のファイルをコピーする。

pgnuplot.exe
wgnuplot.mnu
wgnuplot.hlp
gd.dll
fontconfig.dll
expat.dll
freetype-6.dll
zlib1.dll
libgcc_tdm_dw2_1.dll
jpeg.dll
png12.dll

コピー先はCドライブ直下に「gnuplot」というフォルダを作り、その中に「bin」フォルダを作ってその中。つまり、「C:\gnuplot\bin」内にコピーする。

これで環境変数PATHに「C:\gnuplot\bin」を追加すればコンソールモードのgunplotが使えるようになる。ただしコマンドはgnuplotではなくてpgnuplot。

コマンドはエイリアスでgnuplotにできるけど、プログラムから呼び出すときはエイリアスを使うことはできない。そこでpgnuplot.exeの名前ををgnuplot.exeに変更してしまう。

また、このままではpostscriptファイルの出力ができないので以下のような手順でファイルをコピーする。

  1. wgnuplotのbinフォルダ内にあるshareフォルダをC:\gnuplot\bin内にコピー
  2. wgnuplotのcontribフォルダをC:\gnuplot内にコピー
  3. C:\gnuplot内にshareフォルダを作り、その中にOctaveのshareフォルダ(C:\Octave\3.0.2_gcc-4.3.0\share)内にあるgnuplotフォルダをコピーする

これでかなりそれっぽく動くようになる。試しに次のようなプログラムを動かしてみる。

/*==================================================*/
// 単振動シミュレーション
// using Euler Method
// 2008/12/20
// Hiroshi Nishimura
/*==================================================*/

#include <stdio.h>
#include <math.h>

#define TIME 50     // 終了時刻
#define DT   0.01   // 時間刻み

// Gnuplotによるアニメーション
void plotter(FILE* gp, double t, double x);

/*==================================================*/
//  微分方程式 (d/dt)^2{x} = -x
//  ↓
//  d/dt{x} = +v
//  d/dt{v} = -x
/*==================================================*/
double dxdt(double v) { return +v; }
double dvdt(double x) { return -x; }

int main(void)
{
  int    it;
  double x    = 0.0;                  // 初期位置
  double v    = 1.0;                  // 初期速度
  double t    = 0.0;                  // 現在時刻
  int    tmax = (int)ceil(TIME/DT);   // ループ回数
  FILE*  gp   = popen("gnuplot", "w");

  for(it = 1; it <= tmax; it++) {
    double x_old = x;
    double v_old = v;

    t = it*DT;
    x = x + DT*dxdt(v_old);
    v = v + DT*dvdt(x_old);

    plotter(gp, t, x);
  }

  fprintf(stderr, "End. Hit Return Key\n");
  getchar();
  pclose(gp);
  
  return 0;
}

void plotter(FILE* gp, double t, double x)
{
  fprintf(gp, "set title 'Euler T = %4g'\n", t);
  fprintf(gp, "set xrange[-5:5]\n");
  fprintf(gp, "set yrange[-1:1]\n");
  fprintf(gp, "plot '-' with points title 'Point'\n");
  fprintf(gp, "%g, %g\n", x, 0.0);
  fprintf(gp, "end\n");
  fflush(gp);
}

簡単な単振動のアニメーションを出力するプログラムなのだが、アニメーションもちゃんと動く。(-persistは使えないようだ)

今のところは特に不具合もないようだけど、あくまで自己責任で。

[追記]

postscriptファイルの表示するにはghostscriptとgsviewが必要なのでインストールしておく。(gsviewのパスを通しておくとどこからでも開けるので便利)

Link:Ghostscript 8.63 + GSview 4.9 の日本語版

gsviewを起動すると毎度「Registration」が出てきて鬱陶しいので、ビューワにXnViewを使う手もある。

| | コメント (0) | トラックバック (1)

2007/10/19

C言語からGnuplotを呼び出す

数値計算をしていると、データを出力してGnuplotでグラフを作成という作業をよくするんですが、この作業って結構面倒です。グラフをPostscriptにする作業まで終えてから間違いを発見したときなんて、まさに悲劇!!

ですが、コードの中にGunplotの操作を書いておけば、コンパイルして実行しただけでグラフまで作成されます。試しにコードを書いてみます。

/*
  プログラムからGnuplotを呼び出す
*/

#include 
#include 

int main(void)
{
  FILE   *gp;
  int    i;
  double x;

  //---Gnuplotを起動---
  gp = popen("gnuplot -persist", "w");

  //---座標の名前を入力---
  fprintf(gp, "set xlabel \"x\"\n");
  fprintf(gp, "set ylabel \"y\"\n");
  
  for(i=1 ; i<=200 ; i++) {
    x = 0.02 * i;
    //---Gnuplotのコマンドを実行---
    fprintf(gp, "plot sin(x-%f*pi)*cos(2*x-%f*pi)\n", x, x);
  }

  pclose(gp);

  return 0;
}

このコードのようにforループ内に処理を書くとグラフがアニメーションとして表示されます。また、このGnuplotの呼び出し方を応用すれば、一度にPostscriptファイルまで作成することもできます。これで悲劇ともお別れ、間違ってもコンパイル&実行で完了です。

今はいろんなグラフを表示するのがおもしろいです。

| | コメント (0) | トラックバック (1)