source

ggplot2가 있는 나란히 표시

nicesource 2023. 6. 8. 19:53
반응형

ggplot2가 있는 나란히 표시

ggplot2 패키지를 사용하여 두 개의 플롯을 나란히 배치하고 싶습니다. 즉, 다음과 같은 작업을 수행합니다.par(mfrow=c(1,2)).

예를 들어, 다음 두 그림을 같은 척도로 나란히 표시하려고 합니다.

x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)

그것들을 같은 data.frame에 넣어야 합니까?

qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()

모든 gg 그림을 나란히 표시(또는 n개의 그림을 그리드에 표시)

grid.arrange()패키지에 여러 개의 그림이 결합됩니다. 이렇게 두 개를 나란히 배치할 수 있습니다.

require(gridExtra)
plot1 <- qplot(1)
plot2 <- qplot(1)
grid.arrange(plot1, plot2, ncol=2)

이는 두 그림이 동일한 데이터를 기반으로 하지 않는 경우, 예를 들어 모양 바꾸기()를 사용하지 않고 다른 변수를 표시하려는 경우에 유용합니다.

이렇게 하면 출력이 부작용으로 표시됩니다.:pdf,png 예), 등:

pdf("foo.pdf")
grid.arrange(plot1, plot2)
dev.off()

또는, 사용arrangeGrob() ggsave(),

ggsave("foo.pdf", arrangeGrob(plot1, plot2))

이는 다음을 사용하여 두 개의 서로 다른 그림을 만드는 것과 같습니다.par(mfrow = c(1,2))이렇게 하면 데이터 배열 시간이 절약될 뿐만 아니라 서로 다른 두 그림을 원할 때도 필요합니다.


부록: 패싯 사용

면은 여러 그룹에 대해 유사한 그림을 만드는 데 유용합니다.이는 아래의 많은 답변에서 지적되지만 위의 그림과 동일한 예제를 사용하여 이 접근 방식을 강조하고자 합니다.

mydata <- data.frame(myGroup = c('a', 'b'), myX = c(1,1))

qplot(data = mydata, 
    x = myX, 
    facets = ~myGroup)

ggplot(data = mydata) + 
    geom_bar(aes(myX)) + 
    facet_wrap(~myGroup)

갱신하다

그자리의 plot_grid의 기능은 의 대안으로 확인할 가치가 있습니다.grid.arrange아래의 @claus-wilke와 동등한 접근법에 대한 이 vignett답변을 참조하십시오. 그러나 이 함수를 사용하면 이 vignett를 기반으로 플롯 위치와 크기를 보다 세밀하게 제어할 수 있습니다.

다음을 기반으로 하는 솔루션의 한 가지 단점grid.arrange대부분의 저널에서 요구하는 대로 문자(A, B 등)로 플롯에 레이블을 붙이기가 어렵다는 것입니다.

는 이 (그리고 몇 가지 다른) 문제, 특히 기능을 해결하기 위해 소 플롯 패키지를 작성했습니다.plot_grid():

library(cowplot)

iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot() + theme_bw()

iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.7) + theme_bw() +
  theme(legend.position = c(0.8, 0.8))

plot_grid(iris1, iris2, labels = "AUTO")

여기에 이미지 설명 입력

하는 .plot_grid()은 또 다른 이며, 반은또 다 ggplot2 객며이, 이를저수로 할 수 .ggsave()평소와 같이:

p <- plot_grid(iris1, iris2, labels = "AUTO")
ggsave("plot.pdf", p)

소 함수 또는소그함사용수있다습니할수를 할 수 있습니다.save_plot()그것은 주위에 얇은 포장지입니다.ggsave()이를 통해 결합된 그림에 대한 정확한 치수를 쉽게 얻을 수 있습니다. 예:

p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)

(계속)ncol = 2는 의론의하면을 말합니다.save_plot()두 개의 플롯이 나란히 있다는 것, 그리고save_plot()저장된 이미지의 너비를 두 배로 만듭니다.)

그리드에서 플롯을 정렬하는 방법에 대한 자세한 설명은 이 Vignett을 참조하십시오.공유된 범례로 그림을 그리는 방법을 설명하는 비네트도 있습니다.

한 가지 자주 혼동되는 점은 소 그림 패키지가 기본 ggplot2 테마를 변경한다는 것입니다.패키지는 원래 내부 실험실용으로 작성되었기 때문에 이러한 방식으로 작동하며 기본 테마를 사용하지 않습니다.이로 인해 문제가 발생하는 경우 다음 세 가지 방법 중 하나를 사용하여 문제를 해결할 수 있습니다.

