gnuplot で時間軸を使うには

2017年8月15日

gnuplot で時間軸を使う方法を説明します。

gnuplot で時間軸を使うには入力データとグラフの軸に対して以下のように指定します:

  1. 入力データ
    • 入力データ(例えばx軸に使うデータ)が時間であることを指定する
    • 入力データのフォーマットを指定する
    • 軸が時間軸であることを指定する
    • 軸の表示フォーマットを指定する。

入力データについては次のように指定します:

set xdata time
set timefmt "%Y-%m-%d"

時間データを用いる宣言をすると、時間データはgnuplot内部では1970年からの秒数に変換されます。

軸については次のように指定します。下の例はx軸を時間軸に用いる場合です:

set xtics timedate
set xtics format "%Y-%m"
set xtics 3600 * 24 * 365 * 5

時刻・日時のフォーマット指定は以下のようなものが使えます:

指定 説明
%a 曜日の省略形(Mon, Tue, Wed, …)
%A 曜日のフルネーム(Monday, Tuesday, …)
%b or %h 月の名前の省略形 (Jan, Feb, Mar, …)
%B 月のフルネーム (January, February, March, …)
%d 1か月のなかの日(01-31 )
%D “%m/%d/%y” の略記法 (出力のみ)
%F “%Y-%m-%d”の略記法 (出力のみ)
%k 時間(hour) 0-23 (一桁または二桁)
%H 時間(hour) 00-23 (常に二桁)
%l 時間(hour) 1-12 (一桁または二桁)
%I 時間(hour) 01-12 (常に二桁)
%j 1年のうちの何日目か 001-366
%m 月 01-12
%M 分 00-60
%p “am” か”pm”
%r “%I:%M:%S %p” の略記法 (出力のみ)
%R “%H:%M”の略記法 (出力のみ)
%S 秒 (second), 出力では実数 00-60, 入力では倍精度
%s 1970年の最初からの秒数
%T “%H:%M:%S” の略記法 (出力のみ)
%U 1年のうちで何週目か (週は日曜開始)
%w 週のなかで何番目か 0ーp6 (日曜=0)
%W 1年のうちで何週目か (週は月曜開始)
%y 年(year) 1969-2068年の間で 0-99
%Y 年(year) 4桁

実際の使用例

Debian パッケージ数の推移をグラフ化してみたでプロットした例を以下に示します。

データは

# date ver codename package_num kernel_ver
1996-06-17 1.1 Buzz 474 2.0 
1996-12-12 1.2 Rex  848  2.0.27
1997-07-02 1.3 Bo 974 2.0.33
1998-06-24 2.0 Hamm 1500 2.0.34
1999-03-09 2.1 Slink 2250 2.0.38
2000-08-15 2.2 Potato 2600 2.2.19
2002-07-19 3.0 Woody 8500 2.4.6
2005-06-06 3.1 Sarge 15400 2.6.8
2007-04-08 4.0 Etch 18000 2.6.18
2009-02-14 5.0 Lenny 23000 2.6.26
2011-02-06 6.0 Squeeze 29000 2.6.32
2013-05-04 7.0 Wheezy 36000 3.2
2015-04-25 8.0 Jessie 43000 3.16
2017-06-17 9.0 Stretch 52000 4.9

です。

gnuplotのスクリプトは以下のようなものを使いました。

unset grid
set terminal pngcairo color enhanced font "Helvetica,18"
set output "package.png"

set xlabel '' font "Helvetica,18"
set ylabel 'package number' font "Helvetica,18"
set size ratio 0.6
set tics font "Helvetica,18"

set rmargin 5
set label "({/Symbol \264}10^{3})" at screen 0.15,0.97

set xdata time
set timefmt "%Y-%m-%d"

set xtics timedate
set xtics format "%Y-%m"
#set xrange ["1990-01":"2020-12"]
set xtics rotate by -45
set xtics 3600 * 24 * 365 * 5

set label "Buzz" front at screen 0.15, 0.4 font "Times, 15"
set label "Rex" front at screen 0.19, 0.45 font "Times, 15"
set label "Bo"  front at screen 0.22, 0.5 font "Times, 15"
set label "Hamm" front at screen 0.21, 0.55 font "Times, 15"
set label "Slink" front at screen 0.28, 0.6 font "Times, 15"

set style arrow  1 head size screen 0.02,10 filled front
set arrow from screen 0.18, 0.35 to screen 0.19,0.27 as 1
set arrow from screen 0.21, 0.41 to screen 0.21,0.27 as 1
set arrow from screen 0.24, 0.47 to screen 0.23,0.27 as 1
set arrow from screen 0.26, 0.52 to screen 0.255,0.28 as 1
set arrow from screen 0.29, 0.56 to screen 0.275,0.28 as 1

plot 'package.dat' using 1:($4 / 1000) title "" with points pt 7 ps 1,\
     '' using 1:($4/1000 > 2.5 ? $4/1000+ 6: 1/0): 3 with labels title "" font "Times,15"

unset output

gnuplot

Posted by Gordius