2017-04-18 323 views
3

我試圖讓圖例標籤的文字顏色與其相關的填充/線條顏色相匹配。理想情況下,我想將標籤顏色映射到美學上,但在這一點上,我很樂意手動指定顏色。下面是使用內置PlantGrowth數據集,其中包括我的嘗試手動指定標籤顏色一些測試代碼:ggplot2每個圖例標籤的不同文字顏色

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中嗎?

回答

3

首先,我試着嘗試不同版本的當前嘗試以及使用theme(legend.text = element_text(color = c("red","blue","green"))),但以上都沒有工作,所以我不得不去gtable s。

你想要什麼是可能的,但要求你非常熟悉gtable s和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) 

enter image description here

第3行,創造gbgb2label_text都可以動態得到我們想要修改底層。一旦我們有了獲取對象的路徑,我們就可以使用mapply對它們進行修改,並將col更改爲您想要的矢量。

+1

很好的回答!謝謝你。我只是補充一點,如果你有多個傳說,只想將這個改變應用到其中的一個,我想你應該小心一點,你如何爲gb2賦值。由於所有圖例都有「指南」名稱,因此您需要檢查您想要編輯哪一個,並相應地設置gb2。這不太自動化,需要更多的實踐工作。 –

相關問題