gnuplot-book

Version

   gnuplot -v

        G N U P L O T
        Version 5.2 patchlevel 2    last modified 2017-11-01

        Copyright (C) 1986-1993, 1998, 2004, 2007-2017
        Thomas Williams, Colin Kelley and many others

        gnuplot home:     http://www.gnuplot.info
        faq, bugs, etc:   type "help FAQ"
        immediate help:   type "help"  (plot window: hit 'h')

Reference

データブロック

データの段落分け, index

段落に分けることで異なるデータを一つのファイルに含めることができる. 段落は 2 つの空行で区切る. 段落は block と呼ばれる. 各 block には名前を与えることが出来る.

index はこの内, プロットに用いるブロックを選択することが出来る. ブロックの指定は番号かまたはデータに名前をつけることでその名前でも指定することもできる.

every はコレとよく似ているが異なるデータフォーマットに対してより細かなデータの指定が出来る.

Data Format

データは 2行 の空行で区切る. データは先頭から 0-start の index が与えられる. データの先頭にコメントで名前 (<data_name>) を与えられる.

# data1
x1 y1
x2 y2
x3 y3


# data2
x1 y1
x2 y2
x3 y3

index keyword

次の2種類の使い方がある.

plot ... index <start_index>{:<end_index>{:<index_incr>}}
plot ... index <data_name>
paramsdefaultvalueexplanation
start_index(int) index読む block の最初 (0-indexed)
end_indexstart_index(int) index読む block の最後 (0-indexed)
index_incr1(int)start_index から end_index までの範囲にステップを与える
data_name(string)この名前のデータをプロットに使う

Example

Source Code

段落番号 (start_index) で指定する方法

plot 'index.dat' index 0 lc rgb "#0000ff" w lp title 'linear' ,\
     'index.dat' index 1 lc rgb "#00ff00" smooth bezier title 'exp'

data_name で指定する方法

plot 'index.dat' index 'linear' lc rgb "#0000ff" w lp title 'linear' ,\
     'index.dat' index 'exp' lc rgb "#00ff00" smooth bezier 'exp'

Data

# linear
0 0
1 2
2 4
3 6
4 8
5 10


# exp
0 1
1 2
2 4
3 8
4 16
5 32

Result

データの段落分け, every

段落に分けることで異なるデータを一つのファイルに含めることができる. 段落は 1 つの空行で区切る. 段落は block と呼ばれる. 空行を除いた行を point (または column) と呼ぶ.

index もこれとよく似たが異なるデータフォーマットに対した操作を提供している.

Data Format

# data1
x1 y1
x2 y2
x3 y3

# data2
x1 y1
x2 y2
x3 y3

every keyword

plot ... every {<point_incr>}
    {:{<block_inr>}
    {:{<start_point>}
    {:{<start_block>}
    {:{<end_point>}
    {:{<end_block>}}}}}}
paramsdefaultvalueexplanation
point_incr1(int) index読む point (行) のステップ
block_inr1(int) index読む block のステップ
start_point0(int) index読む point の最初 (0-indexed)
start_block0(int) index読む block の最初 (0-indexed)
end_pointlast(string)読む point の最後
end_blocklast(string)読む block の最後

例えば、 1 番目のブロック (0-start) のみ指定するには every :::1::1 とする (何度も言うがこれなら index の方が分かりやすいし良い).

Example

Source Code

plot 'blocks.dat' every :::0::0 lc rgb "#0000ff" w lp title 'data1' ,\
     'blocks.dat' every :::1::1 lc rgb "#00ff00" smooth bezier title 'data2'

Data (blocks.dat)

# linear
0 0
1 2
2 4
3 6
4 8
5 10

# exp
0 1
1 2
2 4
3 8
4 16
5 32

Result

データの入力

インラインデータ

スクリプトの中で直接データを書いて使う方法

複数行文字列リテラルとして与える方法

変数にデータを代入してこれを plot させる. 以下の例では $data にデータを入れて使っている.

$data << EOD
0 0
1 1
2 4
3 8
4 16
5 24
6 32
EOD

plot $data w lp

標準入力から与える方法

