gnuplotで棒グラフを書く

簡単な棒グラフ(with boxを使う)

gnuplotで簡単な棒グラフを書く場合、plotwith boxesオプションを使うと簡単にできます。

以下に一つの例を示します。この例では以下のような仮想的なアンケート結果(result1.dat)をプロットすることを目指します。

楽しかった  10
まあまあ楽しかった  24
普通  6
余り楽しくなかった  4
全然楽しくなかった  1

以下のスクリプトで、棒グラフを得ることができます。

plot "result1.dat" using 0:2:xtic(1) with boxes notitle

このスクリプトでは、横軸にはデータファイルのコラム0(即ちデータの行数)、縦軸には2コラム目のデータを用いてグラフをプロットしています。usingの3番目にあるxtic(1)は、データの1コラム目をx軸のtic labelとして用いるという指示です。なお、xticの部分が、(xtic(1))のように全体がカッコで囲まれてはいないことに注意して下さい。

これを実行すると、まだ余りかっこよくは無いですが、下のような出力が得られます。

棒グラフの色などはset style fillを用いて調整します。例えば、以下のようにスクリプトに追加すると、グラフに色が塗られます。

set style fill solid
plot "result1.dat" using 0:2:xtic(1) with boxes notitle

これだと一色になってしまって余計に分かりづらいので、set style fillの部分にborderを追加して、棒に枠も加えます。また、枠の太さはwith boxesの後にlinewidth(またはlw)を追加して変更できます。

set style fill solid border lc rgb "black"
plot "result1.dat" using 0:2:xtic(1) with boxes lw 2 notitle

グラフの色はwith boxesの後にlinecolor(またはlc)を追加して変更できます(linecolorで塗られる色が変わると言うのは若干違和感がありますが、仕方ありません)。以下の例ではlight-cyanという薄い水色に変更しています。

set style fill solid border lc rgb "black"
plot "result1.dat" using 0:2:xtic(1) with boxes lw 2 lc rgb "light-cyan" notitle

棒の幅はset boxwidthで変更できます。例えば、以下の例では幅をデフォルト値の半分に変更しています。relativeをつけているのは、「デフォルト値に対してどういった割合で変化させるか」という指定をするためです。

set boxwidth 0.5 relative
set style fill solid border lc rgb "black"
plot "result1.dat" using 0:2:xtic(1) with boxes lw 2 lc rgb "light-cyan" notitle

ラベルの向きを回転させたい場合はset xtics rotate byを用います。以下の例ではラベルを90度回転させています。1回プロットした後にreplotしているのは、プロット1回だけでは上手く余白が設定されないためです。

set style fill solid border lc rgb "black"
set xtics rotate by -90
plot "result1.dat" using 0:2:xtic(1) with boxes lw 2 lc rgb "light-cyan" notitle
replot

複雑な棒グラフ(その1: with boxを使う場合)

次に、よりたくさんのデータを棒グラフで表してみましょう。先に説明したwith boxで作る棒グラフを応用することで、より複雑なグラフを作ることができます。

使用するデータは以下の通りです。(result2.datとします。)

#回答               1年生  2年生  3年生
楽しかった             10      6     12
まあまあ楽しかった     24     20     25
普通                    6     10      5
余り楽しくなかった      4      8      1
全然楽しくなかった      1      3      1

このデータに対して以下のスクリプトを実行すると、学年別の感想を分けて表示できます。

set style fill solid border lc rgb "black"
set boxwidth 1
set xtics rotate by -90
plot "result2.dat" using ($0*4+0):2         with boxes lw 2 lc rgb "light-cyan"  title "1年生",\
     "result2.dat" using ($0*4+1):3:xtic(1) with boxes lw 2 lc rgb "light-green" title "2年生",\
     "result2.dat" using ($0*4+2):4         with boxes lw 2 lc rgb "light-pink"  title "3年生"
replot

このスクリプトのポイントは、まず、usingの第一引数を0ではなく($0*4+1)等にしている点です。+1などでずらすことによって、各学年の結果が重ならないようにしています。また、$0(つまりデータの行番号)を4倍することによって、各回答の間に間隔を得ています。もしこの数を3にすると、各回答の間に間隔が無くなります。3.5などの小数の値を指定することもできます。また、set boxwidth 1で、ボックスの幅を絶対値で指定しているのも、棒同士が重ならないようにするためです。さらに、全部の学年のデータに「楽しかった」等のラベルをつける必要はないので、usingの第3引数のxtic(1)は真ん中に来るデータ(2年生)にのみ付けています。(もしも並べたいデータが偶数個であるならば、set xticsoffsetオプションを使ってラベルの位置が真ん中に来るように若干左右にずらすとよいでしょう。)

また、次のようなスクリプトを用いると、1つの棒を縦に色分けしてデータの内訳を示すようなグラフができます。

set style fill solid border lc rgb "black"
set boxwidth 0.8 relative
set xtics rotate by -90
plot "result2.dat" using 0:($2+$3+$4)   with boxes lw 2 lc rgb "light-pink"  title "3年生",\
     "result2.dat" using 0:($2+$3)      with boxes lw 2 lc rgb "light-green" title "2年生",\
     "result2.dat" using 0:($2):xtic(1) with boxes lw 2 lc rgb "light-cyan"  title "1年生"
