Джиттер geom_text во вложенных круговых диаграммах - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь построить вложенную круговую диаграмму с указанием различных вложенных факторов и их значений. Это мой набор данных ниже


df <- structure(list(Treatment = c("Parent", "3M", "6M", "S5F", "SO", 
"A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", 
"B", "C", "D"), value = c(0, 3037, 9137, 6648, 843, 145, 276, 
2009, 607, 318, 867, 6480, 1472, 192, 636, 5215, 605, 15, 72, 
708, 48), level = c(0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2), fill = c(NA, "3M", "6M", "S5F", "SO", "3M", 
"3M", "3M", "3M", "6M", "6M", "6M", "6M", "S5F", "S5F", "S5F", 
"S5F", "SO", "SO", "SO", "SO")), .Names = c("Treatment", "value", 
"level", "fill"), row.names = c(NA, -21L), class = "data.frame")

Это то, что я сделал до сих пор, чтобы построить вложенную круговую диаграмму enter image description here


Все выглядит хорошо, за исключением области пурпурного цвета. Здесь текст все перемешан, и это не очень понятно. Я пробовал position_stack_repel вариант, и он не работает. Это мой рабочий код ниже. Я был бы признателен, если бы кто-нибудь предложил решение, показывающее простой и удобный способ маркировки текста для указания значения в каждом вложенном фрагменте.


position_stack_repel function

library(rlang)

          position_stack_repel <- function(vjust = 1, reverse = FALSE, 
                                           offset = 1) {
            ggproto(NULL, PositionStackRepel, vjust = vjust, reverse = reverse,
                    offset = offset)
          }

          PositionStackRepel <- ggproto("PositionStackRepel", PositionStack,
                                        type = NULL,
                                        vjust = 1,
                                        fill = FALSE,
                                        reverse = FALSE,
                                        offset = 1,

                                        setup_params = function(self, data) {
                                          list(
                                            var = self$var %||% ggplot2:::stack_var(data),
                                            fill = self$fill,
                                            vjust = self$vjust,
                                            reverse = self$reverse,
                                            offset = self$offset
                                          )
                                        },

                                        setup_data = function(self, data, params) {
                                          data <- PositionStack$setup_data(data, params)
                                          data <- data[order(data$x), ]
                                          data$to_repel <- unlist(by(data, data$x, function(x) {
                                            sapply(seq(nrow(x)), function(i) {
                                              (x$y[i]) / sum(x$y) < 0.1 & (
                                                (if (i != 1) (x$y[i-1] / sum(x$y)) < 0.1 else FALSE) | (
                                                  if (i != nrow(x)) (x$y[i+1] / sum(x$y)) < 0.1 else FALSE))
                                            })
                                          }))
                                          data
                                        },

                                        compute_panel = function(data, params, scales) {
                                          data <- PositionStack$compute_panel(data, params, scales)
                                          data[data$to_repel, "x"] <- unlist(
                                            by(data[data$to_repel, ], data[data$to_repel, ]$x, 
                                               function(x) seq(x$x[1] - 0.3, x$x[1] + 0.3, length.out = nrow(x))))
                                          data
                                        }
          )

Вложенная круговая диаграмма

      df %>% 
            mutate(Treatment = as.factor(Treatment) %>% fct_reorder2(fill, value)) %>%
            arrange(fill, Treatment) %>%
            mutate(level = as.factor(level)) %>%
            ggplot(aes(x = level, y = value, fill = fill, alpha = level)) +
            geom_col(width = 1, color = "gray90", size = 0.25, position = position_stack()) +
            geom_text(aes(label = Treatment), size = 2.5, position = position_stack(vjust = 0.5)) +
            geom_text(aes(label = value), size = 2.5,check_overlap = TRUE, position = position_stack_repel(vjust =0.65, offset = 1,reverse = FALSE)) +
            coord_polar(theta = "y") +
            scale_alpha_manual(values = c("0" = 0, "1" = 1, "2" = 0.7), guide = F) +
            scale_x_discrete(breaks = NULL) +
            scale_y_continuous(breaks = NULL) +
            scale_fill_brewer(palette = "Dark2", na.translate = F) +
            labs(x = NULL, y = NULL) +
            theme_minimal()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...