制作一个面积相等的饼图并按组标记
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
虽然我对此持谨慎态度,但我认为饼图可能是显示存在-不存在数据的好方法。
下面我创建了代表性数据,其中 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