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")))
но ничего из вышеперечисленного не сработало, поэтому мне пришлось идти в gtable
s.
То, что вы хотите, возможно, но требует, чтобы вы были очень хорошо знакомы с 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
быть вектором, который вы хотите.