#author("2026-06-24T20:46:49+09:00","default:okazaki","okazaki")
#author("2026-06-24T20:47:14+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)
* howto/gnuplot [#t270cd76]
#contents
** 一行メモ [#j8fe0a8a]
- set size ratio -1  #縦横のアスペクト比を等しくする --  &new{2026-06-24 (水) 20:46:49};
- set size noratio   #もとにもどす

#comment

//--------------------------------------------------------------------------------

* gnuuplot [#m8df4caa]

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

//--------------------------------------------------------------------------------

** 基本的な例 [#hb9cfd9f]

スクリプト無しで 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           #終了

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

次の 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画像として保存 [#f2311cea]

 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ではなくコマンドを打って調整する)。


//--------------------------------------------------------------------------------

** スクリプト [#s2b0da07]

スクリプトは単に、実行する 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'
 }


//--------------------------------------------------------------------------------

** 諸設定 [#m1e2dc85]

*** 略称 [#e244c2d8]

いろいろな単語について、略称が使える。以下は例である。
 using -> u
 with lines -> w l
 with linespoints -> w lp

 linewidth -> lw
 pointsize -> ps


*** ライン幅やマーカーの大きさ [#z0d0932b]

 lw 2  #ライン幅 2にする
 ps 2  #マーカーの大きさを 2にする

 plot 'data.txt' u 1:2 w lp lw 2 ps 2  #のように使う
([[下記>#q00660ce]]を参照)


*** グラフの軸などの設定 [#mda7a004]

 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句) [#n5c25153]

データファイルが空行でいくつかのブロックに分かれているとする。
通常 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行おきに使うようにもできる。


*** 関数の定義 [#w0200658]

例)
 deg(x)=180.0/pi*x
 
 rad(d)=pi/180.0*d


*** 別プログラムの標準出力を読み込む [#jd07653a]

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


** x軸が時刻のときのプロット [#ma84f32c]

例えばデータファイル内で
 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
とします。

次に時刻のフォーマットを予め与えておきます。
%Yは4桁の西暦、%Hは24時間表記での時間、などを意味します(詳細は略)。
 set timefmt "%Y/%m/%d %H:%M"
そして、x軸(横軸)の値を時刻データとして解釈するために
 set xdata time    #元に戻すには unset xdata
とします。以上をした後で、plot u 1:2 で通常通りグラフを描くことができます。


//--------------------------------------------------------------------------------
** 色名の一覧・線の太さやマーカーの例 [#q00660ce]

〇 色の一覧 (Color-name and point-shapelists for gnuplot 4.6.3)~
[[こちら>http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/colorname_list2.html]]のページを参照のこと。~

////1000x800を30%としたいが、なぜか効かない。
//#ref(http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/img/colorname-list2.png,left,30%,nowrap)      //効かない2026/05/14
//#ref(http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/img/colorname-list2.png,left,1000x800,nowrap) //効かない2026/05/14
//#ref(http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/img/colorname-list2.png,left,200x160,nowrap)  //効く2026/05/14
//#ref(colorname-list2modthumb.png,left,nowrap)  //効く

  [[&ref(colorname-list2modthumb.png,left,nowrap);>http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/img/colorname-list2.png]]

〇 線の太さやマーカ~
これは gnuplot> test で得られる図である(環境依存)。
#ref(linepointstyles_bygnuplot.png,left,30%,nowrap)


線やマーカーの指定例(with lines や with linespoints のオプション)
 lt 0  点線,    lw 2 太線
 pt 2  ×印,    ps 2 大きい印サイズ
 pt 6  ○印,    ps 1 デフォルトの印サイズ(環境依存)
 pt 1  +印,    ps 0.5  整数でなくてもよい


//--------------------------------------------------------------------------------
** gnuplotのグラフウィンドウ上での操作コマンド [#zf2a6c51]

gnuplot 4.6 patchlevel 6 の場合のアイコンメニュー
#ref(gnuplot_menu_icon.png,left,100%,nowrap)

 拡大縮小: Ctrl+マウス中ホイール、 - と +,= キーでも可(カーソルを中心に拡大縮小)
 上下移動: マウス中ホイール、↑,↓キーでも可
 左右移動: Shift+マウス中ホイール、←,→キーでも可
 
 座標表示: マウス中クリック(デフォルトではグラフの拡大縮小移動で消える)
 枠非表示のトグル: b
 ルーラー表示のトグル: r キー(カーソルのある位置に表示)
 
 操作方法の表示: hキー(端末に表示)
 
 前の表示/次の表示へ戻る/進む: p,n(下図のアイコン -,+とも同じ)
 最初の表示に戻る: u
 
 マウスで囲んだ領域を拡大表示: マウス右ドラッグ後、左クリック
                               (ヒント:pキーで元に戻り、nキーで拡大表示に戻れる)

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


//--------------------------------------------------------------------------------

** 練習問題 [#h3a0f29e]

(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