ファイル名を '-' とすると標準入力から読む. 標準入力といってもバッチ実行モードでは, plot コマンドに続くデータがそのまま標準入力として渡されるので, スクリプトにデータを記述できる.

e コマンドでデータの入力を終わる.

plot '-' w lp
0 0
1 1
2 4
3 8
4 16
5 24
6 32
e

複数 '-' をプロットすれば複数回データの入力を読む.

plot '-' w lp, '-' w lp
1
2
3
e
1
4
9
e

シェルの実行

< から始まる文字列を plot の対象にすると, gnuplot はこれをシェルコマンドとして実行して, その標準出力を用いる.

Example

seq

seq 100 は 1 から 100 までの整数を 100 行で出力する. これをデータと思えば次のような事ができる.

plot '<seq 100' ,\
     '<seq 100' u 1:($1*sin($1/pi)) smooth bezier

データのフィルタ

次のようなテキストファイル (data.txt) があるとする.

A 3
B 10
A 4
B 11
A 5
B 12

このときに A のある行だけのプロット, B の行のプロットを行うには, grep によるフィルタを利用すればよい.

plot '< grep A data.txt' title 'A' ,\
     '< grep B data.txt' title 'B'

日付時刻データ

よくあるシチュエーションは x 軸または y 軸のどちらか一方が日付時刻を表現していることだ. このとき, データには一種類のフォーマットで日付時刻が書かれていることになる. gnuplot はこれをサポートしていて, x/y 軸が日付時刻を表していることと, パースに用いるフォーマットを指定すれば読むことが出来る.

本章の最後でも触れるが, 異なるデータフォーマットが混在している場合, 例えば x/y 軸両方ともが日付時刻であってそれぞれ違う書き方がなされている場合は, 出来なくはないが, 直接のサポートがなされてはいない.

日付時刻であることの宣言

x/y 軸それぞれについて日付時刻データであることは次で宣言する.

set xdata time
set ydata time

timefmt

日付時刻データだと宣言された値はデフォルトでは "%d/%m/%y,%H:%M" だとしてパースが行われる. このフォーマットは,

set timefmt <format>

として自由に宣言できる.

また xtics ytics の表示に使うフォーマットは, これとは別に宣言できて, 次のようにする.

set format x <format>
set format y <format>

この <format> は先程の timefmt で使う <format> と全く同じ形式で記述する. フォーマットは C 言語のように %- 指定子を含んだ文字列として指定する.

%-指定子

formatexplanation
%d日 (1-31)
%m月 (1-12)
%y年の下2桁 (0-99)
%Y年の4桁
%jday of the year (1-365)
%H時 (0-24)
%M分 (0-60)
%S秒 (0-60)
%sUNIX time
%B月の英語表記
%b月の英語表記 (3文字省略形)

NOTE. using キーワード

gnuplot は plot するデータを読むとき, 一行をホワイトスペース文字で分割して, これの何番目を x データ, 何番目を y データという風に使っている. ここで疑問になるのは, 空白文字を含む日付時刻データを表現できるのかということだ. 問題なく出来る. timefmt には空白文字を含んだフォーマットを指定すればよい. ただし, plot コマンドは using を要請してくるかもしれない. これは明示的に何番目と何番目を x, y データにするかという指定である.

次のようなデータを考える.

2020-01-02 13:00 3.141592

これは '%Y-%m-%d %H:%M' というフォーマットの日付の後ろに一つの数値が続いている. gnuplot はこのままでは3つの数値が並んでいると解釈する.

そこで初めの二つが x のための一塊の日付データであることを宣言する.

set xdata time
set timefmt '%Y-%m-%d %H:%M'

こうなるともともと二番目が y であるというデフォルトの設定が壊れるので, gnuplot はユーザーに明示することを求める. そこで, (もともとの分割で)1 番目が x で, 3 番目が y であると注釈して plot を行う.

plot 'data.txt' using 1:3

これで期待通りのプロットが得られた.

異なるフォーマットを共存させるには

