制作具有相同区域的饼图,并按组

时间:2016-06-20 16:37:22

标签: r charts ggplot2 pie-chart

虽然我谨慎对待这一点,但我认为饼图可能是显示在场缺席数据的好方法。

下面我创建代表性数据,其中10个人具有针对四种不同病原体的二元数据(0或1)(AAA:DDD)。在使用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),馅饼切片将被填入,如果个体dos没有病原体(例如YesNo == 0),馅饼切片将出现,但未填写。

为此,如果未找到病原体,我已经制作了一个新的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") 

顺时针方向,我想按字母顺序修复每种病原体的位置(无论是否存在)。

提前感谢任何建议和/或更正!

1 个答案:

答案 0 :(得分:1)

我认为你可以通过添加审美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