แปลงแบบเคียงข้างกันกับ ggplot2


339

ฉันต้องการที่จะวางด้านข้างทั้งสองแปลงโดยด้านข้างใช้แพคเกจ ggplot2par(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()

ฉันคิดว่าคุณอาจทำสิ่งนี้ได้ด้วยขัดแตะ ggplot2 นั้นเป็นข้อกำหนดที่ยากหรือไม่?
JD Long

8
ไม่ แต่ฉันได้ใส่เวลาในการปรับเปลี่ยน qplots ดังนั้นจึงเป็นวิธีที่ฉันชอบ :-) และฉันพยายามที่จะเล่นกับ ggplot
คริสโตบัว


1
สำหรับภาพรวมที่ดีดูบทความสั้นสำหรับแพ็คเกจไข่ : การวาง
Henrik

คำตอบ:


505

ggplots ใด ๆ แบบเคียงข้างกัน (หรือพล็อต 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))กัน สิ่งนี้ไม่เพียง แต่ช่วยประหยัดเวลาในการจัดเรียงข้อมูลเท่านั้น แต่ยังเป็นสิ่งจำเป็นเมื่อคุณต้องการแปลงที่ต่างกันสองแปลง


ภาคผนวก: การใช้ Facets

แง่มุมมีประโยชน์สำหรับการทำแปลงที่คล้ายกันสำหรับกลุ่มที่แตกต่างกัน สิ่งนี้ชี้ให้เห็นด้านล่างในคำตอบมากมายด้านล่าง แต่ฉันต้องการเน้นวิธีนี้ด้วยตัวอย่างที่เทียบเท่ากับแปลงข้างต้น

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 ด้านล่างและบทความนี้สำหรับวิธีการเทียบเท่า; แต่ฟังก์ชั่นนี้ช่วยให้การควบคุมที่ดีขึ้นในตำแหน่งและขนาดของพล็อตอิงตามบทความนี้


2
เมื่อฉันรันโค้ดของคุณโดยใช้ออบเจ็กต์ ggplot, sidebysideplot นั้นเป็นโมฆะ หากคุณต้องการบันทึกผลลัพธ์ไปยังไฟล์ให้ใช้ gridArrange ดูstackoverflow.com/questions/17059099/…
จิม

@ จิมขอบคุณที่ชี้ให้เห็น ฉันแก้ไขคำตอบแล้ว แจ้งให้เราทราบหากคำถามใด ๆ ยังคงอยู่
David LeBauer

1
grid.aarange depricated ตอนนี้หรือไม่
Atticus29

?grid.arrangeทำให้ฉันคิดว่าตอนนี้ฟังก์ชั่นนี้เรียกว่า ArrGrob ผมสามารถที่จะทำในสิ่งที่ฉันต้องการโดยการทำแล้วa <- arrangeGrob(p1, p2) print(a)
blakeoft

@blakeoft คุณดูตัวอย่างหรือไม่ grid.arrangeยังคงเป็นฟังก์ชันที่ไม่ถูกต้อง คุณลองใช้ฟังก์ชั่นนี้หรือไม่? จะเกิดอะไรขึ้นหากไม่ใช่สิ่งที่คุณคาดหวัง
David LeBauer

159

ข้อเสียเพียงข้อเดียวของการแก้ปัญหา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 โดยไม่ต้องแนบแพ็คเกจ นอกจากนี้คุณยังไม่สามารถเรียกlibrary(cowplot)หรือrequire(cowplot)และแทนที่จะเรียกฟังก์ชัน cowplot โดย cowplot::prepending เช่นตัวอย่างข้างต้นโดยใช้ชุดรูปแบบเริ่มต้น 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")

ป้อนคำอธิบายรูปภาพที่นี่

ปรับปรุง:

  • ตั้งแต่ cowplot 1.0 ธีม ggplot2 เริ่มต้นจะไม่เปลี่ยนอีกต่อไป
  • ตั้งแต่ ggplot2 3.0.0 แปลงสามารถติดป้ายได้โดยตรงดูที่นี่

ในเอาต์พุตโคพล็อตกำลังลบธีมพื้นหลังของทั้งสองแปลงหรือไม่ มีทางเลือกอื่นอีกไหม?
VAR121

@ VAR121 ใช่มันเป็นหนึ่งบรรทัดของรหัส อธิบายในตอนท้ายของส่วนแรกของบทความสั้น: cran.rstudio.com/web/packages/cowplot/vignettes/ …
Claus Wilke

