制作一个面积相等的饼图并按组标记

make a pie chart with equal areas and label by group

虽然我对此持谨慎态度,但我认为饼图可能是显示存在-不存在数据的好方法。

下面我创建了代表性数据,其中 10 个人拥有四种不同病原体 (AAA:DDD) 的二进制数据(0 或 1)。在使用 ggplot 之前,我先将数据制作成宽格式,然后再制作长格式。

set.seed(123)
dat <- data.frame(ID = as.factor(seq(1,10,1)),
            AAA = as.factor(sample(c(0,1), 10, replace = T)),
            BBB = as.factor(sample(c(0,1), 10, replace = T)),
            CCC = as.factor(sample(c(0,1), 10, replace = T)),
            DDD = as.factor(sample(c(0,1), 10, replace = T)))
head(dat)

library(tidyr)
datLong <- gather(dat, Disease, YesNo, -ID)
head(datLong)

我想为每个人(例如每个级别的 ID)创建一个饼图。对于所有个人,饼图将具有相同的形状和形式。我希望饼图平均分为四个部分,代表四种病原体 (AAA:DDD)。如果动物有病原体(YesNo == 1),则填充饼图,如果个体没有病原体(例如 YesNo == 0),则饼图存在,但不填充。

为此,我创建了一个新列 (New),如果未发现病原体,则为 NA。

datLong$New <- ifelse(datLong$YesNo == 0, NA , as.character(datLong$Disease ))

我还创建了一个位置 (Pos) 列来标记每个饼图切片。

datLong$Pos <- ifelse(datLong$Disease == "AAA", 0.5, 
                        ifelse(datLong$Disease == "BBB", 1.5,
                        ifelse(datLong$Disease == "CCC", 2.5,
                        ifelse(datLong$Disease == "DDD", 3.5, NA))))

使用下面的代码,我可以制作出大部分正确的情节。但是,当病原体为 NA 时,它会被跳过而不是包含但不会被填充,这会导致与标签不匹配。

library(ggplot2)

ggplot(datLong, aes(x = "", color = New, fill = New)) +
 geom_bar(width = 1, color = "black")+
 geom_text(aes(x= factor(1), y=Pos, label = New), size= 8) + 
 facet_wrap(~ID) +
   scale_fill_brewer(palette="Dark2") +
  scale_color_brewer(palette="Dark2") +
  theme(axis.text.x=element_blank(),
        panel.grid=element_blank()) +
 guides(colour=FALSE)  + guides(fill=FALSE) + 
 coord_polar(theta = "y") 

顺时针,我想按字母顺序固定每个病原体(是否存在)的位置。

提前感谢任何建议and/or更正!

我想你可以通过添加美学来很容易地解决这个问题group = disease

绘图函数现在看起来像这样

ggplot(datLong, aes(x = "", color = New, fill = New, group = Disease)) +
  geom_bar(width = 1, color = "black")+
  geom_text(aes(x= factor(1), y = Pos, label = New), size = 8) + 
  facet_wrap(~ID) +
  scale_fill_brewer(palette = "Dark2") +
  scale_color_brewer(palette = "Dark2") +
  theme(axis.text.x = element_blank(),
        panel.grid = element_blank()) +
  guides(colour = FALSE)  + guides(fill = FALSE) + 
  coord_polar(theta = "y") 

另一件事,而不是使用嵌套 ifelse,它确实不能很好地扩展,您可以使用子集来给出相同的结果

seq(0.5, 3.5, 1)[as.factor(datLong$Disease)] 

或者,您可以使用 plyr::mapvalues