今週も特にありません

進捗どうですか?

等幅の棒グラフを描画する 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))

f:id:masaqol:20200930231913p:plain

そこで、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))

f:id:masaqol:20200930232246p:plain

padding 設定も行うことで、見た目を変更することができる。 多少書くことが増えてしまうが、普段から position_dodge2 を利用しておくのも良さそうである。

ggplot2.tidyverse.org