เป็นไปได้หรือไม่ที่จะมีระดับ y เท่ากันสำหรับแปลงทั้งหมดที่มีแพ็คเกจนี้?
Herman Toothrot

คุณจะต้องตั้งค่ามาตราส่วน y ด้วยตนเองให้ตรงกัน หรือพิจารณาเผชิญกับ
Claus Wilke

คุณสามารถตั้งค่า ggtitle () สำหรับแต่ละแปลงก่อนใช้ grid.arrange () ได้ไหม?
Seanosapien

49

คุณสามารถใช้multiplotฟังก์ชันต่อไปนี้จาก ตำราอาหาร R ของ Winston Chang

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 ))
    }

}

24

ใช้แพ็คเกจการเย็บปะติดปะต่อกันคุณสามารถใช้+ตัวดำเนินการ:

library(ggplot2)
library(patchwork)

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


p1 + p2

การเย็บปะติดปะต่อกัน


เพื่อความสมบูรณ์แบบการเย็บปะติดปะต่อกันก็มีอยู่ใน CRAN แล้ว หวังว่าคุณจะมีความสุขกับการแก้ไขเล็ก ๆ ของฉัน
Tjebo

18

ใช่คุณจะต้องจัดเตรียมข้อมูลของคุณอย่างเหมาะสม วิธีหนึ่งอาจเป็นเช่นนี้:

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 หรือก่อร่างใหม่ - ฉันยังไม่ถึงความเร็วในแพ็คเกจที่ทรงพลังเหล่านี้ทั้งหมดโดย Hadley


16

การใช้แพ็กเกจ reshape คุณสามารถทำสิ่งนี้ได้

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)

12

นอกจากนี้ยังมีแพคเกจหลายค่าที่น่ากล่าวถึง ดูคำตอบนี้ด้วย

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)


9

ggplot2 ขึ้นอยู่กับกราฟิกกริดซึ่งให้ระบบที่แตกต่างกันสำหรับการจัดเรียงแปลงบนหน้า par(mfrow...)คำสั่งไม่ได้เทียบเท่าโดยตรงเป็นวัตถุตาราง (เรียกว่าgrobs ) ไม่จำเป็นต้องวาดทันที แต่สามารถจัดเก็บและจัดการเป็น 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)

ป้อนคำอธิบายรูปภาพที่นี่

ตัวเลือกเพิ่มเติมมีรายละเอียดในบทความนี้

การร้องเรียนที่พบบ่อยคือการที่แผนการไม่จำเป็นต้องอยู่ในแนวเดียวกันเช่นเมื่อพวกมันมีป้ายชื่อแกนที่มีขนาดแตกต่างกัน แต่เป็นการออกแบบโดย: grid.arrangeไม่ต้องพยายามวัตถุ ggplot2 กรณีพิเศษและปฏิบัติต่อพวกมันอย่างเท่าเทียมกับร่องอื่น ๆ ) มันเพียงวาง grobs ในรูปแบบสี่เหลี่ยม

สำหรับกรณีพิเศษของวัตถุ ggplot2 ฉันได้เขียนฟังก์ชั่นอื่นggarrangeโดยใช้อินเตอร์เฟสที่คล้ายกันซึ่งพยายามจัดแนวการติดตั้งแบบพล็อต (รวมถึงพล็อตแบบ facetted) และพยายามที่จะเคารพอัตราส่วนภาพเมื่อกำหนดโดยผู้ใช้

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

ggsave()ฟังก์ชั่นทั้งสองเข้ากันได้กับ สำหรับภาพรวมทั่วไปของตัวเลือกที่แตกต่างกันและบางบริบททางประวัติศาสตร์, บทความนี้มีข้อมูลเพิ่มเติม


9

อัปเดต:คำตอบนี้เก่ามาก gridExtra::grid.arrange()ตอนนี้เป็นวิธีที่แนะนำ ฉันออกจากที่นี่ในกรณีที่อาจมีประโยชน์


Stephen Turner โพสต์arrange()ฟังก์ชั่นในการทำให้เสร็จเรียบร้อยบล็อก (ดูโพสต์สำหรับคำแนะนำการใช้งาน)

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
  }
 }
}