모든 그림에 대해 테마를 수동으로 설정합니다.제가 했던 것처럼 항상 각 플롯에 특정 주제를 지정하는 것이 좋은 연습이라고 생각합니다.+ theme_bw()테마를 .특정 테마를 지정할 경우 기본 테마는 중요하지 않습니다.

기본 테마를 ggplot2 기본값으로 되돌립니다.코드 한 줄로 이 작업을 수행할 수 있습니다.

theme_set(theme_gray())

패키지를 연결하지 않고 소 그림 함수를 호출합니다.또한 전화할 수 없습니다.library(cowplot)또는require(cowplot)그리고 대신 앞에 추가하여 소 그림 함수를 호출합니다.cowplot::예를 들어 ggplot2 기본 테마를 사용하는 위의 예는 다음과 같습니다.

## Commented out, we don't call this
# library(cowplot)

iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot()

iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.7) +
  theme(legend.position = c(0.8, 0.8))

cowplot::plot_grid(iris1, iris2, labels = "AUTO")

여기에 이미지 설명 입력

업데이트:

  • 소 그림 1.0부터는 기본 ggplot2 테마가 더 이상 변경되지 않습니다.
  • ggplot23.0.0부터는 그림에 직접 레이블을 붙일 수 있습니다(예: 여기 참조).

패치워크 패키지를 사용하면 간단히+연산자:

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))


p1 + p2

헝겊 조각

로는 다른연는다포다함니합음을자산▁include다가 있습니다./ 및 플을 쌓 아 나 히 배 하 는 치 방()요소를 그룹화합니다., 의 플롯이 맨위 맨 을 를 들 어 개 개 예 그 행 구 있 니 다 습 수 할 성 을 아 래 맨 그 림 과 행 림 위 의 맨 의 ▁with ▁a ▁and ▁plot ▁for 예 ▁of 를 ▁configure 들 ▁can ▁example ▁plots ▁of ▁a ▁you 니 다 있(p1 | p2 | p3) /p자세한 예는 패키지 설명서를 참조하십시오.

과 같은 다사수있다를 할 수 .multiplot윈스턴 창의 R 요리책에서 나온 기능

multiplot(plot1, plot2, cols=2)

multiplot <- function(..., plotlist=NULL, cols) {
    require(grid)

    # Make a list from the ... arguments and plotlist
    plots <- c(list(...), plotlist)

    numPlots = length(plots)

    # Make the panel
    plotCols = cols                          # Number of columns of plots
    plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols

    # Set up the page
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
    vplayout <- function(x, y)
        viewport(layout.pos.row = x, layout.pos.col = y)

    # Make each plot, in the correct location
    for (i in 1:numPlots) {
        curRow = ceiling(i/plotCols)
        curCol = (i-1) %% plotCols + 1
        print(plots[[i]], vp = vplayout(curRow, curCol ))
    }

}

네, 데이터를 적절하게 정리해야 할 것 같습니다.한 가지 방법은 다음과 같습니다.

X <- data.frame(x=rep(x,2),
                y=c(3*x+eps, 2*x+eps),
                case=rep(c("first","second"), each=100))

qplot(x, y, data=X, facets = . ~ case) + geom_smooth()

저는 플라이어나 모양을 바꾸는 데 더 좋은 묘기가 있다고 확신합니다. 저는 여전히 해들리의 이 모든 강력한 패키지에 속도를 낼 수 없습니다.

모양 바꾸기 패키지를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

library(ggplot2)
wide <- data.frame(x = rnorm(100), eps = rnorm(100, 0, .2))
wide$first <- with(wide, 3 * x + eps)
wide$second <- with(wide, 2 * x + eps)
long <- melt(wide, id.vars = c("x", "eps"))
ggplot(long, aes(x = x, y = value)) + geom_smooth() + geom_point() + facet_grid(.~ variable)

또한 언급할 가치가 있는 다중 그림 패키지가 있습니다. 답변을 참조하십시오.

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)
figure1 <- multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none")
# show the layout
figure1

figure1 %<>%
  fill_panel(q1, column = 1, row = 1) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 1, row = 2) %<>%
  fill_panel(q4, column = 2, row = 2)
figure1

# complex layout
figure2 <- multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman")
figure2

figure2 %<>%
  fill_panel(q1, column = 1:2, row = 1) %<>%
  fill_panel(q2, column = 3, row = 1) %<>%
  fill_panel(q3, column = 1, row = 2) %<>%
  fill_panel(q4, column = 2:3, row = 2:3)
figure2

reprex 패키지(v0.2.0.9000)에 의해 2018-07-06에 생성되었습니다.