x と y が異なるフォーマットの日付時刻データである, 或いは複数のデータを同時にプロットさせるに当たって別のフォーマットが使われてるなどの場合, 異なるフォーマットを指定したくなる. しかし set timefmt は設定を上書きするだけであって, x と y のパースに異なるフォーマットを与える事はできない.

やや強引にやってやれないことはない. https://stackoverflow.com/a/31009235 が参考になった. using の中で strptime 関数を直接呼び出せばよい. gnuplot 5.0 以上ならより簡素な timecolumn 関数の方が便利

Example

timecolumn 関数を使って, x, y で別のフォーマットが使われているデータをプロットする.

# x = %Y-%m-%d
# y = %H:%M:%S
$data << EOD
2017-10-23 13:43:00
2017-10-24 14:37:45
2017-10-25 14:18:06
2017-10-26 14:31:48
2017-10-27 12:12:41
2017-10-30 13:56:49
EOD

set xdata time
set ydata time

xformat = '%Y-%m-%d'  # parse format (for timecolumn)
yformat = '%H:%M:%S'

set format x '%m/%d'  # tics format
set format y '%H:%M'

plot $data using (timecolumn(1, xformat)):(timecolumn(2, yformat)) w lp

装飾

xtics

ytics も全く同様

Reference

刻み幅の指定

目盛りの刻み幅を指定する.

set xtics 5

目盛りラベルの回転

set xtics rotate by 30 right

角度 (deg) とどこを中心に回転するかの指定. 角度は反時計回りで, 負数で時計回りに回せる. right キーワードでラベルの右端を中心に回転することを指定する. 省略すると左端を中心に回転する.

Example

set xtics rotate by 30 right
set xrange [-100:100]
plot x title "rotate by 30 right"

ラベル文字列の指定

ラベル文字列と座標の組のリストを与えることで, 数字付きの tics じゃなくてラベル文字列を指定した座標に置く事ができる.

set xtics ("label1" x1, "label2" x2, "label3" x3)

Example

set xrange [0:6]
set xtics ("zero" 0, "two" 2, "last" 6)
set grid
plot x

点の周りにスペースを空ける, pointinterval

概要

with linespoints のときに点を線でつないで描画されるがそのとき点の周りに少しスペースを空ける事ができる. これを実現するには, pointinterval (pi)-1 を指定して, set pointintervalbox でスペースの大きさを指定すると実現できる.

Example

set style line 1 pi -1
set style line 1 pt 6  # 点を丸にする
set pointintervalbox 3  # 点と線をあける距離

$data << EOD
1
3
5
6
7
EOD
plot $data w lp ls 1

awesome style

set terminal pngcairo

set style line 1 lw 2 pt 6 lc rgb "#00aaaa"

set style line 11 lc rgb '#808080' lt 1 lw 3
set border 0 back ls 11
set tics out nomirror

set style line 12 lc rgb '#808080' lt 0 lw 1
set grid back ls 12

set xrange [-4:4]
plot x**3 linestyle 1

result

gnuplot はそのまま使うと一見して gnuplot で作ったダサい見た目になりがち. 小洒落たスタイルでライバルに差をつけろ.

曲線の近似, fit

fit

fit コマンドを使うとデータ点列を説明 (近似) するような曲線を探索できる.

SYNOPSIS

f(x) = g(x, a, b, c)
fit [:][:] f(x) 'data' via a, b, c

ノイジーな正弦曲線を描く Ruby スクリプトをデータの例に使う.

# data.rb
def noisy_sin(x)
  return Math.sin(x) + (rand - 0.5) * 0.2
end

100.times do |i|
  x = (i - 50) / 20.0
  puts "#{x} #{noisy_sin x}"
end

ランダムなので実行のたびに結果が変わるけど, そこは目をつむってもらって gnuplot からは <ruby data.rb を参照する.

fit コマンドを使うには, このデータを近似する関数を定義する. ただし関数の定義には自由な変数を使って良い. 例えば下の例では \( f(x) = ax^3+bx+c \) という関数を定義し, 係数に \( a,b,c \) という自由変数を含んでいる.

係数には適用な値を代入して初期化しておく. 初期化されてない場合は 1 が自動的に使われるが, ある程度当たりをつけて良い初期値を入れることは結果の精度の為に大事になってくることがある.

