ggplotでの積み上げグラフの作り方

Rのggplotでの積み上げグラフの作り方を解説します. 積み上げグラフは, 積み上げ棒グラフと積み上げ折れ線グラフ(名前が正しいかわかりません), 積み上げヒストグラムの3種類を扱います. 積み上げ棒グラフではgeom_bar(), 積み上げ折れ線グラフではgeom_area(), 積み上げヒストグラムではgeom_histogram()使用します.

使用するデータ

今回は次のようなデータセットを使うことにします.

season,subject,point
spring,english,60
summar,english,70
autumn,english,80
winter,english,90
spring,math,80
summar,math,75
autumn,math,90
winter,math,100
spring,science,50
summar,science,55
autumn,science,40
winter,science,80
            

あれですね, 正しくはsummerですね. 間違えました. ごめんなさい.

積み上げヒストグラムでは, diamondsというデータセットを使用します.

積み上げ棒グラフの作り方

ではまず積み上げ棒グラフを作ってみましょう. ここで使うのは基本的にはgeom_bar()のみです. 今回の作り方の考え方は以下のようになります.

  1. x軸をseasonごとにごとに分けた棒グラフを作る
  2. このとき, 全ての教科の点数の和がy軸になる
  3. 作った棒グラフを教科ごとに色分けする

ということで, まずは通常の棒グラフを作ってみましょう. 棒グラフの作り方は, 「棒グラフの作り方」で解説しているので, よろしければ参考になさって下さい. ここではグラフを作るためのコマンドのみを以下に書きます. 棒グラフに関しての説明は省略します.

> data <- read.csv("data")
> str(data)
'data.frame':   12 obs. of  3 variables:
 $ season : Factor w/ 4 levels "autumn","spring",..: 2 3 1 4 2 3 1 4 2 3 ...
 $ subject: Factor w/ 3 levels "english","math",..: 1 1 1 1 2 2 2 2 3 3 ...
 $ point  : int  60 70 80 90 80 75 90 100 50 55 ...
> p <- ggplot(data, aes(x=season, y=point))
> p + geom_bar(stat="identity") + scale_x_discrete(limits=c("spring", "summar", "autumn", "winter"))
> ggsave("ggplot_stack1.png")
Saving 7 x 7 in image
            
ggplot_stack1.png

8行目でscale_x_discrete()という関数を使っていますが, これはx軸の値の順序を変えるための関数です. 詳しくは「軸の値の順番の変え方」で解説しています.

さて, このグラフでは, 当初の予定通りx軸はseason, y軸は3教科の合計を表していますので, これを教科ごとに色分けすれば, 積み上げグラフの出来上がりです.

> p + geom_bar(stat="identity", aes(fill=subject)) + scale_x_discrete(limits=c("spring", "summar", "autumn", "winter"))
> ggsave("ggplot_stack2.png")
Saving 7 x 7 in image
            
ggplot_stack2.png

先ほどのコードと変えたのは, geom_bar()の引数にaes(fill=subject)の部分だけです. これは, subjectに関して色分けをするように指定しているだけです.

これで, 積み上げ棒グラフができました. geom_bar()を理解していればそこまで複雑ではないですね. 次は, 折れ線積み上げグラフを見て行きましょう.

積み上げ折れ線グラフの作り方

データセットは先ほどと同じものを使用します. そしてここではgeom_area()という関数を使います. そしてコマンドもそこまで変わりません.

> p <- ggplot(data, aes(x=season, y=point))
> p + geom_area(aes(group=subject, fill=subject)) + scale_x_discrete(limits=c("spring", "summar", "autumn", "winter"))
> ggsave("ggplot_stack3.png")
Saving 7 x 7 in image
            
ggplot_stack3.png

geom_bar()の時と違うところは, stat="identity"の部分がないところと, aes()の引数にgroup=subjectがあるところです.

stat="identity"の部分に関しては, geom_bar()を使うために入れたものなので今回は必要がないです. group=subjectが必要なのは, データセットを見ただけではgeom_area()はどのデータをつなげればよいかわからないため, それを指定しています. この例では, 教科ごとに分けて領域を描いてほしいので, subjectを指定しました.

積み上げヒストグラムの作り方

データセットはdiamondsを使用します. そしてここではgeom_histogram()という関数を使います. そしてコマンドもやっていることはこれまでの2つとそこまで変わりません. というかとても簡潔です.

> p <- ggplot(diamonds, aes(x=cut))
> p + geom_histogram(aes(fill=color))
> ggsave("ggplot_stack4.png")
Saving 7 x 7 in image
            
ggplot_stack4.png

1行目でヒストグラムのためのx軸の要素を指定して, 2行目でヒストグラムの作成と, colorという要素での色分けをしているだけです. 今回は軸の値の順序を変えていないため, scale_x_discrete()のところはなくなります.