情報処理概論目次

GNUPLOTの簡単な使い方(II)

テキスト(LaTeX)版を利用するときには、ファイルのコメントをよく読むこと

今回の目標は3種類の果物の月間売上高の推移を次のようにグラフ化することである.

このグラフの作成には次の表データファイルfruits.datを使う. 12行の各行にあるデータは,それぞれ月と,りんご,バナナ,レモンの売り上げ高を表している. データの区切は(何文字かの)空白であることに注意せよ.

# フルーツ年間売り上げ記録(単位 Kt)
# グラフ化スクリプト 
#月      りんご    バナナ    レモン
1        35        22        10
2        30        19        12
3        25        20        10
4        30        19        19
5        22        28        23
6        15        25        25
7        12        30        33
8        15        29        40
9        20        26        35
10        25        24        25
11        30        23        20
12        38        20        15

演習
エディタで,このデータをファイルfruits.datとして作成せよ.

グラフの必須要件

あらゆるグラフでは次の情報を記載しなければならない. これらのどれか1つでも欠けている"グラフ"は,もはやグラフであるとは言えない. どんな美しく"グラフ"を作成しても無意味となる.
グラフの要件を満たしていない``グラフ''を含んだレポートを書く人は,「訓練されていないから笑ってくれ」と言っているようなもので,相当馬鹿にされます.

以下,GNUPLOTはグラフ化のスクリプトファイルおよび必要なデータファイルのあるディレクトリで起動する.

表データのグラフ化

表データ

次のような形式(M行N列)の数値データの集まりを表データ}(date table)という. データ内容がわかりやすいように,行頭にコメント記号『#』を付けて,データの種別を表しておく.
#種別a    種別b    種別c   ......  種別N
   A1      B1       C1     .....     N1
   A2      B2       C2     .....     N2
      .............................
      .............................
   AM      BM       CM     .....     NM

ここではデータ区切を空白で表しているとする.

2列の表データのグラフ

たとえば,次の7行2列の表データをファイルstudent.datとする(表データであることを表すように,拡張子に『.dat』を付けていることに注意).
# スクリプト student.plt
# 情報学科の学生数の推移
#1列目    2列目
#年度     人数
1990      202
1991      211
1992      205
1993      220
1994      214
1995      203
1996      213

この表データを使ってグラフを書く(X Windowに出力する)には,次のスクリプトファイルstudent.pltを用意する.

# 学生数の年次推移
set terminal x11
plot 'student.dat'
pause -1

データを読み込むために,データファイルを1重引用符'』で挟んでいることに注意する.

演習
表データstudent.datとスクリプトstudent.pltを作成して,GNUPLOTで表示してみよ. 表データが2列のときには,1列目が横軸(x軸),2列目が縦軸(y軸)となっていることを確かめよ.

また,それぞれの軸目盛の最小値と最大値と表データのデータとの関係を調べよ.

グラフ領域の指定

GNUPLOTでは,先の演習で確かめたように,与えられたデータをグラフ化するときに,デフォルトでは座標範囲を自動調節する. つまり,グラフ表示に必要な縦軸,横軸の範囲をグラフ軸範囲の最小値と最大値とする.

グラフ表示するための縦軸や横軸の範囲を次のように指定することもできる.

# 学生数の年次推移
set terminal x11
plot [1989:1997] [200:230] 'student.dat'
pause -1

グラフの横軸(x軸)と縦軸(y軸)の目盛範囲の指定には,横軸の最小値をxmin,最大値をxmax,縦軸の最小値をymin,最大値をymaxとすると,次のように書く.

[xmin:xmax] [ymin:ymax]
範囲指定値を『[]』のように省略すると,その軸の目盛範囲は自動調節される. たとえば,横軸を自動調節し,縦軸を範囲指定するには次のように書く.
# 学生数の年次推移
set terminal x11
plot [] [200:230] 'student.dat'
pause -1

演習
縦横軸の範囲をいろいろに調節してグラフ表示してみよ.