f(x) = a * x**3 + b * x + c
a = 1
b = -2
c = 0

この f(x) を使って fit コマンドを次のように叩く. via キーワードの次に探索して欲しい変数を列挙する.

fit f(x) '< ruby data.rb' via a, b, c
plot '< ruby data.rb', f(x)

fit コマンドが終了した時点で, a, b, c には fitting し終えた値が代入されているので, そのまま plot f(x) をすれば, 結果の曲線を描かせることができる. 今回は次のような結果が得られた.

f(x) は多項式である必要はない. 例えばデータが正弦波っぽく見えたのなら直接正弦波に近似させればよい.

f(x) = a * sin(b * x + c)
a = 0
b = 0
c = 0
fit f(x) '< ruby data.rb' via a, b, c
plot '< ruby data.rb', f(x)

おそらく a=1, b=1, c=0 に近い値がセットされるはず.

プロット

散布図

Data

一点を一行に x, y 座標を並べて記述する.

x1 y1
x2 y2
x3 y3

Source Code

オプションなしに plot コマンドを使うと散布図がプロットされる.

$data << EOD
0 0
0 1
1 1
1 2
2 2
EOD

set xrange [-1:3]
set yrange [-1:3]
plot $data pointtype 6

Result

テキスト(ラベル)の散布図

ただの点の代わりにテキスト(ラベル)を用いた散布図を作るには with labels を用いる.

$data << EOD
0 0 A
0 1 B
1 1 C
1 2 D
2 2 E
EOD

set xrange [-1:3]
set yrange [-1:3]
plot $data with labels

データの3つ目がデフォルトではラベルとして使われる.

plot $data with labels boxed

ヒストグラム(度数表)

概要

ある値の列からなるデータがあるとき, コレに関するヒストグラムを作成する. 直接的にその機能は gnuplot にはなく, 度数を計算する必要があるが, 次の方法を使うとうまくこれが gnuplot の機能で実現する.

手法

x:(1.0) からなる折れ線グラフを with frequency で描くと重複した点の個数だけ y を加算する. これに with boxes 等の装飾を施すことでよくあるヒストグラムを描ける.

Example

データはソートしておいた方が無難. x の上に置く box は x を中心とする幅を持った箱として描画されるので, 必要に応じて 0.5 だけずらすなどすると見やすくなる.

Source Code

width = 1.0
hist(x) = width * (floor(x / width) + 0.5)
set boxwidth width * 1.0
set xtics width

$data <<EOM
0
1
1
1
1
2
2
3
6
8
EOM

set xrange [0:10]
set yrange [0:]
set ytics 1
set grid
set style fill solid 0.5 border lc rgb '#55aaff'
plot $data u (hist($1)):(1) smooth frequency with boxes fillcolor '#55aaff' not

箱ひげ図 (boxplot, box-and-whisker plot)

参考

概要

\(\{ (\text{label}_i, z_i) \}_i\) \( (z_i \in \mathbb{R}) \) というデータ列から, 次の図のような, いわゆる箱ひげ図を作成する.

手法

with boxplot によって直接サポートされている.

Data Format

一列目にデータのラベル (またはカテゴリ) を文字列で与える. これに関してソートする必要はない. 二列目にデータの実数値を与える.

Label_1 z1
Label_2 z2
:
Label_n zn

with boxplot

plot ... using <x>:<z>{:<box_width>{:<label>}} with boxplot
paramsdefaultvalueexplanation
x--(double)xデータ (箱ひげ) を置く x 座標
z--(double)zデータ (実数値)
box_width--(double)箱の横幅サイズ
label--(string)データのラベル. これを与えるとき x は無視される

ラベルを与える時 x は無視されるが何か与える必要があるので, 仮にゼロを与えておく.

先述のデータに合わせると次のようにすればよい.

using (0):2:(1):1 with boxplot

Example

Data (data.txt)


