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 Turner는 Getting 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
또한고니다합려도 고려해 .ggarrange
ggpubr
꾸러미그림 사이에 축을 정렬하고 공통 범례를 하나로 병합하는 옵션을 포함하여 많은 이점이 있습니다.
알 수 없는(또는 큰) 데이터 세트를 분석하는 데 필요한 단계인(예: 데이터 세트에 있는 모든 변수의 카운트를 표시하려는 경우) 루프를 사용하여 여러 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
'source' 카테고리의 다른 글
서버에서 실행 속성 이해 (0) | 2023.06.08 |
---|---|
스파크 데이터 프레임에 상수 열을 추가하는 방법은 무엇입니까? (0) | 2023.06.08 |
판다 시간대 인식 날짜 시간 변환단순 타임스탬프로 인덱싱하지만 특정 시간대에 있음 (0) | 2023.06.08 |
jspm / jQuery / TypeScript - 모듈 "jquery"에는 기본 내보내기가 없습니다. (0) | 2023.06.08 |
Excel 패키지로 작성된 Excel 셀의 통화 형식 설정 (0) | 2023.06.08 |