読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

ggplot2 で Google アナリティクスデータの人口ピラミッド

R Google アナリティクス グラフ

下表のデータを人口ピラミッドの形で描いてみる。

(もうちょっときれいに描ける人いそう。ご意見求む。)

user
gender
user
age bracket
users
female 18-24 628
female 25-34 1001
female 35-44 416
female 45-54 174
female 55-64 85
female 65+ 40
male 18-24 2717
male 25-34 3967
male 35-44 2121
male 45-54 836
male 55-64 491
male 65+ 173

このようなデータを Google アナリティクスから R に引っ張ってくるのには RGA パッケージが便利。

#RGA パッケージでデータ取得
library(RGA)
authorize()
prof <-list_profiles()
dat1 <-get_ga(profileId = prof$id[1],
              start.date = "2015-10-01",
              end.date = "2015-12-31",
              dimensions = "ga:userGender,ga:userAgeBracket",
              metrics = "ga:users")

以下、描画。

library(ggplot2)
ggplot(dat1,aes(x=userAgeBracket,fill=userGender)) + 
  geom_bar(data=subset(dat1,userGender=="female"),aes(y=users),stat = "identity") + 
  geom_bar(data=subset(dat1,userGender=="male"),aes(y=-users),stat = "identity") + 
  scale_y_continuous(breaks=seq(-4000,1000,by=1000),labels=abs(seq(-4000,1000,by=1000))) + 
  coord_flip()

f:id:abrahamcow:20160623114413p:plain

参考:
r - Simpler population pyramid in ggplot2 - Stack Overflow

付録

最初に考えたのは以下のような方法でしたが、修正しました。

library(ggplot2)
theme_set(theme_bw(20))
#female 棒グラフ
g1 <- 
  ggplot(subset(dat1,user.gender == "female"),
       aes(x = user.age.bracket, y = users)) + 
  geom_bar(stat = "identity", fill="tomato") +
  scale_y_reverse(limits = c(max(dat1$users),0))+
  coord_flip()+
  xlab("") +
  ylab("female")
#male 棒グラフ
g2 <-ggplot(subset(dat1,user.gender == "male"), 
       aes(x = user.age.bracket, y = users)) + 
  geom_bar(stat = "identity", fill="royalblue") +
  coord_flip() +
  xlab("") +
  ylab("male")+
  theme(axis.ticks.y = element_blank(),axis.text.y=element_blank())

library(grid)
grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
print(g1,  vp=viewport(layout.pos.row = 1, layout.pos.col = 1))
print(g2,  vp=viewport(layout.pos.row = 1, layout.pos.col = 2))

f:id:abrahamcow:20160119070913p:plain

関数 scale_y_reverse と関数 ylim は同居できないという点がつまづきポイント。

scale_y_reverse 自身が軸のスケールを操作する関数なので、引数 limit に y 軸の制限を与えればよい。