我想制作一个嵌套的饼形图,其中内部依赖于外部。 由于我无法找到答案,但我设法自己解决了问题,因此我想分享我的解决方案,以帮助可能遇到此问题的其他人。
以下是我正在使用的数据的示例:
my_data <- data.frame("S" = c(rep("A", 20)),
"D" = c(rep("01/01/2019", 20)),
"N" = c(rep(100, 20)),
"C" = c(rep("A", 20)),
"B" = c(rep("A", 20)),
"R" = c("AAA001", "AAA002", "AAA003", "AAA004", "AAA005", "AAA006", "AAA007", "AAA008", "AAA009", "AAA010",
"BBB001", "BBB002", "BBB003", "BBB004", "BBB005", "CCC001", "CCC002", "CCC003", "CCC004", "CCC005"),
"Des" = c(rep("A", 20)),
"Q" = c(rep(1, 20)),
"U" = c(rep("A", 20)),
"P" = c(rep(1, 20)),
"M" = c(rep(1, 20)),
"Abri" = c(rep("A", 10), rep("B", 5), rep("C", 5)),
"num" = seq.int(from = 1, to = 20, by = 1),
stringsAsFactors = FALSE)
my_data2 <- data.frame("Abri" = c(rep("A", 9), rep("B", 5)),
"S" = c(rep("A", 14)),
"Pr" = c(rep(1, 3), rep(0.5, 6), rep(1, 3), rep(0.5, 2)),
"R" = c("AAA001", "AAA002", "AAA003", "AAA004", "AAA005", "AAA006", "AAA007", "AAA008", "AAA009",
"BBB001", "BBB002", "BBB003", "BBB004", "BBB005"),
"DD" = c(rep("01/01/2019", 14)),
"DF" = c(rep("31/12/2019", 14)),
"F" = c(rep("A", 14)),
"Nature" = c(rep("A", 14)),
"Num" = c(rep("A", 14)),
stringsAsFactors = FALSE)
以下部分是我如何为外部饼图获取一个数据帧,为内部饼图获取另一个数据框:
my_match <- my_data %>%
left_join(my_data2, by = c("R", "Abri", "S")) %>%
filter(lubridate::dmy(D) >= lubridate::dmy(DD) & lubridate::dmy(D) <= lubridate::dmy(DF)) %>%
group_by(R, Abri, S, D) %>%
filter(Pr == min(Pr)) %>%
ungroup()
my_match$E <- my_match$P - my_match$Pr
my_final <- my_match[which(my_match$E > 0),]
my_match <- my_match[-which(my_match$num %in% my_final$num),]
my_miss <- anti_join(my_data, my_match)
my_data$Etat <- ifelse(test = my_data$num %in% my_match$num, yes = "PC", no = ifelse(test = my_data$num %in% my_final$num, yes = "PNC", no = "RA"))
my_abri <- aggregate(M ~ Abri, my_data, sum)
my_abri <- my_abri[order(-my_abri$M),]
my_temp <- aggregate(M ~ Abri+Etat, my_data, sum)
my_temp$name <- my_temp$Etat
my_temp$Etat <- paste(my_temp$Abri, my_temp$Etat, sep = ".")
my_temp <- my_temp[order(match(my_temp$Abri, my_abri$Abri), -my_temp$M),]
my_temp <- my_temp %>%
group_by(Abri) %>%
mutate(purcent = M / sum(M) * 100) %>%
ungroup()
my_temp$purcent <- round(my_temp$purcent)
最后是剧情的一部分:
my_color <- c("RA" = "orange", "PC" = "green", "PNC" = "blue")
gradient <- colorRampPalette(c("darkblue", "lightblue"))
my_abri$colors <- gradient(dim(my_abri)[1])
p <- plot_ly() %>%
add_pie(data = my_abri, labels = ~Abri, values = ~M, direction = "clockwise", hole = 0.6,
textinfo = "label+percent", textfont = list(color = "white"), textposition = "inside",
marker = list(line = list(color = '#FFFFFF', width = 1), colors = ~colors)) %>%
add_pie(data = my_temp, labels = ~Etat, values = ~M, direction = "clockwise",
textinfo = "text", text = paste(my_temp$purcent, "%", sep = ""), textposition = "inside",
domain = list(x = c(0.2, 0.8), y = c(0.2, 0.8)), sort = FALSE,
marker = list(line = list(color = '#FFFFFF', width = 1), colors = my_color[my_temp$name]))
p
以下是我目前拥有的结果的视图:
但是现在我还有另一个问题,如何修改图表的图例?我希望我的图例中只有3个元素,它们是我在my_color
中使用的元素。
因为我能够看到您可以修改name
属性来更改图例名称,但这不适用于饼图。