Label1 1.0615736091746653
Label1 0.9409952532221867
Label1 1.021612466595744
Label1 0.8935688060271614
Label1 1.0224404474617517
Label1 0.9661892724606262
Label1 0.9978595814447482
Label1 1.1127551356245484
Label1 1.1016617034534295
Label1 0.9210394458787583
Label1 1.0820741675354117
Label1 1.04330023111802
Label1 1.0005150566113892
Label1 1.1559580109911893
Label1 1.1233029737728761
Label1 0.9474749102980315
Label1 1.0707941673561174
Label1 0.9269711019325906
Label1 0.9582840543918602
Label1 1.0341070340590386
Label1 0.9719420637089871
Label1 1.0380944985473386
Label1 0.9696442248316298
Label1 0.9032356007739286
Label1 0.9475300145319969
Label1 1.1176373421060464
Label1 1.1027176241074508
Label1 0.933838661044742
Label1 0.9320799966742921
Label1 0.9881518086130608
Label1 0.9452352866888151
Label1 0.9855244566192534
Label1 1.1529506550742137
Label1 0.9655108140953337
Label1 1.1077149125236252
Label1 0.9545337303266723
Label1 0.9864761998749835
Label1 0.9992270973259703
Label1 1.0003472317982158
Label1 0.9669086586777813
Label1 1.0106215356365427
Label1 1.0694842820371275
Label1 1.048621359612009
Label1 0.9571141696805319
Label1 1.033258266154869
Label1 1.1092157291217004
Label1 0.9772753273440217
Label1 1.0516819827815074
Label1 0.9930686178999505
Label1 0.9695499340325655
Label1 1.058463723596836
Label1 1.0646466807321475
Label1 1.039382795500945
Label1 0.8016797870382525
Label1 0.9551423217491737
Label1 1.005006229693936
Label1 1.0298153359978677
Label1 0.9745127192018938
Label1 1.06121120938568
Label1 1.0172213952705071
Label1 0.8577883940535215
Label1 1.0730787104344803
Label1 0.9353661239234157
Label1 0.8878019375801003
Label1 0.9200416472254476
Label1 1.10202551417308
Label1 0.9953501566212274
Label1 0.9765505280492441
Label1 0.9934534876777504
Label1 0.9279105001877123
Label1 0.9311577450839491
Label1 1.0382565034812055
Label1 1.0807674382580108
Label1 1.1058527324445429
Label1 0.9536624649476464
Label1 1.090047310657586
Label1 1.0342275655050817
Label1 0.9010216243779239
Label1 0.9849931815493391
Label1 0.9455332189802604
Label1 0.9366573719398363
Label1 0.9792632919138815
Label1 1.0673954929564329
Label1 1.0788127015434597
Label1 1.0401365015326332
Label1 1.0149435226488914
Label1 1.1044694815360434
Label1 1.0710494392439736
Label1 1.029971424957326
Label1 0.907396727162235
Label1 0.9368299278735874
Label1 0.9375642076839391
Label1 0.9230619994657261
Label1 1.034461417462147
Label1 0.9593967932528256
Label1 0.9719254811281577
Label1 1.0387483102509225
Label1 0.9645077135736616
Label1 0.9673363635776973
Label1 1.083377921829951
Label2 1.1140536481728907
Label2 0.9654311468502879
Label2 1.0072034351318897
Label2 0.7645604617492925
Label2 0.8392703482428308
Label2 0.976250057889414
Label2 0.5990641184705816
Label2 0.8380012721558732
Label2 1.0035631655139747
Label2 1.1808497231287727
Label2 0.8564673010352255
Label2 0.9745542687000399
Label2 0.8808016171091044
Label2 0.8657582290481092
Label2 1.01875121639354
Label2 0.9488799185405365
Label2 0.9700677235401467
Label2 1.1620803369440535
Label2 1.0900652181216892
Label2 1.2796516746441746
Label2 0.6920004621992418
Label2 1.18769693522479
Label2 0.8401843624543999
Label2 0.999731755629597
Label2 1.0379869812764944
Label2 1.169339327212957
Label2 1.1065612897474275
Label2 0.9318951992749085
Label2 0.9075922105985541
Label2 0.9643943402394666
Label2 1.103034508986277
Label2 1.343461136243981
Label2 0.6019797237657606
Label2 0.7439376596771563
Label2 0.8444287387561433
Label2 1.3020239636373763
Label2 0.7333487819632483
Label2 1.1025954377572993
Label2 0.7448648734731773
Label2 0.9186726148655824
Label2 1.2736324607754193
Label2 0.738547568433712
Label2 0.8997911309025082
Label2 0.8183666890944847
Label2 1.2305161819556596
Label2 0.8431803874807591
Label2 1.0421608735310546
Label2 0.8703113248033603
Label2 0.985872237356056
Label2 1.0702074132990238
Label2 0.736884590985943
Label2 1.204378967522794
Label2 1.0559821939077376
Label2 1.2243650688093677
Label2 0.8770786400785613
Label2 0.9431412119605815
Label2 1.1587470690948034
Label2 1.0820150639003154
Label2 1.068216370162204
Label2 1.0862971817469724
Label2 1.0602079089156522
Label2 0.9741626353656363
Label2 0.8514434676459397
Label2 1.0422702760367746
Label2 0.8342329643622799
Label2 1.04598974412835
Label2 1.118337840796598
Label2 1.1541095322445498
Label2 1.0671985326270028
Label2 0.9921031013544135
Label2 0.7991098543565645
Label2 0.8025079639486893
Label2 0.7873720427596531
Label2 1.17644344114844
Label2 0.9017761717860211
Label2 1.2325537126446182
Label2 1.3790767902319523
Label2 0.834204048131308
Label2 1.19896383864128
Label2 1.284211366903643
Label2 1.0026063764611894
Label2 0.8227679581718057
Label2 1.307136977957998
Label2 1.0444638948513583
Label2 1.3549943740829442
Label2 1.0844549039775195
Label2 1.317654569043726
Label2 1.1063868777177488
Label2 0.6493872700423977
Label2 1.3594778312593627
Label2 1.338062365553617
Label2 1.0238162018568993
Label2 0.9763703711732645
Label2 1.1206954992017968
Label2 1.1707303801478295
Label2 1.1098209988634946
Label2 1.0227536289855048
Label2 0.8128615195559445
Label2 0.9673353252194339
Label2 1.2047888354760614
Label3 0.5142551015781237
Label3 0.4543057623585313
Label3 0.4531749926703077
Label3 0.48366076176550665
Label3 0.4882834640187006
Label3 0.4580007777054271
Label3 0.4511591973406706
Label3 0.4895097408191484
Label3 0.5329419883612687
Label3 0.5073465220061663
Label3 0.553665903126604
Label3 0.5125565716535394
Label3 0.5064784727203651
Label3 0.4915476117281144
Label3 0.5199793237483948
Label3 0.5533038298565817
Label3 0.4596452171947456
Label3 0.49234192751323397
Label3 0.45981983116631875
Label3 0.46678102685181655
Label3 0.4675946531066316
Label3 0.4791166260360197
Label3 0.5339293985406127
Label3 0.5044951008880407
Label3 0.468439539866198
Label3 0.5412932409671252
Label3 0.5050151849881355
Label3 0.457661329345758
Label3 0.4801070293435854
Label3 0.4895079651566656
Label3 0.5307725497729896
Label3 0.4770394661958832
Label3 0.5458251641478383
Label3 0.48719290103259233
Label3 0.493902831741011
Label3 0.4684886716663316
Label3 0.5106616471106656
Label3 0.43985179427762006
Label3 0.5100289180635535
Label3 0.49105881770638904
Label3 0.5006929938151032
Label3 0.4205157631344141
Label3 0.4896354045961837
Label3 0.5214170188862951
Label3 0.4954576988782891
Label3 0.5128906445762597
Label3 0.4893522622337194
Label3 0.5348450354119353
Label3 0.540807960920562
Label3 0.4783686743022514
Label3 0.5354571299421252
Label3 0.41804886150008075
Label3 0.5008395090647499
Label3 0.520352926239639
Label3 0.46931543637664036
Label3 0.4829886328506878
Label3 0.5328436338152367
Label3 0.5010186015477949
Label3 0.46172801207972547
Label3 0.49344169414465205
Label3 0.47975646724709775
Label3 0.47860712998302263
Label3 0.47940533521467144
Label3 0.5064141556425302
Label3 0.5435954464135971
Label3 0.4726682971819423
Label3 0.4915653483459668
Label3 0.5429375594647708
Label3 0.5146961771791269
Label3 0.4602116215820299
Label3 0.48364222133902723
Label3 0.4880924356997455
Label3 0.463293654288834
Label3 0.5290598992663654
Label3 0.5053241702600492
Label3 0.49873576395994607
Label3 0.4856733190958129
Label3 0.5095764551389661
Label3 0.46860168864284146
Label3 0.47401577020214813
Label3 0.4769570659881741
Label3 0.4675472572820617
Label3 0.43982243691092143
Label3 0.4785556880114518
Label3 0.48797910910782355
Label3 0.5352870207701941
Label3 0.5448180495250096
Label3 0.48879005713593154
Label3 0.5100877092012684
Label3 0.5184395026828384
Label3 0.5121601200254514
Label3 0.47587957491496463
Label3 0.5055463257181718
Label3 0.5127501923045343
Label3 0.4758265536759175
Label3 0.46611694850111995
Label3 0.4785810300794278
Label3 0.508939248784815
Label3 0.5101959427210576
Label3 0.5100732410148193
Label1 0.16537364208595623
Label1 0.6776651320647064
Label1 0.5939587550913237
Label1 0.5188986682173724

