Gnuplotとの連携

Gnuplot との連携




Gnuplotによる関数の描画
Gnuplotによるデータのプロット
Gnuplotによる3-Dグラフの描画
Gnuplotによる3-Dデータのプロット
今日のポイント
グラフ描画ソフト gnuplot を体験してみよう
1
Gnuplot とは…





グラフ描画専用のフリーウェア
Windows版の名称は wgnuplot
インストールはフォルダごとコピーするだけ
専用のコマンドウインドウにより、おもにコマンド
で操作
日本語のオンラインヘルプやWebでの解説ペー
ジも充実
2
Gnuplotの起動と終了




gnuplot の起動は [ スタート ] →
[すべてのプログラム(P)>] → [gnuplot] を<クリック>
[ スタート ] → [すべてのプログラム(P)>] → [gnuplot] を
<右クリック>して、[送る(N)
送る(N)] より
[ デスクトップ(ショートカットを作成)]を選び、
ショート
カットアイコン を作成
ショートカットアイコン を<ダブルクリック>すると、
gnuplot が 起動
X ボタン
左上の [File]
File → [Exit]
Exit または、右上の [x]
により、終了
3
フォントが小さい場合


gnuplot のウィンドウを <右クリック> し、3つめの
[Choose
Choose Font…
Font... ] を選択し、フォントウィンドウを開く
フォント名(F):で [Terminal
Terminal] を選択し、サイズ(S):
で [14]
14 を選んでおく

[ OK ] ボタンを押してフォントウィンドウを閉じる

再び、gnuplot のウィンドウを <右クリック> し、一番
下の [Update
Update wgnuplot.ini
wgnuplot.ini] を選んで設定を保存
4
練習1 関数グラフを描いてみよう
gnuplot> plot 2*x*x+3, x**3-75*x
べき乗
プロンプト
300
2*x*x+3
x**3-75*x
200
100
0
-100
-200
-300
-10
-5
0
5
10
5
グラフ描画のためのTips(1)

X軸ラベル、Y軸ラベルは
gnuplot> set xlabel "x"
gnuplot> set ylabel "y"
gnuplot> replot

矢印キー↑で
前のコマンド
を呼び出し、
編集できる
Axes メニュー
[Replot] ボタン
凡例(Key)を変えるには
改行して
続ける記号
gnuplot> plot 2*x*x+3 title "y=2x^2+3", \
> x**3-75*x title "y=x^3-75x"

プロットの線を「線と点」に変えるには
gnuplot> plot 2*x*x+3 with linespoints, \
> x**3-75*x with linespoints
Plot メニュー
6
グラフ描画のためのTips(2)

X軸範囲、Y軸範囲の指定は
gnuplot> set xrange [-15:15]
gnuplot> set yrange [-2000:2000]
gnuplot> replot

目盛線をつけるには
gnuplot> set grid

Chart メニュー → Grid on
対数グラフにするには
gnuplot> set logscale xy

Axes メニュー
set コマンドを解除するには
gnuplot> unset grid
Axes メニュー → Logscale xyz
Chart メニュー → Grid off 7
練習2 対数グラフを描いてみよう
Lorentz関数
gnuplot> plot 1/(1+x*x)
gnuplot> set logscale xy
gnuplot> set xrange [0.1:100]
gnuplot> set yrange [0.0001:1]
1
gnuplot> set xlabel "x"
gnuplot> set ylabel "y" 0.1
gnuplot> set grid
0.01
gnuplot> replot
y
1/(1+x*x)
0.001
0.0001
0.1
8
1
10
x
100
sinc2(x) = (sin px/px)2
sinc2(x)の対数グラフ
gnuplot> sinc(x) = sin(pi*x)/(pi*x)
gnuplot> plot sinc(x)**2
gnuplot> set logscale xy
gnuplot> set xrange [0.1:100]
gnuplot> set yrange [0.0001:1]
gnuplot> set xlabel "x"
gnuplot> set ylabel "y"
gnuplot> set grid
gnuplot> replot
関数定義
1
sinc(x)**2
y
0.1
0.01
0.001
0.0001
0.1
9
1
10
x
100
リサージュ図形
gnuplot> set parametric
gnuplot> plot cos(5*t), sin(7*t)
gnuplot> set trange [-pi:pi]
1
gnuplot> set grid
gnuplot> unset key
0.5
gnuplot> replot
媒介変数 t
0
凡例なし
(No Key)
-0.5
10
-1
-1
-0.5
0
0.5
1
練習3 データのプロット
gnuplot> plot 'Z:\nyumon2\q14.csv' with lines

凡例を書き換える場合
gnuplot> plot 'Z:\nyumon2\q14.csv' \
> title "y=2x^2+3" with lines

