2017-04-18 3 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으로 가야했습니다.

원하는 것은 가능하지만, gtablegtable 패키지에 익숙해야합니다. 중첩 된 목록이 많아서 궁극적으로 수정하려는 객체가 맨 아래에 있기 때문에 이것은 매우 혼란스러워 보일 것입니다. 그냥 참아 : gb, gb2label_text 모든 동적으로 우리가 수정하려는 그 아래 수준에 도달하도록 설계되어 생성

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 명 선. 객체를 가져올 경로가 생기면 mapply을 사용하여 객체를 수정하고 col을 원하는 벡터로 변경합니다.

+1

위대한 답변! 고마워. 나는 단지 범례가 여러 개 있고이 변경 사항 중 하나만 적용하려는 경우 gb2에 값을 할당하는 방법에 약간주의를 기울일 필요가 있다고 생각합니다. 모든 범례에는 "가이드"이름이 있으므로 어떤 것을 편집하고 그에 따라 gb2를 설정해야하는지 확인해야합니다. 이는 자동화가 덜되고 실습을 더 필요로합니다. –