等幅の棒グラフを描画する ggplot2::position_dodge2
ggplot2で可視化した時に棒グラフの幅が変わって、変な見た目になってしまうことにたまに出会す。それを position_dodge2 で調整するメモ。
2つのウェブサイトがあり、ある期間に訪れた頻度ごとのユーザ数が記録されたようなデータがあるとする。
> library(tidyverse) > > set.seed(1357) > log_tbl <- tibble( + site = c(rep("A", 10), rep("G", 7)), + freq = c(1:10, 1:7), + user = c(rpois(10, 10), rpois(7, 10)) + )
サイトGの方は、8回以上の頻度で訪れたユーザが存在しない。
> log_tbl # A tibble: 17 x 3 site freq user <chr> <int> <int> 1 A 1 11 2 A 2 15 3 A 3 6 4 A 4 9 5 A 5 10 6 A 6 7 7 A 7 13 8 A 8 10 9 A 9 6 10 A 10 10 11 G 1 6 12 G 2 7 13 G 3 15 14 G 4 11 15 G 5 12 16 G 6 13 17 G 7 11
これを普通に可視化すると、サイトAの頻度8回以上の棒幅が広くなってしまう。
> log_tbl %>% + ggplot(aes(x = freq, y = user, fill = site)) + + geom_bar(stat = "identity", position = "dodge") + + scale_x_discrete(limits = 1:10) + + theme(legend.position = "top", + legend.title = element_text(size = 15), + legend.text = element_text(size = 12), + axis.title = element_text(size = 15), + axis.text = element_text(size = 15))
そこで、position_dodge2 を活用して、等幅の見た目に調整してやる。
> log_tbl %>% + ggplot(aes(x = freq, y = user, fill = site)) + + geom_bar(stat = "identity", + position = position_dodge2(preserve = "single", padding = 0)) + + scale_x_discrete(limits = 1:10) + + theme(legend.position = "top", + legend.title = element_text(size = 15), + legend.text = element_text(size = 12), + axis.title = element_text(size = 15), + axis.text = element_text(size = 15))
padding 設定も行うことで、見た目を変更することができる。 多少書くことが増えてしまうが、普段から position_dodge2 を利用しておくのも良さそうである。