replot

このスクリプトでは、棒を重ねて描画することによって、縦方向の色分けを実現しています。従って、より棒の下(x軸に近い方)に来る色ほど、plotコマンドの後の方で実行されなければなりません。上の例では1年生のデータのプロットが一番あとに実行されています。また、3年生と2年生のplotコマンドのusingの第2引数が$2+$3+$4などといった足し算になっている点にも注意して下さい。これは、先に描画する棒にはゲタを履かせておかないと後で描画される棒に隠れてしまって正しいグラフにならないためです。棒の幅はset boxwidth 0.8 relativeで相対的に指定しています。この値を変えれば棒の太さを変えることができます。

複雑な棒グラフ(その2: with historgramを使う)

plotコマンドのwith histogramオプションを用いると、(ある意味)容易に複雑な棒グラフを書くことができます。ここで、「ある意味」と書いたのは、with histogramオプションの使い方は他のwithオプションと結構異なっているため、個人的には若干とっつきにくく感じるためです。しかし、usingの引数に変な小細工をする必要がないなど魅力的な点も多いです。

with histogramオプションを使うためには、まずplotの実行前にset style histogramコマンドで棒グラフのスタイルを指定する必要があります。このコマンドには幾つかのオプションがあります。それらについて分けて紹介していきましょう。(以下で説明するオプションの他にerrorbarsオプションもありますが、ここでは説明は省略します)

なお、以下の例で用いるデータファイルは、特に指定のない限り先の例と同じresult2.datです。

#回答               1年生  2年生  3年生
楽しかった             10      6     12
まあまあ楽しかった     24     20     25
普通                    6     10      5
余り楽しくなかった      4      8      1
全然楽しくなかった      1      3      1

clusterdオプション(棒を横に並べる)

clusterdオプションは各データを示す棒を横に並べるスタイルの棒グラフを作るためのものです。次のスクリプトを実行すると、下のようなグラフが得られます。

set style histogram clustered
set xtics rotate by -90
plot "result2.dat" using 2:xtic(1) with histogram title "1年生",\
     "result2.dat" using 3         with histogram title "2年生",\
     "result2.dat" using 4         with histogram title "3年生"
replot

まず、1行目でset style histogram clusteredを実行しています。1年生、2年生、3年生のデータコラムそれぞれについて、データコラムの番号をusingの引数に与えながらplotしているのが特徴です。また、plotコマンドではwith histogramオプションを用いています。すると、1年生、2年生、3年生のデータを示す棒が、横にずれながら描画されます。

上の例では横軸のラベルがずれているので、set xticsoffsetオプションを用いて修正します。下の例では、右方向に横軸方向に0.1だけずらすように命令しています。(グラフの数や後述のgapの値に依って、何文字ずらせばいいかは変わります。)

set style histogram clustered
set xtics rotate by -90 offset first 0.1,0
plot "result2.dat" using 2:xtic(1) with histogram title "1年生",\
     "result2.dat" using 3         with histogram title "2年生",\
     "result2.dat" using 4         with histogram title "3年生"
replot

棒に色を塗る場合は、先にも説明したようにset style fillを用います。下の例では、色を塗るように指定し、さらに枠には黒線を引くように指定しています。

set style histogram clustered
set style fill solid border lc rgb "black"
set xtics rotate by -90 offset first 0.1,0
plot "result2.dat" using 2:xtic(1) with histogram title "1年生",\
     "result2.dat" using 3         with histogram title "2年生",\
     "result2.dat" using 4         with histogram title "3年生"
replot

clusteredオプションにはさらにgapというパラメータを指定することができます。このパラメータは棒グラフの固まりの間(上記例では「楽しかった」の3本の棒と「まあまあ楽しかった」の3本の棒の間など)の間隔を、棒の幅を単位として指定します。デフォルトの値は2ですので、何も指定しなければ棒2つ分の間隔が開くことになります。。のところ、このパラメータには整数しか指定できないようです。例えば、gap 0と指定すると、以下のように全部のグラフが間隔なしにつながります。(なお、xticsoffsetの値も適宜修正しています)

set style histogram clustered gap 0
set style fill solid border lc rgb "black"
set xtics rotate by -90 offset first 1.0/6.0,0
plot "result2.dat" using 2:xtic(1) with histogram title "1年生",\
     "result2.dat" using 3         with histogram title "2年生",\
     "result2.dat" using 4         with histogram title "3年生"
replot

各棒の太さを変えたい場合は、先に説明した場合と同じく、set boxwidthを用いて指定します。例えば以下のように、set boxwidth 0.5 relativeとすれば、下図のような細いグラフになります。

set style histogram clustered gap 2
set style fill solid border lc rgb "black"
set boxwidth 0.5 relative 
set xtics rotate by -90 offset first 0.1,0
plot "result2.dat" using 2:xtic(1) with histogram title "1年生",\
     "result2.dat" using 3         with histogram title "2年生",\
     "result2.dat" using 4         with histogram title "3年生"
replot

