ggplot2 facet_wrap의 열에서 여러 패싯 스트립 결합

두 개의 인접한 패널에 패싯 스트립을 결합하려고합니다 (항상 동일한 첫 번째 ID 변수를 가진 두 개의 인접한 패널이 있지만 두 개의 다른 시나리오에서는 "A"와 "B"라고 부릅니다). 나는 내가 시도한 gtable+ grid솔루션에 특별히 집착 하지는 않았지만 슬프게도 패키지 facet_nested()에서 사용할 수 없습니다 ggh4x(여러 제한이 있고 종속성이 필요하기 때문에 회사 서버에 설치할 수 없습니다-관련 코드 만 사용하여 살펴 보았습니다. , 그러나 종속성으로 인해 쉽지 않습니다.)

상단 패싯 스트립을 결합하여 "함께 속한"패널을 표시하여 읽기 쉽게 만들고 싶은 기본 플롯의 최소 실행 가능한 예는 다음과 같습니다.

library(tidyverse)
library(gtable)
library(grid)

idx = 1:16

p1 = expand_grid(id=idx, id2=c("A", "B"), x=1:10) %>%
  mutate(y=rnorm(n=n())) %>%
  ggplot(aes(x=x,y=y)) +
  geom_jitter() +
  facet_wrap(~id + id2, nrow = 4, ncol=8)

여기에 이미지 설명 입력

