ggplot2 разные цвета текста для каждого ярлыка легенды

Я пытаюсь сделать так, чтобы цвет текста надписей легенды соответствовал цветам заливки / линии. В идеале я хотел бы сопоставить цвет метки с эстетическим, но в этот момент я был бы так же рад вручную указать цвета. Вот некоторый тестовый код с использованием встроенного набора данных PlantGrowth, который включает мою попытку вручную указать цвета меток:

ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
    geom_boxplot() +
    scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0,
                                                                    size=9,
                                                                    color=c("red",
                                                                            "green",
                                                                            "blue"))))

Когда я запускаю этот код, все метки легенды используют первый заданный мной цвет (красный). Вместо этого я хочу, чтобы каждый ярлык легенды использовал свой цвет. Возможен ли этот тип операций в настоящее время в ggplot2?

1 ответ

Решение

Прежде всего, я попытался поэкспериментировать с различными версиями вашей текущей попытки, а также с использованием theme(legend.text = element_text(color = c("red","blue","green"))) но ничего из вышеперечисленного не сработало, поэтому мне пришлось идти в gtables.

То, что вы хотите, возможно, но требует, чтобы вы были очень хорошо знакомы с gtableс и gtable пакет. Это будет выглядеть очень грязно, потому что есть много вложенных списков, и объект, который мы в конечном итоге хотим изменить, находится внизу одного. Просто потерпи меня

library(ggplot2)
library(gtable)
library(grid)
pGrob <- ggplotGrob(ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
  geom_boxplot() +
  scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0,
                                                                  size=9))))



gb <- which(grepl("guide-box", pGrob$layout$name))
gb2 <- which(grepl("guides", pGrob$grobs[[gb]]$layout$name))
label_text <- which(grepl("label",pGrob$grobs[[gb]]$grobs[[gb2]]$layout$name))
pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text] <- mapply(FUN = function(x, y) {x$gp$col <- y; return(x)},
                                                           x =   pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text],
                                                           y =   c("red", "green", "blue"), SIMPLIFY = FALSE)

grid.draw(pGrob)

Первые 3 строки, которые создают gb, gb2, а также label_text все они предназначены для динамического перехода на тот нижний уровень, который мы хотим изменить. Когда у нас есть путь для получения объектов, мы можем изменить их, используя mapply и изменить col быть вектором, который вы хотите.

Другие вопросы по тегам