我想创建一个包含 3 个饼图的网格(我的真实数据很大,这里是一个示例),每个图表根据其样本大小进行缩放。例如,第 2 行、位置 b 的绘图应具有最小尺寸,而第 3 行、位置 c 的绘图应具有最大尺寸。这是一个类似的问题:使用 ggplot2 根据 R 中的大小缩放网格中的多个饼图
你能帮我吗?谢谢。
这是我的 df:
x <- data.frame(
location = c("a", "b", "c"),
samplesize = c(26, 3, 96),
a1 = c(12, 2, 77),
a2 = c(24, 1, 31),
a3 = c(15, 2, 56)
)
我可能会推出自己的饼图函数并用
geom_polygon
绘制它:
library(tidyverse)
make_pie <- function(x, y, size, groups, n, rownum) {
angles <- c(0, 2*pi * cumsum(n)/sum(n))
do.call("rbind", Map(function(a1, a2, g) {
xvals <- c(0, sin(seq(a1, a2, len = 30)) * size, 0) + x
yvals <- c(0, cos(seq(a1, a2, len = 30)) * size, 0) + y
data.frame(x = xvals, y = yvals, group = g, rownum = rownum)
}, head(angles, -1), tail(angles, -1), groups))
}
x %>%
mutate(r = row_number()) %>%
mutate(x = 1:3, y = 1) %>%
rowwise() %>%
group_map(~ with(.x, make_pie(x, y, sqrt(samplesize)/20,
c("a1", "a2", "a3"),
c(a1, a2, a3), r))) %>%
bind_rows() %>%
ggplot(aes(x, y, fill = group, group = interaction(group, rownum))) +
geom_polygon() +
annotate("text", x = 1:3, y = 1.6, label = c("a", "b", "c"), size = 7) +
coord_equal() +
theme_void(base_size = 20)