Source Code

set grid
set ytics 0.1
unset key
plot 'data.txt' using (0):2:(0):1 with boxplot

Result

エラーバー, 誤差付きプロット, yerrorbars

参考

概要

y軸方向にエラーバーについたプロットを行う. エラーの大きさ(半径)を指定する方法と, 上限と下限のそれぞれを指定する方法の二つがある.

with yerrorbars

次のいずれか.

plot ... using {<x>:}<y>:<ydelta> with yerrorbars
plot ... using <x>:<y>:<ylow>:<yhigh> with yerrorbars
paramsdefaultvalueexplanation
x--(double) xx 座標
y--(double) yエラーバーの中点 y 座標
ydelta--(double)これのプラスマイナスを ylow yhigh とする
ylow--(double)エラーバーの下点 y 座標
yhigh--(double)エラーバーの上点 y 座標

Examples

ydelta

ydelta \( \Delta \) を指定する場合は \( y \pm \Delta \) をエラー範囲とする.

$data << EOM
-5 -10 2.5
-4 -8 1.6
-3 -6 0.9
-2 -4 0.4
-1 -2 0.1
0 0 0.0
1 2 0.1
2 4 0.4
3 6 0.9
4 8 1.6
EOM

set grid
plot $data u 1:2:3 with yerrorbars

