Mukku John Blog

取り組んでいること を つらつら と

ggplot2を使って、折れ線グラフを作る-3

R グラフィックス クックブック 9回目

ggplot2パッケージを利用して、折れ線グラフを作成していきます。
この記事では、下記を対象にします。

  • 積み上げ面グラフ
  • 100%積み上げ面グラフ
  • 折れ線の周りの網掛け

積み上げ面グラフ

利用するデータはこちらです。
年ごとに、グループ化されたデータがあります。

> head(uspopage)
  Year AgeGroup Thousands
1 1900       <5      9181
2 1900     5-14     16966
3 1900    15-24     14951
4 1900    25-34     12161
5 1900    35-44      9273
6 1900    45-54      6437

データ構造はこちらです。グループの部分がファクタです。

> str(uspopage)
'data.frame':	824 obs. of  3 variables:
 $ Year     : int  1900 1900 1900 1900 1900 1900 1900 1900 1901 1901 ...
 $ AgeGroup : Factor w/ 8 levels "<5","5-14","15-24",..: 1 2 3 4 5 6 7 8 1 2 ...
 $ Thousands: int  9181 16966 14951 12161 9273 6437 4026 3099 9336 17158 ...

図示するためには、geom_area()を使います。

ggplot(uspopage, aes(x=Year,y=Thousands,fill=AgeGroup)) +
  geom_area()

f:id:MukkuJohn:20160824224501p:plain
目が痛い


デフォルトの見た目ですと、色々と辛い部分があります。

  • 目が痛い(なぜこんな配色なんだ)
  • 凡例の並びが、データと逆
  • 塗りつぶされて、目盛り線が見えない
  • グループの境界線がない

これらに対応したのが、こちら。

ggplot(uspopage, aes(x=Year,y=Thousands,fill=AgeGroup)) +
#colourを指定して、グループの境界線
#sizeで境界線の太さ(ミリ単位)
#alphaで透過
  geom_area(colour="black",size=0.2,alpha=0.4) +
#パレットを指定して、breakで凡例を逆に出してね
  scale_fill_brewer(palette="Blues",breaks=rev(levels(uspopage$AgeGroup)))

f:id:MukkuJohn:20160824225406p:plain

データの並びと凡例の並びを合わせるために、凡例を逆にしましたが、
マッピングの段階で積み上げ順序を逆にする方法もあります。
plyrパッケージを使います。)

library(plyr) #マッピングで、desc関数を利用するため
ggplot(uspopage, aes(x=Year,y=Thousands,fill=AgeGroup,order=desc(AgeGroup))) +
  geom_area(colour="black",size=0.2,alpha=0.4) +
#凡例の並び指定は行わない
  scale_fill_brewer(palette="Blues")

f:id:MukkuJohn:20160824225652p:plain

いまだ、不自然な部分がグラフの左右と下側を囲っている線です。
この左右と下側を囲む線を無くすためには、こちらのコードです。

ggplot(uspopage, aes(x=Year,y=Thousands,fill=AgeGroup,order=desc(AgeGroup))) +
#colourの指定をしない→線が図示されない
  geom_area(size=0.2,alpha=0.4) +
  scale_fill_brewer(palette="Blues") +
#折れ線を追加する→グループ化部分の線だけ図示される
  geom_line(position = "stack", size=0.2)

f:id:MukkuJohn:20160824230102p:plain

100%積み上げ面グラフ

過去に、100%積み上げ棒グラフを扱いましたが、面グラフでも同様に
マッピングするデータにて、事前に100%でスケールされている必要があります。
mukkujohn.hatenablog.com

というわけで、
100%積み上げ面グラフを図示するために、データの前処理を行います。

#上で使ったデータを、plyrパッケージのddply関数を使って
#年ごと、合計値からパーセンテージを算出して、Percent列に値を格納する
uspopage_prop <- 
  ddply(uspopage, "Year", transform, Percent = Thousands / sum(Thousands) * 100)

このデータを通常の積み上げ面グラフと同様に図示します。

ggplot(uspopage_prop, aes(x=Year,y=Percent,fill=AgeGroup)) +
  geom_area(colour="black",size=0.2,alpha=0.4) +
  scale_fill_brewer(palette="Blues",breaks=rev(levels(uspopage$AgeGroup)))

f:id:MukkuJohn:20160824230839p:plain
積み上げの順番や、凡例の並びの指定など積み上げ面グラフと同じです。

折れ線の周りの網掛け

折れ線の周りの網掛けとは、何を言っているのか?と。
実際にはこんなグラフです。折れ線の上下で、一定の区間を表現したものです。
f:id:MukkuJohn:20160824231016p:plain

このグラフもマッピングの前段階で、上下の一定区間を表すデータが必要です。

> head(clim)
  Year Anomaly10y Unc10y
1 1800     -0.435  0.505
2 1801     -0.453  0.493
3 1802     -0.460  0.486
4 1803     -0.493  0.489
5 1804     -0.536  0.483
6 1805     -0.541  0.475

実際の折れ線データが、Anomaly10yで、上下の区間がUnc10yになります。

折れ線に上下を表すには、geom_ribbon()を使います。
geom_ribbon内で、y軸に対して、maxとminを指定します。

ggplot(clim,aes(x=Year,y=Anomaly10y)) +
  geom_ribbon(aes(ymin=Anomaly10y-Unc10y,ymax=Anomaly10y+Unc10y), alpha=0.2) +
  geom_line()

f:id:MukkuJohn:20160824231016p:plain


上下の区間の表現方法ですが、geom_ribbonを利用する以外に、
geom_lineを使って、それぞれ別の線として表現する方法もあります。

ggplot(clim,aes(x=Year,y=Anomaly10y)) +
  geom_line(aes(y=Anomaly10y-Unc10y),colour="grey50",linetype="dotted") + 
  geom_line(aes(y=Anomaly10y+Unc10y),colour="grey50",linetype="dotted") + 
  geom_line()

f:id:MukkuJohn:20160824231801p:plain


100%積み上げ面グラフと、折れ線の周りの網掛けですが、
マッピングの前段階で、データが必要になるため、
グラフ化するテクニックよりも、データを用意するテクニックが重要です。


次回からは、散布図を扱っていきます。