ggplot2의 패싯에 일반 레이블을 어떻게 추가합니까?


82

나는 종종 패싯에 대한 숫자 값을 가지고 있습니다. 축 제목과 유사한 보충 제목에서 이러한 패싯 값을 해석하는 데 충분한 정보를 제공하고 싶습니다. 라벨러 옵션은 불필요한 텍스트를 많이 반복하며 더 긴 가변 제목에는 사용할 수 없습니다.

어떤 제안?

기본값 :

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20))
qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

여기에 이미지 설명 입력

내가 좋아하는 것 :

여기에 이미지 설명 입력

ggplot에서 할 수있는 최선의 방법 :

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)

여기에 이미지 설명 입력

@Hendy가 나타내는 것처럼 다음과 유사합니다. ggplot2 플롯에 보조 y 축 추가-완벽하게 만듭니다.


1
이런 젠장. 나는 단지 이것을 찾고 있었고 , 구글을 통해 이것을 발견했습니다 ... 그리고 지금 그것이 몇 분 전에 요청 된 것을 봅니다. 이 질문 은 다른 것을 암시 할 수있는 제목에도 불구하고 그의 의견에 따라 동일한 질문을하는 것 같습니다. 설명 할 훌륭한 모형. 이것은 정확히 내 문제입니다. 내 수치 적 패싯 범주를 설명 할 필요가 없다면 좋을 것입니다. 그래프는 패싯 변수가 무엇인지 설명하는 간단한 레이블로 자체적으로 설명해야합니다.
헨디

3
나는 이메일을 통해 주요 ggplot 개발자 중 한 명인 Winston Chang (그의 SO 핸들을 모릅니다)에게 문의했습니다. 그는 이것이 현재 옵션이라고 생각하지 않지만 추가하는 것을 고려할 수 있습니다. 그는 내가 GitHub의에 문제를 추가 제안 내가 한 있도록
Hendy

1
메일 링리스트에 올라 와서 Winston이 알려준 것 같습니다. 그는 최상위 레이블에 대한 일반적인 구현으로 브랜치를 만들었습니다. 여기 에서 스레드를 참조 하십시오 . @hadley : 당신이 맞습니다. 나는 일반적으로하는 것이 얼마나 어려운지 전혀 모른다. 이것이 결코 일어나지 않는다면 ... ggplot에 대한 나의 감사가 여전히 우세합니다 :)
Hendy

1
어느 시점에서 나는 R / ggplot2를 엉망으로 만들고 이미지 편집기를 사용하여 원하는 수정을 시도하지 않습니다.
Andy

2
여기에 모범 사례에 대한 업데이트가 있습니까?
Arthur Yip

답변:


49

최신 버전 ggplot2gtable내부적으로 사용 되므로 Figure를 수정하는 것은 매우 쉽습니다.

library(ggplot2)
test <- data.frame(x=1:20, y=21:40, 
                   facet.a=rep(c(1,2),10), 
                   facet.b=rep(c(1,2), each=20))
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

# get gtable object
z <- ggplotGrob(p)

library(grid)
library(gtable)
# add label for right strip
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))),
                     4, 8, 6, name = paste(runif(2)))

# add label for top strip
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 2", gp = gpar(col = gray(1)))),
                     3, 4, 3, 6, name = paste(runif(2)))

# add margins
z <- gtable_add_cols(z, unit(1/8, "line"), 7)
z <- gtable_add_rows(z, unit(1/8, "line"), 3)

# draw it
grid.newpage()
grid.draw(z)

여기에 이미지 설명 입력

물론 스트립 라벨을 자동으로 추가하는 함수를 작성할 수 있습니다. 의 향후 버전 ggplot2에이 기능이있을 수 있습니다. 그래도 확실하지 않습니다.


-이것이 0.9.3.1 버전에서 여전히 가장 깨끗한 접근 방식인지 궁금합니다. 최신 문서 docs.ggplot2.org/0.9.3.1
yosukesabai

1
버전 0.9.3.1가 제공하는 ggplotGrob()그와 동일합니다 ggplot_gtable(ggplot_build()). 이것이 여전히 최선의 방법이라고 생각합니다.
kohske 2013-06-23

1
내가 착각하지 않았다면 일부 기능이 이제 더 이상 사용되지 않으므로이 솔루션은 더 이상 유효하지 않습니다.
Remi.b

1
Remi.b @ 지금 그것을 시도
RAWR

3
이것은 ggplot2 3.2.1 및 R 3.6.1에서 작동하지 않습니다. 오류 메시지는 없지만 결과 플롯에 레이블이 표시되지 않습니다.
Calimo

5

더 나은 방법이있을 수 있지만 다음을 수행 할 수 있습니다.

fac1 = factor(rep(c('a','b'),10))
fac2 = factor(rep(c('a','b'),10))
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2)
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2)
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm"))
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0)   # top

1

kohske에서 설명하는 방법 외에도 추가 한 상자에 테두리를 추가 할 수 있습니다.

col=NA

...에

col=gray(0.5), linetype=1

또한 변경

fill=gray(0.5)

...에 대한

fill=grey(0.8)

gp=gpar(col=gray(1))

...에

gp=gpar(col=gray(0))

새 막대가 패싯 레이블과 일치하도록하려면

z <- gtable_add_grob(z, 
      list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))),
      textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))),
      4, 8, 6, name = paste(runif(2)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.