グラフ軸のラベル

特に明示しなければ,GNUPLOTではグラフの縦軸をy軸,横軸をx軸としている. グラフの軸が何を表しているかをラベルするには,次のようにする.

set terminal x11
set xlabel "入学年次"
set ylabel "学生数"
plot [] [200:230] 'student.dat'
pause -1

ラベル名の指定に2重引用符『"』を使っていることに注意せよ.

GNUPLOTは日本語化されていないために(近日中に可能にします?),ウィンドウに表示させると文字化けするが,LaTeXファイルに出力すれば,ちゃんと漢字表示される.

ラベル名内に『\\』を書くと改行される.

# 学生数の年次推移
set terminal latex
set output "student.tex"
set xlabel "入学年次"
set ylabel "情報学科の\\学生数"
plot [] [200:230] 'student.dat'
pause -1
グラフ軸のラベル化は,グラフの要件であることをお忘れなく.

演習
このスクリプトで生成されたLaTeXファイルstudent.texを適当なLaTeX文書に『\input』して,ラベル名が軸に付けられたグラフの様子をプレビューしてみよ.

グラフの表示方式

GNUPLOTでのグラフ表示方式には,次の方法があり,表示方式の指定にはwithを使う.
lines
隣合う点を千でつなぐ.
points
各店の位置にマークを描く.
linespoints
linesとpointsの両方.
impulses
x軸から点まで垂線を引く.
dots
各点の位置に小さな点を打つ.多くの点の散布図に使うとよい.
errorbars
説明省略.
表データをグラフ化するときには一般的にはlinespointsを使う (GNUPLOTには,残念ながら棒グラフはない.必要ならimpulsesで代用する).

グラフの表示方式を指定するには,たとえば次のように書く. 表示方式の指定にwithを使っていることに注意する.

# 学生数の年次推移
set terminal latex
set output "student.tex"
set xlabel "入学年次"
set ylabel "情報学科の\\学生数"
plot [] [200:230] 'student.dat' with linespoints

これで,点と点を線で結んだ折れ線グラフができる.

演習
表示方式をさまざまに変えて,グラフの様子がどのようになるかを確かめてみよ.

グラフの重ね書き

関数の重ね書き

GNUPLOTでは,グラフを重ねて書くことができる. 次ぎは関数y=x * xy=5x+20の2つのグラフを-10≦x≦10の範囲で重ねて書くスクリプトである. 縦軸(y軸)の範囲は表略されている([-10:10] []としても同じ).
set terminal x11
plot [-10:10] x * x, 5 * x + 20
pause -1

関数(データ)がコンマ記号『,』で区切られていることに注意する. さらにコンマで区切って関数を指定してグラフを何重にも重ねることができる.

演習
関数のグラフを重ねて1つのグラフに表してみよ.

複数行にまたがるコマンド

1行に書くべきコマンドが長くなるときには,複数行にまたがらせることができる.
set terminal x11
plot [-10:10] x * x,\
              5 * x + 20,\
              30 - x
pase -1
このように,(1行に書くべき)コマンドを複数行に分けるときには,最終行以外の行の行末にバックスラシュ『\』を書く. バックスラッシュは必ず各行の最後になければならない.

演習
コマンドを複数行にまたがらせて,グラフを作成せよ.

表データの重ね書き

さらに,次のようなデータファイルstudent2.datがあるとする.
# 経営学科の学生数の推移
#年度     人数
1990      252
1991      261
1992      245
1993      2540
1994      257
1995      246
1996      249

このデータと先のstudent.datをあわせたグラフを書くには,複数の関数グラフの場合と同じように,データファイルをカンマで区切る. つまり,次のようなスクリプトを使う.

# 学生数の年次推移
set terminal latex
set output "student.tex"
set xlabel "入学年次"
set ylabel "学生数"
plot [] [200:270] 'student.dat' with linespoints, \
                  'student2.dat' with linespoints

