2017-12-03 18 views
3

나는 2 × 2 플롯의 배열을하고 있어요. 플롯은 같은 축을 공유하기 때문에 함께 묶을 수 있습니다.plot_grid를 사용하여 공간을 사용하지 않고 플롯을 입력하는 방법은 무엇입니까?

이 코드 :

library(ggplot2) 
library(cowplot) 

Value <- seq(0,1000, by = 1000/10) 
Index <- 0:10 
DF <- data.frame(Index, Value) 


plot <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme(aspect.ratio = 0.5) 

plot_grid(plot, plot, plot, plot, align = "hv", ncol = 2) 

enter image description here

생산하지만이 같은 싶습니다 : 나는 비슷한 결과를 얻을 수있는 방법

enter image description here

를?

답변

2

나는 이것이 egg 패키지에서 ggarrange() 함수의 경우라고 생각합니다. plot_grid()으로이 작업을 수행하려면 끝장을 보지 않아도되며 가치가 없습니다.

(기술적 인 이유는 plot_grid()은 격자에있는 각 플롯의 총 면적을 일정하게 유지하지만 일부 플롯에는 x 축이 있고 다른 플롯에는 그렇지 않은 경우 다른 영역을 차지합니다. rel_heights 인수를 사용하지만 rel_heights에 대한 올바른 값을 계산하는 좋은 방법이 없다, 그래서 시행 착오 일 것이다. 반면, ggarrange() 별도로 플롯 패널과 주변 요소를 살펴보고 플롯 패널은 같은 크기를 확인합니다.

Value <- seq(0,1000, by = 1000/10) 
Index <- 0:10 
DF <- data.frame(Index, Value) 


pbase <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme_bw() 

ptopleft <- pbase + 
    scale_x_continuous(position = "top") + 
    theme(plot.margin = margin(5.5, 0, 0, 5.5), 
     axis.title.x = element_blank(), 
     axis.text.x = element_blank(), 
     axis.ticks.x = element_blank()) 

ptopright <- pbase + 
    scale_y_continuous(position = "right") + 
    scale_x_continuous(position = "top") + 
    theme(plot.margin = margin(5.5, 5.5, 0, 0), 
     axis.title.x = element_blank(), 
     axis.text.x = element_blank(), 
     axis.ticks.x = element_blank()) 

pbottomleft <- pbase + 
    theme(plot.margin = margin(0, 0, 5.5, 5.5)) 

pbottomright <- pbase + 
    scale_y_continuous(position = "right") + 
    theme(plot.margin = margin(0, 5.5, 5.5, 0)) 

library(egg)  
ggarrange(ptopleft, ptopright, 
      pbottomleft, pbottomright, 
      ncol = 2) 
,617 :) 여기서

ggarrange()을 사용하여 코드

enter image description here

두 의견 :

  1. 상단 그래프에 플롯 패널 아래 공간의 모든 마지막 비트를 제거하려면, 우리는 우리가 있는데도, 상단에 x 축 이동해야 그것을 보여주지 않습니다. 이것은 테마 메커니즘의 이상한 제한 사항입니다. 우리는 한 축을 완전히 없앨 수는 없습니다.

  2. 나는 당신의 예에서와 같이 공유 축 제목의 큰 팬이 아니에요. 각 축에는 제목이 있어야한다고 생각합니다. 공유 축 제목을 원하면 faceting 메커니즘을 사용하지 않는 이유는 무엇입니까?

2

당신은 다음 grid.arrange, 미묘한 plot.margin 각 플롯을 설정하고 실험실을 추가 할 수 있습니다.

library(ggplot2) 
library(grid) 
library(gridExtra) 

Value <- seq(0,1000, by = 1000/10) 
Index <- 0:10 
DF <- data.frame(Index, Value) 

plot1 <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme_minimal() + 
    theme(aspect.ratio = 0.5, 
    panel.border = element_rect(fill = NA), 
    axis.text.x = element_blank(), 
    axis.title = element_blank(), 
    axis.ticks = element_blank(), 
    plot.margin = unit(c(5.5, 5.8, -50, 5.5), "pt")) 

plot2 <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme_minimal() + 
    theme(aspect.ratio = 0.5, 
    panel.border = element_rect(fill = NA), 
    axis.text.x = element_blank(), 
    axis.title = element_blank(), 
    axis.ticks = element_blank(), 
    plot.margin = unit(c(5.5, 5.5, -50, 5.5), "pt")) + 
    scale_y_continuous(position = "right") 

plot3 <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme_minimal() + 
    theme(aspect.ratio = 0.5, 
    panel.border = element_rect(fill = NA), 
    axis.title = element_blank(), 
    axis.ticks = element_blank(), 
    plot.margin = unit(c(-50, 5.8, -50, 5.5), "pt")) 

plot4 <- ggplot(DF, aes(x = Index, y = Value)) + 
    geom_line(linetype = 2) + 
    theme_minimal() + 
    theme(aspect.ratio = 0.5, 
    panel.border = element_rect(fill = NA), 
    axis.title = element_blank(), 
    axis.ticks = element_blank(), 
    plot.margin = unit(c(-50, 5.5, -50, 5.5), "pt")) + 
    scale_y_continuous(position = "right") 

grid.arrange(grobs = list(plot1, plot2, plot3, plot4), ncol = 2, bottom = 'Index', left = 'Value', right = 'Value') 

최종 플롯 enter image description here