에 플롯을 다른 시스템을 제공하는그래픽을 .ggplot2는 을 참조하십시오. 그리드 그래픽은 페이지에 플롯을 정렬하기 위한 다른 시스템을 제공합니다.par(mfrow...)그리드 객체(그로브라고 함)가 즉시 그려질 필요는 없지만 그래픽 출력으로 변환되기 전에 일반 R 객체로 저장 및 조작할 수 있기 때문에 명령에는 직접적인 등가물이 없습니다.이를 통해 현재 기본 그래픽 모델의 도면보다 더 큰 유연성을 확보할 수 있지만 전략은 약간 다를 수밖에 없습니다.

나는 썼습니다.grid.arrange()가능한 한 가까이에 간단한 인터페이스를 제공합니다.par(mfrow)가장 간단한 형태로 코드는 다음과 같습니다.

library(ggplot2)
x <- rnorm(100)
eps <- rnorm(100,0,.2)
p1 <- qplot(x,3*x+eps)
p2 <- qplot(x,2*x+eps)

library(gridExtra)
grid.arrange(p1, p2, ncol = 2)

여기에 이미지 설명 입력

더 많은 옵션이 이 Vignett에 자세히 설명되어 있습니다.

크기가 축 때 되는 것은 는 설계에 입니다. 한 가 일 반 적 인 불 레 축 다 가 반 같 정 다 습 니 다 과 설 음 않 상 계 는 는 이 지 만 지 렬 되 시 드 때 질 지 을 기 크 른 블 이 가 그 림 이 만 사 항 은 ▁one ▁aren : ▁is ▁labels ▁of grid.arrange개체를 한 경우에 , grob와하게 취급합니다. ggplot2는 grob(예: grob)입니다.직사각형 레이아웃에 그로브를 배치할 뿐입니다.

객체의 ggplot2 객체특의한경, 저다작니다습성했함수라는 다른했습니다.ggarrange유사한 인터페이스를 사용하여 플롯 패널(패싯된 플롯 포함)을 정렬하고 사용자가 정의할 때 가로 세로 비율을 존중하려고 합니다.

library(egg)
ggarrange(p1, p2, ncol = 2)

두기모두다호다니됩환음과능▁▁with▁compat와 호환됩니다.ggsave()다양한 옵션에 대한 일반적인 개요와 일부 과거 상황을 위해 이 Vignett은 추가 정보를 제공합니다.

업데이트: 이 답변은 매우 오래되었습니다. gridExtra::grid.arrange()이제 권장되는 접근 방식입니다.도움이 될까 봐 여기에 두고 갑니다.


Stephen TurnerGetting Genetics Done 블로그에 이 기능을 게시했습니다(응용 프로그램 지침은 게시물 참조).

vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE) {
 dots <- list(...)
 n <- length(dots)
 if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
 if(is.null(nrow)) { nrow = ceiling(n/ncol)}
 if(is.null(ncol)) { ncol = ceiling(n/nrow)}
        ## NOTE see n2mfrow in grDevices for possible alternative
grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
 ii.p <- 1
 for(ii.row in seq(1, nrow)){
 ii.table.row <- ii.row 
 if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
  for(ii.col in seq(1, ncol)){
   ii.table <- ii.p
   if(ii.p > n) break
   print(dots[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
   ii.p <- ii.p + 1
  }
 }
}

용사를 합니다.tidyverse:

x <- rnorm(100)
eps <- rnorm(100,0,.2)
df <- data.frame(x, eps) %>% 
  mutate(p1 = 3*x+eps, p2 = 2*x+eps) %>% 
  tidyr::gather("plot", "value", 3:4) %>% 
  ggplot(aes(x = x , y = value)) + 
    geom_point() + 
    geom_smooth() + 
    facet_wrap(~plot, ncol =2)

df

여기에 이미지 설명 입력

또한고니다합려도 고려해 .ggarrangeggpubr꾸러미그림 사이에 축을 정렬하고 공통 범례를 하나로 병합하는 옵션을 포함하여 많은 이점이 있습니다.

알 수 없는(또는 큰) 데이터 세트를 분석하는 데 필요한 단계인(예: 데이터 세트에 있는 모든 변수의 카운트를 표시하려는 경우) 루프를 사용하여 여러 gg 그림 그림을 표시하려는 경우 위의 솔루션은 효율적이지 않을 수 있습니다.

아래 코드는 위에 언급된 'sysot'를 사용하는 방법을 보여줍니다. 소스는 다음과 같습니다. http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :

plotAllCounts <- function (dt){   
  plots <- list();
  for(i in 1:ncol(dt)) {
    strX = names(dt)[i]
    print(sprintf("%i: strX = %s", i, strX))
    plots[[i]] <- ggplot(dt) + xlab(strX) +
      geom_point(aes_string(strX),stat="count")
  }

  columnsToPlot <- floor(sqrt(ncol(dt)))
  multiplot(plotlist = plots, cols = columnsToPlot)
}

이제 함수 실행 - 한 페이지에 ggplot을 사용하여 인쇄된 모든 변수에 대한 카운트를 가져옵니다.

dt = ggplot2::diamonds
plotAllCounts(dt)

한 가지 주의할 점은 다음과 같습니다.
용사를 aes(get(strX))일반적으로 작업할 때 루프에서 사용할 수 있습니다.ggplot 대신 위 aes_string(strX)원하는 그림을 그리지 않습니다.대신 마지막 그림을 여러 번 표시합니다.나는 그 이유를 알아내지 못했습니다 - 아마도 그것이 해야 할 것입니다.aes그리고.aes_string ggplot.

그렇지 않으면 이 기능이 유용하기를 바랍니다.

내 경험에 따르면 그리드Extra:grid.arrange는 루프에서 플롯을 생성하려는 경우 완벽하게 작동합니다.

짧은 코드 조각:

gridExtra::grid.arrange(plot1, plot2, ncol = 2)

하여 사용방표이록설 사용 .grid.arrange()범주형 변수의 여러 요인에 대한 그림을 생성하는 for 루프 내.

for (bin_i in levels(athlete_clean$BMI_cat)) {

plot_BMI <- athlete_clean %>% filter(BMI_cat == bin_i) %>% group_by(BMI_cat,Team) %>% summarize(count_BMI_team = n()) %>% 
          mutate(percentage_cbmiT = round(count_BMI_team/sum(count_BMI_team) * 100,2)) %>% 
          arrange(-count_BMI_team) %>% top_n(10,count_BMI_team) %>% 
          ggplot(aes(x = reorder(Team,count_BMI_team), y = count_BMI_team, fill = Team)) +
            geom_bar(stat = "identity") +
            theme_bw() +
            # facet_wrap(~Medal) +
            labs(title = paste("Top 10 Participating Teams with \n",bin_i," BMI",sep=""), y = "Number of Athletes", 
                 x = paste("Teams - ",bin_i," BMI Category", sep="")) +
            geom_text(aes(label = paste(percentage_cbmiT,"%",sep = "")), 
                      size = 3, check_overlap = T,  position = position_stack(vjust = 0.7) ) +
            theme(axis.text.x = element_text(angle = 00, vjust = 0.5), plot.title = element_text(hjust = 0.5), legend.position = "none") +
            coord_flip()

plot_BMI_Medal <- athlete_clean %>% 
          filter(!is.na(Medal), BMI_cat == bin_i) %>% 
          group_by(BMI_cat,Team) %>% 
          summarize(count_BMI_team = n()) %>% 
          mutate(percentage_cbmiT = round(count_BMI_team/sum(count_BMI_team) * 100,2)) %>% 
          arrange(-count_BMI_team) %>% top_n(10,count_BMI_team) %>% 
          ggplot(aes(x = reorder(Team,count_BMI_team), y = count_BMI_team, fill = Team)) +
            geom_bar(stat = "identity") +
            theme_bw() +
            # facet_wrap(~Medal) +
            labs(title = paste("Top 10 Winning Teams with \n",bin_i," BMI",sep=""), y = "Number of Athletes", 
                 x = paste("Teams - ",bin_i," BMI Category", sep="")) +
            geom_text(aes(label = paste(percentage_cbmiT,"%",sep = "")), 
                      size = 3, check_overlap = T,  position = position_stack(vjust = 0.7) ) +
            theme(axis.text.x = element_text(angle = 00, vjust = 0.5), plot.title = element_text(hjust = 0.5), legend.position = "none") +
            coord_flip()

gridExtra::grid.arrange(plot_BMI, plot_BMI_Medal, ncol = 2)

}

위의 루프에 대한 샘플 그림 중 하나가 아래에 포함되어 있습니다.위의 루프는 모든 수준의 BMI 범주에 대해 여러 개의 그림을 생성합니다.

샘플 이미지

의 보다 포괄적인 사용을 원하는 경우grid.arrange()에 내에for루프, https://rpubs.com/Mayank7j_2020/olympic_data_2000_2016 를 확인하십시오.

cowplot패키지는 출판에 적합한 방식으로 이를 수행하는 좋은 방법을 제공합니다.

x <- rnorm(100)
eps <- rnorm(100,0,.2)
A = qplot(x,3*x+eps, geom = c("point", "smooth"))+theme_gray()
B = qplot(x,2*x+eps, geom = c("point", "smooth"))+theme_gray()
cowplot::plot_grid(A, B, labels = c("A", "B"), align = "v")

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/1249548/side-by-side-plots-with-ggplot2

반응형