しかし,これではそれぞれの折れ線が何のデータを表しているかが示されていないので,グラフとしては失格である. そのためには,次のようにしてtitleオプションを指定して,グラフの種別を示すことができる.

# 学生数の年次推移
set terminal latex
set output "student.tex"
set xlabel "入学年次"
set ylabel "学生数"
plot [] [200:270] 'student.dat' title "情報学科" with linespoints, \
                  'student2.dat' title "経営学科"  with linespoints

titleオプションはwithオプションよりもになければならない. 表題は2重引用符で囲まれていることに注意する.

演習
上のように表データを2つ以上使って,グラフの重ねて表示してみよ.

一般表データのグラフ化

先の2つの表データは,2つ別々のファイルではなく,次のように合併して1つの表データで表されているのが普通である.
#学生数の推移
#年度     情報    経営
1990      202     252
1991      211     261
1992      205     245
1993      220     254
1994      214     257
1995      203     246
1996      213     249

一般的に,次のような表データファイルfruits.datをグラフ化することを考える.

# フルーツ年間売り上げ記録(単位 Kt)
# グラフ化スクリプト 
#月      りんご    バナナ    レモン

1        35        22        10
2        30        19        12
3        25        20        10
4        30        19        19
5        22        28        23
6        15        25        25
7        12        30        33
8        15        29        40
9        20        26        35
10        25        24        25
11        30        23        20
12        38        20        15

2次元グラフ(x軸とy軸だけからなるグラフ)を書くためには,この(4列からなる)表データから2列を選び出して,x軸とy軸に割り当てることが必要である.

このためにusingオプションを使う. 表データからi列を選び出してx軸に,j列を選び出してy軸にしてグラフを作成するには次のように書く

using i列 : j列

列の区切りはコロン『:』で表されていることに注意する.

このページの先頭にあったグラフは次のスクリプトfruits.pltから得られた.

# フルーツ年間売り上げ記録
set terminal latex
set output 'fruits.tex'
set xlabel "月別集計(1995年実績)"
set ylabel "売上げ高\\(単位:Kt)"
plot [1:12] [0:50] 'fruits.dat' using 1:2 title "りんご" with linespoints,\
                   'fruits.dat' using 1:3 title "バナナ" with linespoints,\
                   'fruits.dat' using 1:4 title "レモン" with linespoints

演習
実際に,表データファイルfruits.datから目的の図が得られることを確かめてみよ.

提出課題

先のグラフ(ページ先頭の図)をLaTeX文書のfigure環境内に張り込んだものを提出せよ. ただし,図の番号を文中で引用するような適当な文を作成し,\label{...}と\ref{...}を使った相互参照が使われているLaTeX文書であることが絶対条件.

レポート課題

次の内容のどれかを表データを調査して作成して,これをGNUPLOTでグラフ化して\LaTeX文書にfigure環境内に取り込め. 図番号を"相互参照"して,そのグラフから読み取れる分析結果を論ぜよ. いくつグラフを作成してもよい.

  • 日本,首都圏(東京,神奈川,埼玉,千葉)と東京都の人口の推移(1960年から最近まで)
  • 野球またはサッカー(あるいはその他のスポーツの)チームの今期月別順位の推移
  • G7の国家の貿易収支,とくに輸出総額(ドルまたは円換算)の推移(1980年から最近まで)
  • 国内の自動車会社(5社以上)の売り上げ高の推移(1970年から最近まで)
  • ある音楽分野のCDの売り上げの推移(適当な時期から最近まで)
  • その他,公表されている資料に基づいた,ベストセラー、新聞部数、大学学生数など上記のように複数の推移が興味深いデータ
ただし,どんな文書を書く場合にも共通する常識として,利用したデータや参考書などの情報の出典を必ず明示すること.
  • 期限:
  • 注意:
    1. このようなデータをどのように入手するかも,課題の一部である.
    2. タイトルに`GNUPLOT(II)',著者名に`学生番号と氏名',日付を`本日'としてあるものだけが有効

情報処理概論目次