使い方(統計データの可視化)

以下の資料から数値データ(著作権対象外)を使用していろいろなグラフを描いてみます。
※ 指標によって対象年度が異なりますが、gnuplotの説明が目的なので細かい数値については気にしないことにします
統計でみる都道府県のすがた2017」(総務省統計局)
人口推計(平成28年10月1日現在)」(総務省統計局)

都道府県名 人口 15歳未満 15〜64歳 65〜74歳 75歳以上 面積 年平均気温 年間降水量
年度 2015 2016 2016 2016 2016 2015 2015 2015
単位 万人 千人 千人 千人 千人 100k㎡ mm
Hokkaido 538 600 3150 809 793 834.24 10.0 1275
Aomori 131 145 748 197 204 96.46 11.5 1004
Iwate 128 147 726 184 211 152.75 11.6 1094
Miyagi 233 285 1429 309 307 72.82 13.7 1445
Akita 102 104 555 161 190 116.38 12.7 1491
Yamagata 112 133 629 160 191 93.23 12.7 1027
Fukushima 191 225 1115 269 291 137.84 14.2 1284
Ibaraki 292 361 1743 424 377 60.97 14.8 1227
Tochigi 197 249 1192 278 247 64.08 14.9 1651
Gumma 197 247 1163 288 270 63.62 15.6 1232
Saitama 727 907 4525 1034 823 37.98 16.0 1335
Chiba 622 762 3818 906 749 51.58 16.7 1616
Tokyo 1352 1535 8969 1591 1529 21.91 16.4 1782
Kanagawa 913 1135 5778 1186 1046 24.16 16.7 1836
Niigata 230 271 1315 334 366 125.84 14.4 1468
Toyama 107 127 604 166 164 42.48 14.8 2141
Ishikawa 115 147 677 169 158 41.86 15.3 2165
Fukui 79 102 451 111 118 41.90 15.2 2300
Yamanashi 83 101 487 118 124 44.65 15.6 1115
Nagano 210 265 1182 305 336 135.62 12.8 1058
Gifu 203 263 1177 295 286 106.21 16.5 2267
Shizuoka 370 472 2165 536 515 77.77 17.2 2805
Aichi 748 1018 4667 973 848 51.72 16.6 1803
Mie 182 231 1062 259 257 57.74 16.6 1979
Shiga 141 202 860 184 166 40.17 15.5 1784
Kyoto 261 312 1560 381 352 46.12 16.6 2043
Osaka 884 1083 5383 1256 1110 19.05 17.2 1649
Hyogo 553 702 3284 799 736 84.01 17.3 1578
Nara 136 166 789 210 191 36.91 15.5 1512
Wakayama 96 114 538 148 154 47.25 17.2 1538
Tottori 57 73 324 81 92 35.07 15.4 1750
Shimane 69 86 376 104 124 67.08 15.4 1706
Okayama 192 247 1107 278 282 71.15 16.2 1334
Hiroshima 284 372 1666 410 389 84.79 16.6 1641
Yamaguchi 140 167 769 225 233 61.12 15.9 2061
Tokushima 76 86 426 115 123 41.47 17.0 1986
Kagawa 98 122 553 148 149 18.77 16.9 1210
Ehime 139 167 776 210 222 56.76 16.8 1687
Kochi 73 82 396 115 127 71.04 17.5 2967
Fukuoka 510 677 3071 698 659 49.86 17.3 1868
Saga 83 115 478 113 123 24.41 17.1 2083
Nagasaki 138 176 775 199 218 41.32 17.3 2392
Kumamoto 179 239 1012 244 279 74.09 17.2 2292
Oita 117 145 653 174 188 63.41 16.8 1678
Miyazaki 110 148 616 159 174 77.35 17.7 3193
Kagoshima 165 220 924 225 268 91.87 18.8 3664
Okinawa 143 248 898 143 150 22.81 23.6 1425

棒グラフ

都道府県別人口を棒グラフで表現します。基本的な棒グラフを作るには、 plotwigh boxes を指定します(似た機能をもつものにhistogramがありますが、この例ではboxesを使います)。X軸のラベルは、データ列の値に続けて :xticlabels(n) で指定することができます(カッコ内は列番号)。

set term png size 800,600
set out 'out.png'
set grid ytics
plot 'pref.dat' using 0:2:xticlabels(1) with boxes

bar01

棒グラフの左右の端が切れ、また、X軸のラベルが潰れてしまいました。

次のように調整します。
bmargin で、グラフのプロット領域からスクリーンの下までの距離を変更
xtics rotate で、X軸ラベルを指定した角度だけ左に回転
xtics offset で、グラフ領域からのオフセットをx方向、y方向それぞれ指定
font でフォントサイズを変更
boxwidth でボックスの幅(この場合は左右の余白)を調整