なお、下のような、1行目がコメントアウトされていないデータファイル(result3.datとします)を用いれば、凡例の名前をtitleを用いて手動指定しなくても、plottitle columnheadオプションを用いて自動で設定できます。

回答                 1年生  2年生  3年生
楽しかった             10      6     12
まあまあ楽しかった     24     20     25
普通                    6     10      5
余り楽しくなかった      4      8      1
全然楽しくなかった      1      3      1
set style histogram clustered gap 2
set style fill solid border lc rgb "black"
set boxwidth 0.5 relative 
set xtics rotate by -90 offset first 0.1,0
plot "result3.dat" using 2:xtic(1)  with histogram title columnhead,\
     "result3.dat" using 3          with histogram title columnhead,\
     "result3.dat" using 4          with histogram title columnhead

このスクリプトで得られるグラフは、一つ前の図と全く一緒です。

rowstackedオプション(各行のデータを積み上げる)

rowstackedオプションを用いると、一つの棒の内訳を色分けするようなグラフを簡単に作れます。rowstackedオプションの場合は、各行の内容を各コラムのデータで内訳します。例えば、以下のような例を実行すれば、「楽しかった」等の学年別の内訳を色で示した棒グラフが作れます。

set style histogram rowstacked
set style fill solid border lc rgb "black"
set xtics rotate by -90
plot "result2.dat" using 2:xtic(1)  with histogram title "1年生",\
     "result2.dat" using 3          with histogram title "2年生",\
     "result2.dat" using 4          with histogram title "3年生"
replot

棒の太さは、前と同じく、set boxwidthを用いて変更できます。

set style histogram rowstacked
set boxwidth 0.5 relative
set style fill solid border lc rgb "black"
set xtics rotate by -90
plot "result2.dat" using 2:xtic(1)  with histogram title "1年生",\
     "result2.dat" using 3          with histogram title "2年生",\
     "result2.dat" using 4          with histogram title "3年生"
replot

なお、下のような、1行目がコメントアウトされていないデータファイル(result3.datとします)を用いれば、凡例の名前をtitleを用いて手動指定しなくても、plottitle columnheadオプションを用いて自動で設定できます。

回答                 1年生  2年生  3年生
楽しかった             10      6     12
まあまあ楽しかった     24     20     25
普通                    6     10      5
余り楽しくなかった      4      8      1
全然楽しくなかった      1      3      1
set style histogram rowstacked
set boxwidth 0.5 relative
set style fill solid border lc rgb "black"
set xtics rotate by -90
plot "result3.dat" using 2:xtic(1)  with histogram title columnhead,\
     "result3.dat" using 3          with histogram title columnhead,\
     "result3.dat" using 4          with histogram title columnhead
replot

このスクリプトで得られるグラフは、一つ前の図と全く一緒です。

columnstackedオプション(各コラムのデータを積み上げる)

columnstackedオプションを用いると、rowstackedの場合とデータの縦横の役割を逆にし、各コラムのデータを積み上げた棒グラフを作ることができます。今までに使っているデータでは、各学年の「楽しかった」等の回答の内訳を作ることに相当します。

以下のようなスクリプトを実行すると、下図のようなグラフが得られます。

set style histogram columnstacked
set style fill solid border lc rgb "black"
set xtics ("1年生" 0, "2年生" 1, "3年生" 2)
plot "result2.dat" using 2:key(1)   with histogram title "",\
     "result2.dat" using 3          with histogram title "",\
     "result2.dat" using 4          with histogram title ""

先ほどの例とは逆に、各学年の回答内訳を示すようなグラフになっているのがお分かり頂けると思います。また、このスクリプトのポイントは、set xtics ()を使って、横軸のラベルを明示的に指定している点と、usingの引数でkey(1)を用いて凡例をデータファイルの1コラム目から自動取得している点です。

棒の太さはset boxwidthで指定できます。また、上記例では凡例がグラフとかぶってしまっていたので、set key outsideと指定して凡例をグラフの外に出すように調整しました。

set style histogram columnstacked
set style fill solid border lc rgb "black"
set xtics ("1年生" 0, "2年生" 1, "3年生" 2)
set key outside
set boxwidth 0.5 relative
plot "result2.dat" using 2:key(1)   with histogram title "",\
     "result2.dat" using 3          with histogram title "",\
     "result2.dat" using 4          with histogram title ""

なお、下のような、1行目がコメントアウトされていないデータファイル(result3.datとします)を用いれば、横軸のラベルを手動指定しなくても、plottitle columnheadオプションで自動取得できます。

回答                 1年生  2年生  3年生
楽しかった             10      6     12
まあまあ楽しかった     24     20     25
普通                    6     10      5
余り楽しくなかった      4      8      1
全然楽しくなかった      1      3      1
set style histogram columnstacked
set style fill solid border lc rgb "black"
set boxwidth 0.5 relative
set key outside
plot "result3.dat" using 2:key(1)   with histogram title columnhead,\
     "result3.dat" using 3          with histogram title columnhead,\
     "result3.dat" using 4          with histogram title columnhead

このスクリプトで得られるグラフは、一つ前の図と全く一緒です。