虽然我谨慎对待这一点,但我认为饼图可能是显示在场缺席数据的好方法。
下面我创建代表性数据,其中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")
顺时针方向,我想按字母顺序修复每种病原体的位置(无论是否存在)。
提前感谢任何建议和/或更正!
答案 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