Итак, я нашел способ исправить цвета осей и масштабировать графики с помощью сетки. Основываясь на приведенном выше представлении:
# Generate a function to get the legend of one of the ggplots
get_legend<-function(myggplot){
tmp <- ggplot_gtable(ggplot_build(myggplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)
}
# From the full dataset, find the value of the country with the highest percent of any var_name
max <- round(max(tbl$perc), digits = 2)
# create a sequence of length 6 from 0 to the largest perc value
max_seq <- seq(0, max, length = 6)
# initiate empty list
my_list <- list()
# list of countries to loop through
my_sub <- c("A", "B")
Теперь мы l oop по каждой стране, сохраняя каждый график страны в пустой список.
for(i in my_sub){
### Wrangle
tbl_sub <-
tbl %>%
dplyr::mutate(country = as.factor(country),
domain = as.factor(domain)) %>%
dplyr::filter(country == i),
dplyr::mutate(perc = ifelse(is.na(perc), 0, perc))
# Create custom coord_polar arguments
cp <- coord_polar(theta = "x", clip = "off")
cp$is_free <- function() TRUE
p <-
ggplot(dplyr::filter(tbl_sub, country == i),
aes(x = forcats::as_factor(var_name),
y = perc)) +
cp +
geom_bar(stat = "identity", aes(fill = color)) +
facet_grid(. ~ country, scales = "fixed") +
scale_y_continuous(breaks = c(max_seq),
labels = scales::label_percent(),
limits = c(0, max(max_seq))) +
scale_fill_identity(guide = "legend",
name = "Domain",
labels = c(darkolivegreen4 = "domain a",
orange = "domain c",
navy = "domain b" ,
purple = "domain d",
grey = "not applicable")) +
labs(x = "",
y = "") +
theme_bw() +
theme(aspect.ratio = 1,
panel.border = element_blank(),
strip.text = element_text(size = 16),
axis.title = element_text(size = 18),
title = element_text(size = 20),
axis.text.x = element_text(colour = tbl_new$color, face = "bold"),
legend.text = element_text(size = 14))
my_list[[i]] <- p
}
Теперь у нас есть графики в list, мы хотим поиграть с легендой и использовать grid :: и gridExtra, чтобы построить все вместе.
# pull legend from first ggplot in the list
legend <- get_legend(my_list[[1]])
# remove legends from all the plots in the list
for(i in 1:length(my_list)){
my_list[[i]] <- my_list[[i]] + theme(legend.position = "none")
}
# plot everything together
p <- grid.arrange(arrangeGrob(
grobs = my_list,
nrow = round(length(my_sub)/2, 0),
left = textGrob("Y axis",
gp = gpar(fontsize = 20),
rot = 90),
bottom = textGrob("X axis",
gp = gpar(fontsize = 20),
vjust = -3),
top = textGrob("Big plot",
gp = gpar(fontsize = 28, vjust = 2))),
legend = legend,
widths = c(9,1,1),
clip = F)
Это дает следующее изображение:
Графики масштабируются по стране с наибольшим значением на c (0 - 11%), и каждая страна имеет уникальные серые значения в зависимости от того, есть ли в столбце c значение 0 или NA.
Я уверен, что есть более простые c решения, но пока это помогает мне!