0

我最近开始使用 R,并且一直在尝试使用 ggplot 绘制带有多个甜甜圈的图形。我受到以下问题的启发 - ggplot Donut chart,但我想创建几个带有 for 循环的环。

我构建了一个测试数据框,如下所示:

library(ggplot2)

# Create test data.
rings<-data.frame(cat=c("A", "B", "C","D","E"), ring1=c(10, 60, 3, 70,5), ring2=c(20,30,8,15,1), ring3=c(5,40,80,22,10), ring4=c(10,60,16,25,20) )

for (y in 2:5){
# Add addition columns, needed for drawing with geom_rect.
rings[[y]] =  rings[[y]] / sum(rings[[y]])
rings[[y]] = cumsum(rings[[y]])
}

比我使用以下代码构建的第一个甜甜圈:

max<-4.5
min<-4

plot = ggplot(rings, aes(fill=cat, ymax=rings[[2]], ymin=c(0, head(rings[[2]], n=-1)), xmax=max, xmin=min)) +
geom_rect() +
coord_polar(theta="y") +
xlim(c(0, 10)) +
theme_bw() +
theme(panel.background = element_rect(fill = NA)) +
theme(panel.grid=element_blank()) +
theme(axis.text=element_blank()) +
theme(axis.ticks=element_blank()) +
labs(title="Customized ring plot")

如果我在没有 for 循环的情况下编写代码,一切正常,并且环很好地堆叠,可以看出环与其他环明显不同。

plot <- plot + geom_rect(data=rings, xmax=max, xmin=min, aes(ymax=rings[[2]], ymin=c(0,   head(rings[[2]], n=-1))))
min<-max
max<-max+0.5
plot <- plot + geom_rect(data=rings, xmax=max, xmin=min, aes(ymax=rings[[3]], ymin=c(0,     head(rings[[3]], n=-1))))
min<-max
max<-max+0.5
plot <- plot + geom_rect(data=rings, xmax=max, xmin=min, aes(ymax=rings[[4]], ymin=c(0, head(rings[[4]], n=-1))))
min<-max
max<-max+0.5
plot <- plot + geom_rect(data=rings, xmax=max, xmin=min, aes(ymax=rings[[5]], ymin=c(0,  head(rings[[5]], n=-1))))

print(plot)

当我编写 for 循环时,前 3 个环的类别分布相同,只有第四个和最后一个不同。

for (y in 3:5){
plot <- plot + geom_rect(data=rings, xmax=max, xmin=min, aes(ymax=rings[[y]], ymin=c(0, head(rings[[y]], n=-1))))
min<-max
max<-max+0.5
} 
print(plot)

我尝试了不同的方法来做到这一点,但我似乎看不到问题所在。我想我很好地实现了 print() 命令。我还尝试将 ggplots 转换为 ggtables,受以下问题的启发 - Overlaying two graphics using viewports but only works with 2 ggplots(或者至少我不能向 ggtable 添加更多信息)。

抱歉,如果这是重复的帖子,但我昨天和今天都在尝试实施其他几个选项,但似乎没有一个有效。

4

0 回答 0