howto/gnuplot

一行メモ


gnuuplot

gnuplotは数値データを様々な形で可視化できる、広く利用されているソフトです。 コマンド入力により、ファイルのデータをグラフにしたり、 スクリプト(プログラム)を使って同様のことや、もっと複雑なことができます。 可視化も2次元だけでなく、3次元やアニメーションも可能です。

 gnuplot [オプション] [スクリプト ...]

のように実行する。スクリプト無しで実行すると、コマンド入力の プロンプトgnuplot> が表示される。スクリプトを複数与えると順番に実行される。 スクリプトとして - を与えるとコマンド入力となる。

基本的な例

スクリプト無しで gnuplotを実行し、関数やデータファイル(数値などが並んだテキスト)について、 以下のようなことができる。

gnuplot> plot sin(x)    #2次元のグラフを描く
gnuplot> splot sin(x)*y**2          #3次元のグラフ, **2は2乗の意味

gnuplot> set hidden3d; replot       #陰影処理する
gnuplot> set isosamples 20; replot  #描画のプロット点を倍の20にした
gnuplot> v=1                #変数定義
gnuplot> f(x)=cos(x)+v      #関数定義
gnuplot> plot f(x) with linespoints   #withを使って直線とプロット点で描画
gnuplot> set xrange[-pi:pi]; replot   #x軸の範囲指定、piは円周率
gnuplot> plot sin(x), f(x) with linespoints    #複数を描く
gnuplot> print 'hello', 'Hello' . 'Gnu', 'v=', v, 'f(3.14/2)=', f(3.14/2)
                                  #表示、ピリオドは文字列を結合させる演算子
gnuplot> pause -1  #ENTER待ち(注: ENTER以外は押さない、入力されてしまう)
gnuplot> quit           #終了

コメント: バージョンにもよるが、マウスやキーボードで グラフの拡大縮小や回転が可能である(下記参照)。

次の data1.txtというデータファイルがあるとする。

#  A   B     C
   0   0     0
   1   1     1
   2   4     3
   3   9     5
   4  11     4
   5   3.5   2
   6   miss  1   #無効
   7   0.5   0.5
   8   0.2   0.2
   7   2     2

このとき、

gnuplot> plot 'data1.txt' using 1:2 with linespoints    #usingでx, y (,z)の列を指定してグラフを描く
gnuplot> splot 'data1.txt' using 1:2:3 with linespoints

gnuplot> plot 'data1.txt' using 1:($2-1.5) with linespoints    #演算結果を使うことも可

コメント: #から右はコメント扱い。文字列があるとグラフ描画時に無効な値として飛ばされる。 欠損値を明示するときは NaN文字列を入れる(NaNの場合は両側の値を直線で結ばないようになる)。 ($2-1.5)のように列の値に演算した結果も利用できる(無効な値は演算の結果NaNになる)。 演算にはsinなど組込み関数も利用可。

png画像として保存

gnuplot> show terminal   #出力されるターミナルタイプを覚えておく。ここでは qt
   terminal type is qt 0 font "Sans,9"
gnuplot> set terminal png
gnuplot> show output
   output is sent to STDOUT
gnuplot> set output 'picture.png'  #出力先を変更。既存ファイルは上書きされる
gnuplot> replot                    #再プロットさせ、output出力に出させる
gnuplot> set output                #出力を標準出力に戻す
gnuplot> set terminal qt

コメント: pngの他に eps形式など様々なフォーマットで出力できる。 なお、terminalの種類により使われるフォントが同じではないため、 モニタ画面で見ていた通りの png画像が得られるわけではない(ひどい場合には replotではなくコマンドを打って調整する)。

スクリプト

スクリプトは単に、実行する gnuplotのコマンドを並べたもの。拡張子に決まりはない(.gpや.pltが よく使われている)。コマンド入力からスクリプトを実行する場合は次のようにする。

gnuplot> load 'script.gp'

また、

gnuplot  -e "f='hoge.txt'"  script.gp  -

で実行すると、スクリプトの中で変数 fが使えるし、そのスクリプトが終了すると、- の引数があるため、 引き続きコマンド入力待ちになる。

コマンドはセミコロンで並べて書ける。

a=1; b=2; print a, b

フロー制御は次のようなものなどがある。

do for [ i = 1:5 ] {
    print i
}
do for [ f in 'aa.dat b.dat c.dat'] {
    print f
}
if (a > 0) {
    print 'plus'
} else {
    print 'minus'
}

諸設定

略称

いろいろな単語について、略称が使える。以下は例である。

using -> u
with lines -> w l
with linespoints -> w lp
linewidth -> lw
pointsize -> ps

ライン幅やマーカーの大きさ

lw 2  #ライン幅 2にする
ps 2  #マーカーの大きさを 2にする
plot 'data.txt' u 1:2 w lp lw 2 ps 2  #のように使う

下記を参照)

グラフの軸などの設定

set title 'タイトル'  #グラフのタイトル
set xlabel 'らべる'   #横軸のラベル
set ylabel 'らべる'   #縦軸のラベル
set xtics rotate by -90  #目盛の数字を-90°回す;もとに戻すには set xtics noroatte
set format y '%.2f'      # y軸の表示形式の指定
show format            # 目盛の表示形式の確認表示
set format y '10^{%T}' # 目盛を10のべき乗で表示
set format y '% h'     # 目盛りの表示を自動(デフォルト)にする
set yrange [*:*] ; replot  #y軸範囲を自動設定に戻す、x軸についても同様
set ytics 0.3       #y軸の主目盛を0.3間隔にする、x軸についても同様
set ytics autofreq  #y軸の主目盛を自動に戻す