さらに線を「線と点」にかえる
gnuplot> plot 'Z:\nyumon2\q14.csv' \
> title "y=2x^2+3" with linespoints
11
複数データのプロット
gnuplot> plot 'Z:\nyumon2\q14_s.csv' with lines, \
> 'Z:\nyumon2\q14_s.csv' using 1:3 with lines
凡例を書き換える場合
1列目と3列目
でプロット
gnuplot> plot 'Z:\nyumon2\q14_s.csv' \
> title "2x^2+3" with lines, \
> 'Z:\nyumon2\q14_s.csv' using 1:3 \
> title "x^3-75x" with lines
12
練習4 3-Dグラフの描画
gnuplot> R(x,y)=sqrt(x*x+y*y)
gnuplot> gauss(x,y)=exp(-R(x,y)**2)
gnuplot> splot gauss(x,y)
gnuplot> set xrange [-2:2]
gnuplot> set yrange [-2:2]
gnuplot> set isosample 40,40
1
0.9
0.8
gnuplot> set xlabel "x"
0.7
0.6
0.5
0.4
set
ylabel
"y"
gnuplot>
0.3
0.2
0.1
0
gnuplot> replot
関数定義
default の10 では足りない
gauss(x,y)
2
1.5
1
0.5
-2 -1.5
0
y
-1 -0.5
-0.5
-1
0 0.5
1 1.5 -2-1.5
x
2
13
練習5 等高線の描画
gnuplot> R(x,y)=sqrt(x*x+y*y)
gnuplot> gauss(x,y)=exp(-R(x,y)**2)
gnuplot> splot gauss(x,y)
gnuplot> set xrange [-2:2]
gnuplot> set yrange [-2:2]
gnuplot> set contour base
gnuplot> unset surface
gnuplot> set view 0,0
gnuplot> set cntrparam levels 10
gnuplot> set xlabel "x"
gnuplot> set ylabel "y"
gnuplot> replot
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
0.9
0.8
0.7
2 0.6
1.50.5
0.4
1 0.3
0.50.2
0.1
0
y
-0.5
-1
-1.5
-2
x
14
3-D/等高線グラフのためのTips

陰線処理
gnuplot> set hidden3d

カラーマップ表示
gnuplot> set pm3d
 カラーパレットの指定
gnuplot> set palette gray
gnuplot> set palette color
gauss(x,y)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
2
1.5
1
0.5
-2 -1.5
0
y
-1 -0.5
-0.5
-1
0 0.5
1 1.5 -2-1.5
x
2
15
Milk drop
Milkdrop(x,y) = exp( exp( -R(x,y) ) *
( exp( cos( R(x,y) )**20 ) + 8*sin( R(x,y) )**20 +
2*sin( 2*R(x,y) )**8 ) )
Milkdrop(x,y)
12
11
10
9
8
7
6
5
4
3
2
1
12
11
10
9
8
7
6
5
4
3
2
1
0.5
-2 -1.5
0
-1 -0.5
-0.5
-1
0 0.5
-1.5
1 1.5 -2
x
2
1
1.5
2
y
16
3-Dプロット用のデータ構造

Excelとは異なり、2-Dプロット用データを縦に
並べることで3-Dプロット用データとしている。

2-Dプロット用データの区切りには<空行>を
用いる。

3-Dプロットデータをさらに複数重ねるときに
は、2行分の<空行>を境界とする。
17
練習6 3-Dデータのプロット
まず、
f (x, y)=exp(-(x2 + y2)),
-2 ≦ x, y ≦ 2
のgnuplot用データを作成し、gauss2.dat に
保存する。


つぎに、gnuplotにより gauss2.dat の3-D
プロットを描く。
18
プログラム例 (gauss2g.c)
#include <stdio.h>
#include <math.h>
int main(void)
{
int i, j, n=20;
double x, y, z;
for (j = -n; j <= n; j++) {
y = 0.1*j;
for (i = -n; i < n; i++) {
x = 0.1*i; z = exp(-(x*x+y*y));
printf("% .2f, % .2f, % .3f\n",x,y,z);
}
printf("\n");
}
return 0;
}
19
実行手順
Z:\nyumon2>cl gauss2g.c
...
Z:\nyumon2>gauss2g > gauss2.dat
このあと、gnuplot を起動し、
gnuplot> splot 'Z:\nyumon2\gauss2.dat' \
> with lines
20
スキルアップタイム:(gauss22g.c)
1. 最初に
絶対値は fabs( )
f (r) = exp(-r2) | cos(2pr) |
のデータを出力したあと、2回改行し、続けて
f (r) = exp(-r2) + 1
を出力するプログラムを作成し、gauss22.dat に保存
せよ。ただし、r2 = x2+y2, -2 ≦ x, y ≦ 2.
2. つぎに、gnuplotにより gauss22.dat の3-D
プロットを描け。
21
スキルアップタイムの出力例
"gauss22.dat"
2
2
1.5
1.5
1
1
0.5
0.5
0
0
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
22
ヘルプ、その他
Help メニュー : コマンドの詳しい使い方など
 コマンド、オプションは誤解されない範囲で
短く省略可






plot → p, splot → sp, replot → rep
with → w, lines → l, title → t, using → u
xrange → xr, xlabel → xl, logscale → logs
palette → pal, hidden3d → hid など
デモは C:\Gnuplot\demo\all.dem
23
faceg.dat の表示
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>
set view 180, 0
 真下から見る
unset surface
 メッシュを非表示
unset xtics
 軸も非表示
unset ytics
 正方形にセット
unset ztics
 グレイスケールで表示
set size square
 gnuplot 用にデータを並べ
set pm3d
替えた faceg.dat を3D表示
set palette gray
splot 'Z:\nyumon2\faceg.dat'
24
face.dat → faceg.dat の変換
#include <stdio.h>
face4g.c
#include <string.h>
int main(void)
{
int i;
char *p,s[520];
while (fgets(s,520,stdin)!=NULL) {
p=strtok(s," ");
if (p && (*p!=' ')) printf("%s\n", p);
for (i=1;i<128;i++) {
p=strtok(NULL," ");
if (p && (*p!=' ')) printf("%s\n", p);
}
printf("\n");
}
return 0;
}
25
face.dat → faceg.dat の変換
Z:\nyumon2>cl face4g.c
Z:\nyumon2>face4g < face.dat > faceg.dat
26