9
มันเป็นรุ่นที่ล้าสมัยมากgrid.arrange(หวังว่าฉันจะไม่ได้โพสต์ไว้ในรายชื่อผู้รับจดหมายในเวลานั้น - ไม่มีทางที่จะอัพเดทแหล่งข้อมูลออนไลน์เหล่านี้) รุ่นที่บรรจุเป็นตัวเลือกที่ดีกว่าถ้าคุณถามฉัน
baptiste

4

การใช้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

ป้อนคำอธิบายรูปภาพที่นี่


1

การแก้ปัญหาข้างต้นอาจไม่มีประสิทธิภาพถ้าคุณต้องการพล็อตหลายแปลง ggplot โดยใช้ลูป (เช่นที่ถามที่นี่: การสร้างหลายแปลงใน ggplot ด้วยค่าแกน Y ที่แตกต่างกันโดยใช้ลูป ) ซึ่งเป็นขั้นตอนที่ต้องการในการวิเคราะห์ที่ไม่รู้จัก หรือชุดข้อมูลขนาดใหญ่ (เช่นเมื่อคุณต้องการลงจุดนับตัวแปรทั้งหมดในชุดข้อมูล)

รหัสด้านล่างแสดงวิธีดำเนินการโดยใช้ 'multipot ()' ที่กล่าวถึงข้างต้นซึ่งเป็นแหล่งที่มาของที่นี่: 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_stringggplot

มิฉะนั้นหวังว่าคุณจะพบว่าฟังก์ชันมีประโยชน์


1
โปรดทราบว่าโค้ดของคุณจะขยายอplotsอบเจ็กต์for-loopที่ไม่มีประสิทธิภาพสูงและไม่แนะนำให้Rใช้ โปรดดูโพสต์ที่ยอดเยี่ยมเหล่านี้เพื่อค้นหาวิธีที่ดีกว่าในการทำมัน: การสะสมที่มีประสิทธิภาพใน R , การใช้ฟังก์ชั่นบนแถวของกรอบข้อมูล & เวิร์กโฟลว์ที่มุ่งเน้นแถวใน R กับ tidyverse
Tung

วิธีที่มีประสิทธิภาพมากขึ้นในการวนลูปตัวแปรคือการใช้tidy evaluationวิธีการซึ่งมีให้ตั้งแต่ggplot2 v.3.0.0 stackoverflow.com/a/52045613/786542
ตุง

0

ในประสบการณ์ของฉัน gridExtra: grid.arrange ทำงานได้อย่างสมบูรณ์แบบถ้าคุณพยายามที่จะสร้างแปลงในวง

ตัวอย่างรหัสย่อ:

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

คำตอบของคุณดีขึ้นอย่างไรกับคำตอบของบัพติสต์ในวันที่ 2 ธันวาคม 2560 เวลา 4:20 คำตอบของคุณดูเหมือนจะซ้ำกัน ตรวจสอบสิ่งที่ทำให้คำตอบที่ยอมรับได้ที่นี่วิธีการตอบ
Peter

ฉันไม่สามารถแบ่งพล็อตได้ตามต้องการภายในลูปและด้วยเหตุนี้คำแนะนำ ตอนแรกฉันเขียนตัวอย่างเต็มรูปแบบของฉันสำหรับการวนซ้ำกับการใช้งานของมัน แต่แล้วก็ตัดสินใจต่อต้านมันในขณะนี้ จะอัปเดตรหัสเต็มในหนึ่งสัปดาห์หรือมากกว่านั้น
Mayank Agrawal

ฉันพยายามทำโดยใช้ cowplot package ตั้งแต่แรก แต่ก็ไม่สำเร็จ ในการสแกนอย่างรวดเร็วของฉันไม่มีใครได้กล่าวถึงวิธีการแก้ปัญหาการพล็อตหลายภายในห่วงและความคิดเห็นของฉัน ส่งความคิดเห็นถึงฉันถ้าฉันผิด
Mayank Agrawal

หากรหัสในคำตอบของคุณรวมถึงการวนรอบที่จะแตกต่าง
ปีเตอร์

ฉันจะอัปเดตในหนึ่งสัปดาห์ที่นี่และโครงการทั้งหมดใน Kaggle ไชโย
Mayank Agrawal

-3

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")

ป้อนคำอธิบายรูปภาพที่นี่


3
ดูคำตอบโดยละเอียดเพิ่มเติมและเหตุผลของผู้เขียนแพ็คเกจข้างต้นstackoverflow.com/a/31223588/199217
David LeBauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.