如何制作嵌套饼图?

时间:2019-12-02 16:28:48

标签: r pie-chart

我想制作一个嵌套的饼形图,其中内部依赖于外部。 由于我无法找到答案,但我设法自己解决了问题,因此我想分享我的解决方案,以帮助可能遇到此问题的其他人。

以下是我正在使用的数据的示例:

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

以下是我目前拥有的结果的视图:

enter image description here 如您所见,内部饼图取决于外部饼图。

但是现在我还有另一个问题,如何修改图表的图例?我希望我的图例中只有3个元素,它们是我在my_color中使用的元素。 因为我能够看到您可以修改name属性来更改图例名称,但这不适用于饼图。

0 个答案:

没有答案