hack のためのネタ帳, etc,,,

幾つかポイントを挙げると、
  • geom_bar() による縦棒グラフを coord_flip() を用いて x,y 軸反転させると横棒グラフになる。
  • ただし、x,y 軸を反転すると y 軸は上方向が正なので、下から上方向が昇順になってしまう。
  • 回答を上から下方向を昇順として並べるためには、x の値に用いる factor を作る際に levels を rev() で降順にしておく。
  • 白背景にするには theme_bw() を与える。
  • 軸の目盛り位置と表示は scale_y_continuous() に与える。labels に目盛りのテキスト整形関数を与えて、breaks と minor_breaks に目盛り位置を与える。
  • 軸の範囲は coord_flip() に与える。
  • aes() で fill を指定しないと着色出来ない。
  • fill に数値を与えると、scale_fill_manual() で「Error: Continuous value supplied to discrete scale」と言われる。
  • fill を指定すると凡例(legend)が出るため theme() で隠す。

# データの準備
x = c("A1","A2","A3","A4","A5","MA", "NA"); x = factor(x, levels=rev(x))
y = c( 120,  82,  55,  73,  26,   3,  22)
z = data.frame(answer=x, count=y, ratio=y/sum(y))

# ggplot2 による横棒グラフのプロット
g = ggplot(z)
g = g + aes(x = answer, y = ratio, fill="1")
g = g + geom_bar(stat="identity")
g = g + theme_bw() + theme(legend.position = "none")
g = g + labs(title="アンケート回答結果")
g = g + xlab("回答") + ylab("割合")
g = g + scale_y_continuous(labels=function(x){sprintf("%3.0f%%",x*100)}, breaks=seq(0,1,0.1), minor_breaks=NULL)
g = g + coord_flip(ylim=c(-0.05,1.05))
g = g + geom_text(aes(y =  ratio, label = sprintf("%5.1f%%", 100*ratio)), hjust="left")
g = g + geom_text(aes(y =  -0.01, label = sprintf("%4d"    ,     count)), hjust="right")
g = g + scale_fill_manual(values=c("#80c0ff"))
plot(g)

ポイント
  • fill に year 等、グループ分け用のフィールドを与える。
  • geom_bar() に position="doodge" を指定することで横に並べる。
  • doodge の順番を昇順にするために fill で割り当てるフィールドについて factor の levels を降順ソートしておく。
  • guides() に fill=guide_legend(reverse=T)) を与えることで凡例の順番を逆転する。

# データの準備
z = data.frame()

r = c(2018,2018,2018,2018,2018,2018,2018) %>% as.factor()
x = c("A1","A2","A3","A4","A5","MA","NA"); x = factor(x, levels=rev(x))
y = c( 120,  82,  55,  73,  26,   3, 22)
z = rbind(z,data.frame(year=r, answer=x, count=y, ratio=y/sum(y)))

r = c(2019,2019,2019,2019,2019,2019,2019) %>% as.factor()
x = c("A1","A2","A3","A4","A5","MA", "NA"); x = factor(x, levels=rev(x))
y = c( 130,  76,  43,  30,  41,   1,  18)
z = rbind(z,data.frame(year=r, answer=x, count=y, ratio=y/sum(y)))

z$year = factor(z$year, levels=sort(levels(z$year),decreasing=T))

# ggplot2 による横棒グラフのプロット
g = ggplot(z)
g = g + aes(x = answer, y = ratio, fill=year)
g = g + geom_bar(stat="identity", position="dodge")
g = g + theme_bw()
#g = g + theme(legend.position = "none")
g = g + labs(title="アンケート回答結果")
g = g + xlab("回答") + ylab("割合")
g = g + scale_y_continuous(labels=function(x){sprintf("%3.0f%%",100*x)}, breaks=seq(0,1,0.1), minor_breaks=NULL)
g = g + coord_flip(ylim=c(-0.05,1.05))
g = g + geom_text(aes(y =  ratio, label = sprintf("%5.1f%%", 100*ratio)), hjust="left",  position=position_dodge(1))
g = g + geom_text(aes(y =  -0.01, label = sprintf("%4d"    ,     count)), hjust="right", position=position_dodge(1))
g = g + scale_fill_manual(values=c("#80c0ff", "#c080ff"))
g = g + guides(fill = guide_legend(reverse=T))
plot(g)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です