set term png size 800,600
set out 'out.png'
set grid ytics
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font ',10'
set boxwidth 1 relative
plot 'pref.dat' using 0:2:xticlabels(1) with boxes

set xtics .. が3行ありますが、 set xtics rotate 90 offset 1,-4 font ',10' のように1行で書いても構いません。

bar02

折れ線グラフ

折れ線グラフは、with lines または with linespoints を使います。棒グラフとの違いはこれだけです。
線だけでいい場合はlines、線+点にしたいときはlinespointsを使用します。

データは都道府県の面積(7列目)を使用します。

set term png size 800,600
set out 'out.png'
set grid xtics ytics
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font ',10'
plot 'pref.dat' using 0:7:xticlabels(1) with linespoints
line01

ついでに、面積の大きい順に並び替えてみます。

set term png size 800,600
set out 'out.png'
set grid xtics ytics
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font ',10'
plot '<sort -g -r -k7 pref.dat' using 0:7:xticlabels(1) with linespoints pointtype 2

plot にファイル名だけ渡すのではなく、このようにコマンドの出力をリダイレクトさせて読み込むこともできます。
'<sort -g -r -k7 pref.dat' の部分は自身の環境で適宜読み替えてください。

plot行最後の、pointtype 2は、ポイントの形状でこのように番号で指定します(pt 2と縮めて書くこともできます)。

line02

北海道、岩手、福島、、と面積の大きい順に並びました。

同様に、人口密度順にしたければ、次のように書けばよいでしょう(例)。

plot "< tail -n 47 pref.dat | awk '{print $1,$2/$7*100}' | sort -g -r -k2" using 0:2:xticlabels(1) with lines title "人口密度"

散布図

「年平均気温」と「年間降水量」のデータを使用して散布図を描いてみます。

  1. 横軸と縦軸に、それぞれ xlabelylabel で軸のラベルを設定
  2. Y軸は0〜の範囲にしたいので、 yrange を下記のようにセット
  3. 凡例は不要なので unset key で削除
set term png size 800,600
set out 'out.png'
unset key
set yrange [0:]
set grid xtics ytics
set xlabel "年平均気温" font 'IPAGothic'
set ylabel "年間降水量" font 'IPAGothic'
plot 'pref.dat' using 8:9 with points pointsize 3

plot行に、with pointsと書いていますが、これはデフォルトの動作なので、普通は省略します(デフォルトの動作であることを説明するために、あえて省略しませんでした)。 plot 行の、pointsize 3は、ポイントの大きさを指定します(短くptでも可)。

scatter01

散布図では、他にwith dotsも使われますが、これは非常に大量のデータを点でプロットするときに役立ちます。

第2のY軸

上の散布図で利用したデータを、今度はY軸1、Y軸2としてプロットしてみます。
y2tics が第2のY軸(グラフ右側)を表しています。ここでは使用していませんが、x2tics が第2のX軸(グラフ上部)です。
plotの行で、axes x1y2 は、「第1X軸と第2Y軸を使用」することを宣言しています。
最終行の '' は、ひとつ前と同じファイルを再利用するときの省略記法です。

set term png size 800,600 font 'IPAGothic'
set out 'out.png'
set y2tics
set grid y2tics
set yrange [0:]
set y2range [0:]
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font 'Arial,10'
set ylabel "(℃)"
set y2label "(mm)"
set boxwidth 1 relative
plot 'pref.dat' using 0:9 axes x1y2 with boxes title "年間降水量(右目盛)",\
	'' using 0:8:xticlabels(1) with linespoints pt 3 title "年平均気温(左目盛)"

ベースが異なる指標をプロットするときは、ほぼ必須の知識なので覚えておきましょう。

y2bar01

積み上げ棒グラフ

積み上げ棒グラフを作成するには、histogramが便利です(boxesでもやればできますが、手間が増えます)。
ポイントは、set style histogram rowstacked です。histogramのスタイルにrowstackedを指定することで、各データ行のカラム値を縦に積み上げることがでるようになるというものです。

set term png size 800,600 font 'IPAGothic'
set out 'out.png'
set grid ytics
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font ',11'
set style data histogram
set style histogram rowstacked
set style fill transparent solid 0.6
set boxwidth 0.75
set key invert
plot 'pref.dat' u 3:xtic(1) t col, for [i=4:6] '' u i t col

plotの行で、utcolが出てきましたが、これらはそれぞれusingtitlecolumnの省略形です。 また、この例では、set key invertを追加して凡例の上下をグラフの位置関係と合わせています。

