내가 사용 옆에 두 개의 플롯 측을 배치 할 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()
답변
모든 ggplot이 나란히 (또는 그리드의 n 플롯)
기능 grid.arrange()
의 gridExtra
패키지는 여러 플롯을 결합 할 것이다; 이것이 당신이 나란히 놓는 방법입니다.
require(gridExtra)
plot1 <- qplot(1)
plot2 <- qplot(1)
grid.arrange(plot1, plot2, ncol=2)
예를 들어 reshape ()을 사용하지 않고 다른 변수를 플롯하려는 경우 두 플롯이 동일한 데이터를 기반으로하지 않을 때 유용합니다.
결과를 부작용으로 플로팅합니다. 파일에 부작용을 인쇄하려면, (같은 디바이스 드라이버를 지정 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
함수는의 cowplot
대안으로 체크 아웃 할 가치가 grid.arrange
있습니다. 동등한 접근 방법은 아래 @ claus-wilke 의 답변 과이 비 네트 를 참조하십시오 . 그러나이 비 네트를 기준으로 플롯 위치 및 크기를 미세하게 제어 할 수 있습니다 .
답변
기반 솔루션의 단점 중 하나 grid.arrange
는 대부분의 저널에서 요구하는대로 문자 (A, B 등)로 도표에 레이블을 붙이기가 어렵다는 것입니다.
이 (및 몇 가지) 문제, 특히 함수를 해결하기 위해 cowplot 패키지를 작성했습니다 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)
또는 cowplot 함수를 사용할 수 있습니다.이 기능 은 결합 된 플롯에 대한 올바른 치수를 쉽게 얻을 수 save_plot()
있는 얇은 래퍼 ggsave()
입니다.
p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)
( ncol = 2
논쟁은 save_plot()
나란히 두 개의 플롯 save_plot()
이 있으며 저장된 이미지를 두 배 넓게 만듭니다.)
그리드에 플롯을 정렬하는 방법에 대한 자세한 설명은 이 비네팅을 참조하십시오 . 공유 범례로 플롯하는 방법을 설명하는 비 네트도 있습니다 .
혼란의 한 가지 빈번한 점은 cowplot 패키지가 기본 ggplot2 테마를 변경한다는 것입니다. 패키지는 원래 내부 실습용으로 작성되었으므로 기본 방식을 사용하지 않기 때문에이 방식으로 작동합니다. 이로 인해 문제가 발생하면 다음 세 가지 방법 중 하나를 사용하여 문제를 해결할 수 있습니다.
1. 모든 플롯에 대해 테마를 수동으로 설정하십시오. + theme_bw()
위의 예에서 와 같이 항상 각 플롯에 특정 테마를 지정하는 것이 좋습니다 . 특정 테마를 지정하면 기본 테마는 중요하지 않습니다.
2. 기본 테마를 ggplot2 기본값으로 되돌립니다. 한 줄의 코드 로이 작업을 수행 할 수 있습니다.
theme_set(theme_gray())
3. 패키지를 부착하지 않고 cowplot 기능을 호출하십시오. 또한 앞에 추가하여 cowplot 함수를 호출 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")
업데이트 :
답변
Winston Chang의 R 요리 책multiplot
에서 다음 기능을 사용할 수 있습니다
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 ))
}
}
답변
패치 워크 패키지를 사용하면 간단히 +
연산자 를 사용할 수 있습니다.
library(ggplot2)
library(patchwork)
p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p1 + p2
답변
예, 데이터를 적절하게 정리해야합니다. 한 가지 방법은 다음과 같습니다.
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()
나는 plyr 또는 reshape에 더 나은 트릭이 있다고 확신합니다-Hadley의 강력한 패키지를 모두 빠르게 처리 할 수는 없습니다.
답변
모양 변경 패키지를 사용하면 이와 같은 작업을 수행 할 수 있습니다.
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
2018-07-06에 reprex 패키지 (v0.2.0.9000)로 작성되었습니다.