2012-04-16 4 views
14

factor 변수에 따라 패싯을 도입하여 example of a simple forest 플롯을 수정하려고합니다. 이 구조의ggplot2 패싯에서 빈 요소를 제거하려면 어떻게해야합니까?

가정 데이터 :

test <- structure(list(characteristic = structure(c(1L, 2L, 3L, 1L, 2L 
), .Label = c("Factor1", "Factor2", "Factor3"), class = "factor"), 
    es = c(1.2, 1.4, 1.6, 1.3, 1.5), ci_low = c(1.1, 1.3, 1.5, 
    1.2, 1.4), ci_upp = c(1.3, 1.5, 1.7, 1.4, 1.6), label = structure(c(1L, 
    3L, 5L, 2L, 4L), .Label = c("1.2 (1.1, 1.3)", "1.3 (1.2, 1.4)", 
    "1.4 (1.3, 1.5)", "1.5 (1.4, 1.6)", "1.6 (1.5, 1.7)"), class = "factor"), 
    set = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("H", "S" 
    ), class = "factor")), .Names = c("characteristic", "es", 
"ci_low", "ci_upp", "label", "set"), class = "data.frame", row.names = c(NA, 
-5L)) 

그리고 코드를 실행 :

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + geom_pointrange() + 
    coord_flip() + geom_hline(aes(x=0), lty=2) + 
    facet_wrap(~ set, ncol = 1) + 
    theme_bw() + 
    opts(strip.text.x = theme_text()) 

출력처럼 생성합니다 :

enter image description here

모든 좋은 지금까지. 그러나 필자는 낮은 패널에서 빈 Factor3 레벨을 제거하고이를 수행 할 수있는 방법을 찾을 수 없습니다. 그것을 할 방법이 있습니까?

도움 주셔서 감사합니다. 생산 어떤

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + geom_pointrange() + 
    coord_flip() + geom_hline(aes(x=0), lty=2) + 
    facet_wrap(~ set, ncol = 1, scales="free") + 
    theme_bw() + 
    opts(strip.text.x = theme_text()) 

p 

:

+5

R을 참조 할 때 "거기 있습니까?"라는 질문을 중단하고 "어떻게 할 수 있습니까?"라고 묻기 시작했습니다. "install.packages ("fortunes "); 도서관 (행운); 행운 ("요다")' –

답변

14

EDIT ggplot2로 업데이트 0.9.3

다른 해결책이 있습니다. facet_gridspace = "free"을 사용합니다. 또한 geom_point()geom_errorbarh()을 사용하므로 coord.flip()이 필요하지 않습니다. 또한 x 축 눈금 표시 레이블은 아래쪽 패널에만 나타납니다. 아래 코드에서 theme 명령은 필수는 아닙니다. 가로 쓰기 텍스트를 회전하는 데 사용됩니다.

library(ggplot2) 

p <- ggplot(test, aes(y = characteristic, x = es, xmin = ci_low, xmax = ci_upp)) + 
    geom_point() + 
    geom_errorbarh(height = 0) + 
    facet_grid(set ~ ., scales = "free", space = "free") + 
    theme_bw() + 
    theme(strip.text.y = element_text(angle = 0)) 

p 

이 솔루션은 위컴의 ggplot2 책의 124 페이지의 예를 기반으로 : 위에서 test dataframe을 사용하여, 다음 코드는 당신이 원하는 무엇을 생산해야한다.

+1

ggplot2는 결코 나를 놀라게하지 않습니다. – radek

12

사용 scales = free 같이

enter image description here

편집 :

p <- ggplot(test, aes(x=characteristic, y=es, ymin=ci_low, ymax=ci_upp)) + 
    geom_pointrange() + 
    coord_flip() + geom_hline(aes(x=0), lty=2) + 
    facet_wrap(~ set, ncol = 1, drop=TRUE) + 
    theme_bw() + 
    opts(strip.text.x = theme_text()) 

p 
: 사실은 내가 더 잘이 솔루션에서와 drop = TRUE 인수처럼 생각
+0

우수! 매력으로 일했습니다. 한 가지 질문 : 패널은 항상 비례 크기 (수직)가됩니까? 거기에 .. 아닙니다 - 어떻게 사용하는 요소의 수에 따라 각각을 확장 할 수 있습니까? 예를 들어 - 상단 패널에 10 개, 하단 패널에 3 개가있는 경우? – radek

+3

'space = "free"가 당신이 찾고있는 다른 주장이라고 생각합니다. –

+0

'space = "free"인자가 [facet_grid] (http://had.co.nz/ggplot2/facet_grid.html) 용이라고 생각합니다. 그러나 'scales ='free_x ''는 더 이상 작동하지 않습니다 :/ – radek

관련 문제