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など組込み関数も利用可。
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
データファイルが空行でいくつかのブロックに分かれているとする。 通常 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'
例えばデータファイル内で
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)
こちらのページを参照のこと。
〇 線の太さやマーカ
これは gnuplot> test で得られる図である(環境依存)。
線やマーカーの指定例(with lines や with linespoints のオプション)
lt 0 点線, lw 2 太線 pt 2 ×印, ps 2 大きい印サイズ pt 6 ○印, ps 1 デフォルトの印サイズ(環境依存) pt 1 +印, ps 0.5 整数でなくてもよい
gnuplot 4.6 patchlevel 6 の場合のアイコンメニュー
拡大縮小: 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してみる。空き台数が少なくなっている日はどんな日か?