IT Share you

플롯 영역에 상대적인 범례 배치, ggplot

shareyou 2020. 12. 13. 11:27
반응형

플롯 영역에 상대적인 범례 배치, ggplot


여기서 문제는 조금 분명하다고 생각합니다. 범례를 '플로팅 영역'의 왼쪽 상단 모서리에 배치 (잠금)하고 싶습니다. c (0.1,0.13) 등을 사용하는 것은 여러 가지 이유로 옵션이 아닙니다.

좌표가 플로팅 영역에 상대적이되도록 좌표의 기준점을 변경하는 방법이 있습니까?

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.position = c(0, 1), title="Legend placement makes me sad")

여기에 이미지 설명 입력

건배


업데이트 : opts더 이상 사용되지 않습니다. 이 답변에theme 설명 대로 대신 사용하십시오 .

가이드의 배치는 기본적으로 플롯 영역 (즉, 회색으로 채워진 영역)을 기반으로하지만 양쪽 맞춤은 중앙에 있습니다. 따라서 왼쪽 상단 맞춤을 설정해야합니다.

ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
  opts(legend.position = c(0, 1), 
       legend.justification = c(0, 1), 
       legend.background = theme_rect(colour = NA, fill = "white"),
       title="Legend placement makes me happy")

여기에 이미지 설명 입력

전체 장치 영역에 대해 가이드를 배치하려면 gtable 출력을 조정할 수 있습니다.

p <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
  opts(legend.position = c(0, 1), 
       legend.justification = c(0, 1), 
       legend.background = theme_rect(colour = "black"),
       title="Legend placement makes me happy")

gt <- ggplot_gtable(ggplot_build(p))
nr <- max(gt$layout$b)
nc <- max(gt$layout$r)
gb <- which(gt$layout$name == "guide-box")
gt$layout[gb, 1:4] <- c(1, 1, nr, nc)
grid.newpage()
grid.draw(gt)

여기에 이미지 설명 입력


업데이트 : opts더 이상 사용되지 않습니다. 이 답변에theme 설명 대로 대신 사용하십시오 .

kohske의 답변을 확장하기 위해 다음 사람이 그것을 우연히 발견하는 것이 조금 더 포괄적입니다.

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
library(gridExtra)

a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(0, 1), legend.position = c(0, 1), title="Legend is top left")
b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(1, 0), legend.position = c(1, 0), title="Legend is bottom right")
c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(0, 0), legend.position = c(0, 0), title="Legend is bottom left")
d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(1, 1), legend.position = c(1, 1), title="Legend is top right")

grid.arrange(a,b,c,d)

여기에 이미지 설명 입력


나는 비슷한 대답을 찾고 있습니다. 그러나 opts함수가 더 이상 ggplot2 패키지의 일부가 아님을 발견했습니다 . 더 많은 시간을 검색 한 후 themeopts와 유사한 작업을 수행 하는 사용할 수 있음을 발견했습니다 . 따라서 다른 시간을 최소화하기 위해이 스레드를 편집합니다.

아래는 nzcoops에 의해 작성된 유사한 코드 입니다.

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
library(gridExtra)

a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top left") + 
theme(legend.justification = c(0, 1), legend.position = c(0, 1))

b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom right") +
theme(legend.justification = c(1, 0), legend.position = c(1, 0))

c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom left") +
theme(legend.justification = c(0, 0), legend.position = c(0, 0))

d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top right") +
theme(legend.justification = c(1, 1), legend.position = c(1, 1))

grid.arrange(a,b,c,d)

이 코드는 정확히 유사한 플롯을 제공합니다.


위의 탁월한 답변을 확장하려면 범례와 상자 외부 사이에 패딩을 추가하려면 legend.box.margin다음을 사용하십시오 .

# Positions legend at the bottom right, with 50 padding
# between the legend and the outside of the graph.
theme(legend.justification = c(1, 0), 
    legend.position = c(1, 0),
    legend.box.margin=margin(c(50,50,50,50)))

이것은 ggplot2작성 당시 v2.2.1 의 최신 버전에서 작동합니다 .

참고 URL : https://stackoverflow.com/questions/10747307/legend-placement-ggplot-relative-to-plotting-region

반응형