Я пытаюсь построить вложенную круговую диаграмму с указанием различных вложенных факторов и их значений. Это мой набор данных ниже
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")
Это то, что я сделал до сих пор, чтобы построить вложенную круговую диаграмму
Все выглядит хорошо, за исключением области пурпурного цвета. Здесь текст все перемешан, и это не очень понятно. Я пробовал 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()