陰関数

xy 座標上の関数 \[ f(x,y) = 0 \] で表現されるグラフのプロットを考える.

手法

三次元グラフとして描画する. これを \(z=0\) 平面で切り取ると目的のグラフが得られる.

Example

\(x^2 + xy + y^2 = 1\) を描画する. 定数を移項することで \(f(x,y)=0\) の形にする.

set view 0,0
unset surface
set isosamples 100,100
set contour
set cntrparam levels discrete 0
set xrange [-2:2]
set yrange [-2:2]

f(x, y) = x * x + x * y + y * y - 1
splot f(x, y)

等高線

方法

set contour
unset surface
set view 0, 0

set isosamples 100
set cntrparam levels 9

set key out

splot x**2 - y**2

ヒートマップ, 混合行列

参考

概要

混合行列 (Confusion Matrix) などと呼ばれるあの表を色付きで図示する. 色の濃さで数の大きさを表現する.

上の参考リンクでは色が連続して変化するように中間値補完が為されてるが, 私の知ってるgnuplotのバージョンではこれは再現できない. これをするには pm3d を使ったほうがいいと思う.

方法

Data Format

行列 (matrix) 形式でデータを与えることにする. すなわち, データ $z$ を $n$ 行 $m$ 列に並べたものをデータとする.

z11 z12 z13
z21 z22 z23
z31 z32 z33
z41 z42 z43