for [i=4:6] '' u i t colの部分は、この場合、次のように書いても同じですが、慣れてくればforを使用してコードを簡潔に書けるようになります。

'' u 4 t col, '' u 5 t col, '' 6 t col
stacked01

100%積み上げ棒グラフ

よく見る100%積み上げ棒も、普通の積み上げ棒グラフの場合と同じです。gnuplot自体が100%積み上げ棒を描画するという機能を持っている訳ではなく、単に、データを加工してすべて100%にするというだけのことです。

やり方は、データファイルの値そのものを割合の値に変換する方法(その場合、上でみたやり方がそのまま使えます)と、実際の数値を動的に割合に変換する方法があります。ここでは、後者の方法を採用しています。

set term png size 800,600 font 'IPAGothic'
set out 'out.png'
set grid ytics
set bmargin 5
set xtics rotate by 90
set xtics offset 0,-4
set xtics font ',11'
set yrange [0:100]
set style data histogram
set style histogram rowstacked
set style fill transparent solid 0.6
set boxwidth 0.65
set key invert right outside
plot 'pref.dat' u (100.*column(3)/($3+$4+$5+$6)):xtic(1) ti column(3),\
	for [i=4:6] '' u (100.*column(i)/($3+$4+$5+$6)) ti column(i)

plot行の(100.*column(i)/($3+$4+$5+$6))では、全階級の合計値($3+$4+$5+$6)で対象の階級の値を割って、全年齢の合計に対する割合を求めています。

stacked02

ちなみに、sumという表現を使うと、上の例のplotの行は次のように書くことができます。列数が多いときはこれを使うと少しスマートに書けます。

plot 'pref.dat' u (100.*column(3)/(sum [col=3:6] column(col))):xtic(1) ti column(3),\
	for [i=4:6] '' u (100.*column(i)/(sum [col=3:6] column(col))) ti column(i)

時系列データ

以上の例では総務省の定点観測データを利用しましたが、普段の仕事などでは時系列データを扱うことも多いかと思います。

サンプルデータとして、2016年1年間の石垣島の日ごとの平均気温と降水量の数値データ(出典:気象庁ホームページ、著作権対象外)を使用して時系列データの可視化を行います。

データは次の形式になっています。

#年月日 平均気温  降水量の合計
2016/1/1  21.0  0.5
2016/1/2  24.0  2.5
2016/1/3  22.5  10.0
2016/1/4  22.0  36.5
2016/1/5  23.1  33.5
(snip)
2016/12/27  19.6  2.5
2016/12/28  16.7  5.5
2016/12/29  18.6  1.0
2016/12/30  19.3  0.0
2016/12/31  21.4  0

時系列データとしてデータを扱うために、入力データの日付(日時)を文字列ではなく「時間」のデータとして扱う必要があります。そのために、まず、set xdata timeとおまじないを書いて、日時データを扱うということをgnuplotに教えてあげます。

さらに、正しく日時を扱えるようにset timefmt "..."で、入力データの形式に沿った日時のフォーマットを設定します。また、set x format "..."で、出力データの日時フォーマットをカスタマイズすることができます。

set term png size 800,600 font 'IPAGothic'
set out 'out.png'
set xdata time
set grid xtics ytics
set y2tics
set yrange [0:]
set timefmt "%Y/%m/%d"
set format x "%m/%d"
set xrange ["2016/01/01":"2016/12/31"]
plot "ishigaki.dat" u 1:2 with linespoints t "平均気温(左目盛)",\
	"" u 1:3 with boxes axes x1y2 t "降水量(右目盛)"

set xrange [..]で期間を設定しています。全データを表示するなら必要ないのではという気もしますが、これを指定しておかないと勝手に前後のバッファの期間が表示されることがあります。

timeline01

最近の描画ツールでは、データを日時データとして扱うと、例えば月ごとの最高値、最低値、平均などを自動で計算してくれるものが多いですが、gnuplotはそこまでの機能は(少なくとも現最新バージョンの5.2.2までは)存在しません。gnuplotでもデータを時系列で扱うメリットはありますが、それほど多くないというのが実際のところです。

まとめ

データファイルの情報を元にさまざまなタイプのグラフを描画しました。gnuplotがもつ多くの機能のうち、まだ、ほんの一部ですが、基本的な構成が分かれば、ここから先に進むのはさほど難しくないと思います。

今回見てきたようなグラフを描く用途であれば、他にいいツールがたくさんあるので、わざわざgnuplotを使わなくてもいいかなと、このページを作成しながら思いました。ただ、他の用途で使うにしても今回のような知識は必要なので、ぜひ、なにかに活かしていただければと思います。