これは、ワッフル プロットまたは四角い円グラフを作成するためにtidyverse
(つまりdplyr
、tidyr
および)のみを使用する別の方法です。これはhrbrmstr の回答に基づいていますが、もう少し一般的なものにしようとしました。任意の周波数テーブルが入力として機能し、ワッフルの寸法を簡単に調整できます (たとえば、正方形ではなく長方形)。ggplot2
library(tidyverse)
freq_table = mtcars %>%
count(gear, vs, carb, wt = hp) %>%
group_by(gear, vs) %>%
mutate(pct = n / sum(n)) %>%
select(gear, vs, carb, pct)
2 番目のステップでは、座標を作成します。tidyr::expand()
の代わりに使用しwaffleize()
ます。まだ使用してsmart_round()
います。
waffle.n = 100 # Number of blocks
waffle.cols = ceiling(sqrt(waffle.n)) # For square. Otherwise pick integer.
coordinates = freq_table %>%
group_by(gear, vs) %>%
mutate(waffle.num = smart_round(pct,1) * waffle.n) %>%
group_by(carb, gear, vs) %>%
expand(count = seq(1:waffle.num)) %>%
select(-count) %>%
group_by(gear, vs) %>%
arrange(gear, vs) %>%
mutate(
waffle.x = rep_len(1:waffle.cols, waffle.n),
waffle.y = floor((row_number() - 1) / waffle.cols)
)
2 つの変数 (gear
とvs
) でグループ化するため、 を使用しますfacet_grid()
。単一の変数でグループ化する場合は、 を使用しますfacet_wrap()
。最適な結果を得るには、オプションを少し調整する必要があります (デバイスのサイズ、ポイントのサイズとストロークなど)。
fig = coordinates %>%
ggplot(aes(x = waffle.x, y = waffle.y, fill = as.factor(carb))) +
geom_point(size = 7, shape = 22, color = "white", stroke = 0.8) +
#geom_raster() + # Alternative to geom_point() without gap between blocks.
facet_grid(rows = vars(gear), cols = vars(vs)) +
theme_void() +
theme(legend.position = "bottom", plot.margin = margin(5.5, 5.5, 5.5, 5.5, "pt"), panel.spacing = unit(15, "pt"))
fig
#ggsave("fig.pdf", width = 13, height = 17.5, units = "cm", dpi = 150)
ブロックの数が奇数で、シェアが 10 で割り切れない、より興味深い例。