混合行列を図示する目的のためには行と列とに見出し (座標ではなくラベル) があるべきで, どうせならデータに含めたい. gnuplot の matrix data は行ごとのアイテム数は揃ってる必要があるので, 0行目0列目にはダミーデータを入れた上で, 1行目または1列目に見出しを入れられる.

xxxx Col1 Col2 Col3
Row1  z11  z12  z13
Row2  z21  z22  z23
Row3  z31  z32  z33
Row4  z41  z42  z43

with image

plot ... using <x>:<y>:<z> with image
paramsdefaultvalueexplanation
x--(int)データの $x$ 座標
y--(int)データの $y$ 座標
z--(double)データ. 対応する色が塗られる

ただし, matrix で読む場合は x, y は自動的に column 1, 2 として適切な値が入ってると見なしてよい.

columnheaders, rowheaders

plot ... matrix column rowheaders

データの一行目, 一列目の文字列を見出しだと思って, 二行目, 二列目以降のデータだけを使う.

Example

$data << EOM
xxxx Col1 Col2 Col3
Row1    1    2    3
Row2    2    4    6
Row3    4    8   12
Row4    8   16   24
EOM

unset key
set title 'Heatmap with image'

set cbrange [0:30]  # the range of colorbox
set palette cubehelix start -2 cycles 0 saturation 3 gamma 3 negative  # color scheme

plot $data matrix rowheaders columnheaders u 1:2:3 with image ,\
        '' matrix rowheaders columnheaders u 1:2:(sprintf("%g", $3)) with labels

格子線 (gridline)

set grid によってセル同士の境界に線を引きたい. デフォルトだとセルの色塗りは gridline の後に行われて上書きされるので set grid front とする. ltlc, lw で線のスタイルは調整する.

$data << EOD
X a b c d e
A 0.0 -0.06 -0.25 -0.56 -1.0
B 0.11 0.04 -0.13 -0.45 -0.88
C 0.44 0.38 0.19 -0.11 -0.55
D 1.0 0.93 0.75 0.43 0.0
E 1.77 1.71 1.52 1.21 0.77
EOD

set grid front lw 1.5 lt -1 lc rgb 'white'
plot $data matrix rowheaders columnheaders w image not

xy に gridline を引いてもちょうど 0.5 ずれた, セルの真ん中に引くようになってしまう. なぜならセルはちょうど格子点 \( (x, y) \) に対して, \( (x-0.5, y-0.5) \ldots (x+0.5, y+0.5) \) という矩形領域を占めているためである.

ちょうど 0.5 ずらした格子線を手に入れるために小目盛り (minor tics) を利用する. ただし xy の大目盛りがラベルのために使われている (数値で指定されていない) ときは小目盛りは使えないことになっているので, x2y2 を使う.

まず x2, y2 を宣言し set linkxy と同期させる. これに小目盛り mx2, my2interval=2 で宣言することで, ちょうど半分に分割する目盛りを作れる. grid の引数に mx2tics, my2tics を追加すればよい.

変更点だけ書き出すと次の通り.

+set x2tics
+set y2tics
+set link x2
+set link y2
+set mx2tics 2
+set my2tics 2
-set grid front lw 1.5 lt -1 lc rgb 'white'
+set grid front mx2tics my2tics lw 1.5 lt -1 lc rgb 'white'

最後に余計なラベルや刻み線を消す処理を追加して結局

$data << EOD
X a b c d e
A 0.0 -0.06 -0.25 -0.56 -1.0
B 0.11 0.04 -0.13 -0.45 -0.88
C 0.44 0.38 0.19 -0.11 -0.55
D 1.0 0.93 0.75 0.43 0.0
E 1.77 1.71 1.52 1.21 0.77
EOD

set xtics scale 0  # 刻み線の長さ
set ytics scale 0
set x2tics format '' scale 0.01  # こちらもゼロにしたいがすると格子線まで消えてしまうので
set y2tics format '' scale 0.01
set link x2
set link y2
set mx2tics 2
set my2tics 2
set grid front mx2tics my2tics lw 1.5 lt -1 lc rgb 'white'
plot $data matrix rowheaders columnheaders w image not

となった.