set mxtics 2  #x軸の副目盛数
set mytics 2  #y軸の副目盛数
set grid ; replot        #方眼グリッドを引く 
set grid mytics; replot  #副目盛りにも方眼グリッドを引く
set logscale y    #対数グラフにする。戻すときは unset logscale y

データ読込(every句)

データファイルが空行でいくつかのブロックに分かれているとする。 通常 plot 'data.txt' using 1:2 などでは空行を無視し、すべての行のデータでグラフをプロットする。 しかし every句を用いると、特定のブロックだけをプロットすることができる。

例) plot 'data.txt' every ::0:block::block using 1:2 など(blockは0,1,2などの値)
    block番目のブロックの、すべての行を最初から飛ばさず(行刻み無し)で最後まで使う指定。

every 行刻み:ブロック刻み:初期行:初期ブロック:終了行:終了ブロック

行刻み       何行毎に飛ばすか   (指定無しは飛ばさない)
ブロック刻み 何ブロック毎に飛ばすか(指定無しは飛ばさない)
初期行       何行目から使うか   (指定無しは最初の0行目から使う)
初期ブロック 何ブロック目から使うか(指定無しは最初の0ブロック目から使う)
終了行       何行目まで使うか   (指定無しは最後の行まで)
終了ブロック 何ブロック目まで使うか(指定無しは最後のブロックまで)

各ブロックについて、何行目から何行目までを使うかの指定もできる。 行刻みを指定することで 10行おきに使うようにもできる。

関数の定義

例)

deg(x)=180.0/pi*x

rad(d)=pi/180.0*d

別プログラムの標準出力を読み込む

リダイレクションのようなこともできる。 Linuxコマンドを利用して data.txtの先頭と末尾の何行かを除いて読み込ませたい場合は 次のようにする。

plot '< cat data.txt | tail -n +5 | head -n -2'

x軸が時刻のときのプロット

例えばデータファイル内で

2026/03/03 6:55, -1190
2026/03/03 7:15, -1173
2026/03/03 7:45, -1143
...

のようなcsv形式のデータファイルがあるとする。 デフォルトでは空白(連続するスペースとタブ)を区切りとして列を読みますが、 カンマ区切りで読むために

set datafile separator ","    #元に戻すには unset datafile separator

とします。

そして1列目の時刻として扱うためにフォーマットを与えます。 %Yは4桁の西暦、%Hは24時間表記での時間、などを意味します(詳細は略)。

set timefmt "%Y/%m/%d %H:%M"

次に1列目をx軸(横軸)にするので、x軸の値を時刻データとして解釈するために

set xdata time    #元に戻すには unset xdata

とします。以上をした後で、plot u 1:2 で通常通りグラフを描くことができます。

色名の一覧・線の太さやマーカーの例

〇 色の一覧 (Color-name and point-shapelists for gnuplot 4.6.3)
こちらのページを参照のこと。

  colorname-list2modthumb.png

〇 線の太さやマーカ
これは gnuplot> test で得られる図である(環境依存)。

nowrap

線やマーカーの指定例(with lines や with linespoints のオプション)

lt 0  点線,    lw 2 太線
pt 2  ×印,    ps 2 大きい印サイズ
pt 6  ○印,    ps 1 デフォルトの印サイズ(環境依存)
pt 1  +印,    ps 0.5  整数でなくてもよい

gnuplotのグラフウィンドウ上での操作コマンド

gnuplot 4.6 patchlevel 6 の場合のアイコンメニュー

nowrap
拡大縮小: Ctrl+マウス中ホイール、 - と +,= キーでも可(カーソルを中心に拡大縮小)
上下移動: マウス中ホイール、↑,↓キーでも可
左右移動: Shift+マウス中ホイール、←,→キーでも可

座標表示: マウス中クリック(デフォルトではグラフの拡大縮小移動で消える)
枠非表示のトグル: b
ルーラー表示のトグル: r キー(カーソルのある位置に表示)

操作方法の表示: hキー(端末に表示)

前の表示/次の表示へ戻る/進む: p,n(下図のアイコン -,+とも同じ)
最初の表示に戻る: u

マウスで囲んだ領域を拡大表示: マウス右ドラッグ後、左クリック
                              (ヒント:pキーで元に戻り、nキーで拡大表示に戻れる)

[ref] https://yutarine.blogspot.com/2019/06/gnuplot-keyboard-mouse-operations.html

練習問題

(1) x軸を 0~360° として sin(x) と cos(x) のグラフを plotで重ねて描いてみる。 このとき角度からラジアンへの変換は関数を定義して利用すること。 また、タイトル、x軸ラベル、y軸ラベルなどもいろいろ設定してみよ。

(2) データファイル demowav-x.txt には x軸上を右に進む自由電子の波(波動関数)が 入っています。少しずつ時刻が進んだ波が空行で区切られてブロックとして保存されています。 いくつかのブロックについて、波動関数の形を plotしてみる。どのように右に進んでいるか? (データファイルの1列目はx座標の値、2列目と3列目は波動関数の実部と虚部の値が入っています。)

(2) データファイル pparking.csv には3月から5月中旬にかけて 青森空港駐車場の空き台数 が入っています(ただし、マイナス符号が付いています)。 x軸を時刻にして、空き台数を plotしてみる。空き台数が少なくなっている日はどんな日か?


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS