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()
目が痛い
デフォルトの見た目ですと、色々と辛い部分があります。
- 目が痛い(なぜこんな配色なんだ)
- 凡例の並びが、データと逆
- 塗りつぶされて、目盛り線が見えない
- グループの境界線がない
これらに対応したのが、こちら。
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)))
データの並びと凡例の並びを合わせるために、凡例を逆にしましたが、
マッピングの段階で積み上げ順序を逆にする方法もあります。
(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")
いまだ、不自然な部分がグラフの左右と下側を囲っている線です。
この左右と下側を囲む線を無くすためには、こちらのコードです。
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)
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)))
積み上げの順番や、凡例の並びの指定など積み上げ面グラフと同じです。
折れ線の周りの網掛け
折れ線の周りの網掛けとは、何を言っているのか?と。
実際にはこんなグラフです。折れ線の上下で、一定の区間を表現したものです。
このグラフもマッピングの前段階で、上下の一定区間を表すデータが必要です。
> 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()
上下の区間の表現方法ですが、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()
100%積み上げ面グラフと、折れ線の周りの網掛けですが、
マッピングの前段階で、データが必要になるため、
グラフ化するテクニックよりも、データを用意するテクニックが重要です。
次回からは、散布図を扱っていきます。