"1"이있는 스트립, "2"가있는 스트립 등을 결합해야합니다 (실제로는 텍스트가 다소 길지만 설명을위한 것입니다). 비슷한 시나리오 ( https://stackoverflow.com/a/40316170/7744356- 다시 찾은 @markus에게 감사드립니다)에 대한 답변을 수정하려고 했지만 이것이 제가 시도한 것입니다. 아래에서 볼 수 있듯이 내가 생산하는 높이가 잘못된 것 같습니다. 나는 이것이 내가 간과하거나 이해하지 못하는 사소한 일이라고 가정합니다.

# Combine strips for a ID
g <- ggplot_gtable(ggplot_build(p1))
strip <- gtable_filter(g, "strip-t", trim = FALSE)
stript <- which(grepl('strip-t', g$layout$name))
  
stript2 = stript[idx*2-1]
top <- strip$layout$t[idx*2-1]
# # Using the $b below instead of b = top[i]+1, also seems  not to work
#bot <- strip$layout$b[idx*2-1] 
l   <- strip$layout$l[idx*2-1]
r   <- strip$layout$r[idx*2]
  
mat   <- matrix(vector("list",
                       length = length(idx)*3),
                nrow = length(idx))
mat[] <- list(zeroGrob())

res <- gtable_matrix("toprow", mat,
                     unit(c(1, 0, 1), "null"),
                     unit( rep(1, length(idx)),
                           "null"))

for (i in 1:length(stript2)){
  if (i==1){
    zz <- res %>% 
      gtable_add_grob(g$grobs[[stript2[i]]]$grobs[[1]], 1, 1, 1, 3) %>%
      gtable_add_grob(g, ., 
                      t = top[i],  
                      l = l[i],  
                      b = top[i]+1,  
                      r = r[i], 
                      name = c("add-strip")) 
  } else {
    zz <- res %>% 
      gtable_add_grob(g$grobs[[stript2[i]]]$grobs[[1]], 1, 1, 1, 3) %>%
      gtable_add_grob(zz, ., 
                      t = top[i],  
                      l = l[i],  
                      b = top[i]+1,  
                      r = r[i], 
                      name = c("add-strip"))
  } 
}

grid::grid.draw(zz)

여기에 이미지 설명 입력


------------ ggh4x 구현으로 업데이트 -----------------

This may solve this type of problem for many, but has its downsides (e.g. axes alignment across rows gets a bit manual, probably need to manually remove x-axes and ensure the limits are the same, add a unified y-axis label, requires installation of a package from github: devtools::install_github("teunbrand/[email protected]") for a specific version, plus cowplot interacts badly with e.g. ggtern). So I'd love it, if someone still managed to do a pure gtable + grid version.

library(tidyverse)
library(ggh4x)
library(cowplot)

plots = expand_grid(id=idx, id2=c("A", "B"), x=1:10) %>%
  mutate(y=rnorm(n=n()),
         plotrow=(id-1)%/%4+1) %>%
  group_by(plotrow) %>%
  group_map( ~ ggplot(data=.,
                      aes(x=x,y=y)) +
               geom_jitter() +
               facet_nested( ~ id + id2, ))
            
plot_grid(plotlist = plots, nrow = 4, ncol=1)

여기에 이미지 설명 입력

Allan Cameron

Here's a reprex of a somewhat pedestrian way to do it in grid. I have made the "parent" facet somewhat darker to emphasise the nesting, but if you prefer the color to match just change the rectGrob fill color to "gray85".


# Set up plot as per example

library(tidyverse)
library(gtable)
library(grid)

idx = 1:16

p1 = expand_grid(id=idx, id2=c("A", "B"), x=1:10) %>%
  mutate(y=rnorm(n=n())) %>%
  ggplot(aes(x=x,y=y)) +
  geom_jitter() +
  facet_wrap(~id + id2, nrow = 4, ncol=8)

g <- ggplot_gtable(ggplot_build(p1))

# Code to produce facet strips

stript <- grep("strip", g$layout$name)

grid_cols <- sort(unique(g$layout[stript,]$l))
t_vals <- rep(sort(unique(g$layout[stript,]$t)), each = length(grid_cols)/2)
l_vals <- rep(grid_cols[seq_along(grid_cols) %% 2 == 1], length = length(t_vals))
r_vals <- rep(grid_cols[seq_along(grid_cols) %% 2 == 0], length = length(t_vals))
labs   <- levels(as.factor(p1$data$id))

for(i in seq_along(labs))
{
  filler <- rectGrob(y = 0.7, height = 0.6, gp = gpar(fill = "gray80", col = NA))
  tg    <- textGrob(label = labs[i], y = 0.75, gp = gpar(cex = 0.8))
  g     <- gtable_add_grob(g, filler, t = t_vals[i], l = l_vals[i], r = r_vals[i], 
                           name = paste0("filler", i))
  g     <- gtable_add_grob(g, tg, t = t_vals[i], l = l_vals[i], r = r_vals[i], 
                           name = paste0("textlab", i))
}

grid.newpage()
grid.draw(g)

여기에 이미지 설명 입력

rectGrob50 % 높이 및 "gray85"로 변경하는 방법을 보여줍니다 .

여기에 이미지 설명 입력

또는 원하는 경우 루프의 각주기에 대해 다른 채우기를 지정할 수 있습니다.

여기에 이미지 설명 입력

분명히 위의 방법은 레벨 수가 다른 다른 플롯에 맞추기 위해 몇 가지 조정이 필요할 수 있습니다.

reprex 패키지 (v0.3.0)에 의해 2020-07-04에 생성됨

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ggplot에서 facet_wrap을 사용하여 패싯별로 다른 알파 값

분류에서Dev

facet_wrap을 사용하여 각 패싯에 2 개 이상의 줄을 넣습니다.

분류에서Dev

ggplot2에서 여러 독립 변수가있는 데이터의 패싯에 오류 막대를 생성합니다.

분류에서Dev

ggplot2의 facet_wrap에 '(all)'패싯을 쉽게 추가 하시겠습니까?

분류에서Dev

R의 facet_wrap ggplot에서 대괄호 위에 여러 제목 / 텍스트 추가

분류에서Dev

ggplot2 : 막대 차트에서 각 패싯의 색상 변경

분류에서Dev

패싯 된 ggplot (facet_wrap)을 R의 cowplot과 정렬

분류에서Dev

ggplot2를 사용하여 패싯 레이블의 새 줄과 플롯 매쓰 결합

분류에서Dev

패싯 내의 R ggplot2 패싯

분류에서Dev

R에서 여러 data.frame의 facet_wrap을 사용하는 ggplot?

분류에서Dev

ggplot2 :: facet_wrap ()의 기본 패널 레이아웃?

분류에서Dev

ggplot2에서 facet_grid () 함수를 사용할 때 labeller () 함수를 사용하여 패싯의 레이블에 표시 할 열 합계를 가져 오는 방법

분류에서Dev

ggplot2에서 패싯의 오른쪽 테두리 제거

분류에서Dev

ggplot2에서 labeller를 사용하여 facet_wrap 레이블 변경

분류에서Dev

tidyr를 사용하여 데이터의 형태를 변경 한 후 facet_wrap에서 하나의 패싯 범주를 제거하는 방법

분류에서Dev

R에서 ggplot2의 모든 패싯에 포인트를 추가하는 가장 좋은 방법

분류에서Dev

ggplotly의 긴 facet_wrap 라벨 / 패싯의 스트립과 플롯이 겹칩니다.

분류에서Dev

ggplot2 (r)의 대규모 데이터 세트 및 패싯

분류에서Dev

ggplot2의 동일한 패싯 플롯에 서로 다른 데이터 세트 오버레이

분류에서Dev

ggplot2의 각 패싯에 대한 다른 함수 곡선

분류에서Dev

동일한 패싯 데이터를 사용하여 각 facet_wrap에 서브 플롯 추가

분류에서Dev

ggplot2 패싯 사이에 공백과 세 개의 점 (줄임표)을 추가하여 생략 된 패싯을 나타냅니다.

분류에서Dev

패싯에 추가 한 후 ggplot2 패싯 순서 변경

분류에서Dev

Ggplot2 패싯 : 오른쪽 패널의 y 축을 오른쪽에 배치

분류에서Dev

히스토그램에서 QQplot으로 ggplot2 패싯 코드 수정

분류에서Dev

ggplot 2는 주파수 카운트의 여러 누적 막대 그래프와 함께 패싯 랩을 사용합니다.

분류에서Dev

ggplot2의 첫 번째 패싯에 따른 누적 막대 순서

분류에서Dev

ggplot2에서`facet_wrap`을 사용할 때 일부 플롯 주위에 상자를 그립니다.

분류에서Dev

facet_wrap 및 ggplot2의 범주 형 변수에 색상 할당

Related 관련 기사

  1. 1

    ggplot에서 facet_wrap을 사용하여 패싯별로 다른 알파 값

  2. 2

    facet_wrap을 사용하여 각 패싯에 2 개 이상의 줄을 넣습니다.

  3. 3

    ggplot2에서 여러 독립 변수가있는 데이터의 패싯에 오류 막대를 생성합니다.

  4. 4

    ggplot2의 facet_wrap에 '(all)'패싯을 쉽게 추가 하시겠습니까?

  5. 5

    R의 facet_wrap ggplot에서 대괄호 위에 여러 제목 / 텍스트 추가

  6. 6

    ggplot2 : 막대 차트에서 각 패싯의 색상 변경

  7. 7

    패싯 된 ggplot (facet_wrap)을 R의 cowplot과 정렬

  8. 8

    ggplot2를 사용하여 패싯 레이블의 새 줄과 플롯 매쓰 결합

  9. 9

    패싯 내의 R ggplot2 패싯

  10. 10

    R에서 여러 data.frame의 facet_wrap을 사용하는 ggplot?

  11. 11

    ggplot2 :: facet_wrap ()의 기본 패널 레이아웃?

  12. 12

    ggplot2에서 facet_grid () 함수를 사용할 때 labeller () 함수를 사용하여 패싯의 레이블에 표시 할 열 합계를 가져 오는 방법

  13. 13

    ggplot2에서 패싯의 오른쪽 테두리 제거

  14. 14

    ggplot2에서 labeller를 사용하여 facet_wrap 레이블 변경

  15. 15

    tidyr를 사용하여 데이터의 형태를 변경 한 후 facet_wrap에서 하나의 패싯 범주를 제거하는 방법

  16. 16

    R에서 ggplot2의 모든 패싯에 포인트를 추가하는 가장 좋은 방법

  17. 17

    ggplotly의 긴 facet_wrap 라벨 / 패싯의 스트립과 플롯이 겹칩니다.

  18. 18

    ggplot2 (r)의 대규모 데이터 세트 및 패싯

  19. 19

    ggplot2의 동일한 패싯 플롯에 서로 다른 데이터 세트 오버레이

  20. 20

    ggplot2의 각 패싯에 대한 다른 함수 곡선

  21. 21

    동일한 패싯 데이터를 사용하여 각 facet_wrap에 서브 플롯 추가

  22. 22

    ggplot2 패싯 사이에 공백과 세 개의 점 (줄임표)을 추가하여 생략 된 패싯을 나타냅니다.

  23. 23

    패싯에 추가 한 후 ggplot2 패싯 순서 변경

  24. 24

    Ggplot2 패싯 : 오른쪽 패널의 y 축을 오른쪽에 배치

  25. 25

    히스토그램에서 QQplot으로 ggplot2 패싯 코드 수정

  26. 26

    ggplot 2는 주파수 카운트의 여러 누적 막대 그래프와 함께 패싯 랩을 사용합니다.

  27. 27

    ggplot2의 첫 번째 패싯에 따른 누적 막대 순서

  28. 28

    ggplot2에서`facet_wrap`을 사용할 때 일부 플롯 주위에 상자를 그립니다.

  29. 29

    facet_wrap 및 ggplot2의 범주 형 변수에 색상 할당

뜨겁다태그

보관