gnuplotで簡単な棒グラフを書く場合、plot
のwith 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
次に、よりたくさんのデータを棒グラフで表してみましょう。先に説明した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 xtics
のoffset
オプションを使ってラベルの位置が真ん中に来るように若干左右にずらすとよいでしょう。)
また、次のようなスクリプトを用いると、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
で相対的に指定しています。この値を変えれば棒の太さを変えることができます。
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
オプションは各データを示す棒を横に並べるスタイルの棒グラフを作るためのものです。次のスクリプトを実行すると、下のようなグラフが得られます。
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 xtics
のoffset
オプションを用いて修正します。下の例では、右方向に横軸方向に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
と指定すると、以下のように全部のグラフが間隔なしにつながります。(なお、xtics
のoffset
の値も適宜修正しています)
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
を用いて手動指定しなくても、plot
のtitle 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
オプションの場合は、各行の内容を各コラムのデータで内訳します。例えば、以下のような例を実行すれば、「楽しかった」等の学年別の内訳を色で示した棒グラフが作れます。
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
を用いて手動指定しなくても、plot
のtitle 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
オプションを用いると、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
とします)を用いれば、横軸のラベルを手動指定しなくても、plot
のtitle 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
このスクリプトで得られるグラフは、一つ前の図と全く一緒です。