在R Markdown HTML文件中如何将图形并排打印?

17

我在R Markdown HTML输出中使用ggplot打印了两个图,但我希望它们并排显示。这可行吗? 我能设置图的大小吗?

到目前为止,我只能一个接一个地打印它们。我还尝试了《R Cookbook》中的multiplot函数,但这会严重扭曲图形......

谢谢!


title: "HT Chip MiSeq/HiSeq Analysis"
date: "October 1, 2015"
output: 
  html_document: 
    highlight: haddock
    theme: flatly
---


```{r plots, echo=FALSE}
    genesDetectedDensity_MiSeq <- ggplot(meta.miseq) + geom_density(aes(genesDetected, fill=column, color=seqRun), alpha=0.2) + scale_x_continuous(limits=c(0,2000), breaks=seq(0, 2000, 100)) + ggtitle("Genes Detected across cells from MiSeq Runs")
    return(genesDetectedDensity_MiSeq)

genesDetectedHistogram_MiSeq <- ggplot(meta.miseq) + geom_bar(aes(genesDetected, fill=column, color=seqRun), position="dodge", binwidth=50, alpha=0.2) + scale_x_continuous(limits=c(0,2000), breaks=seq(0, 2000, 100)) + ggtitle("Genes Detected across cells from MiSeq Runs")
return(genesDetectedHistogram_MiSeq)
```

这将产生以下结果:

enter image description here

更新:根据我下面收到的建议,我尝试使用gridExtra库,并通过添加以下内容打印了绘图:

grid.arrange(genesDetectedDensity_MiSeq, genesDetectedHistogram_MiSeq, ncol=2)

这个几乎可以用,但有点凌乱:

在此输入图片描述

4个回答

20
你可以使用gridExtra库中的grid.arrange()来实现这个 :)
编辑:使用iris查看图片:
library(gridExtra)

 plot1 <- qplot(iris$Sepal.Length)
 plot2 <- qplot(iris$Sepal.Width)

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

link


1
谢谢您的回复。您能否写一个在我的代码中如何使用它的例子? - Carmen Sandoval
我同意@gaelgarcia的观点。如果没有示例,这个“答案”应该是一条评论。 - hrbrmstr
希望这个例子能使它成为一个实际的答案:D - Bg1850
1
如果这个回答解决了您的问题,您是否接受它 :) 请返回翻译后的文本。 - Bg1850
谢谢您的回复!我现在明白了我在更新中发布的内容。有没有办法指定图形的宽度,使它们不那么“挤”?虽然它能工作,但仍然有点凌乱...谢谢! - Carmen Sandoval
在grid.Arrange中有一个宽度参数 :) - Bg1850

14
只要您使用标准的R Markdown HTML报告,就可以利用R Markdown使用bootstrap的事实来使两个图形并排显示。如果您有很长的标题,可以使用转义字符\n将它们换行,如下所示:
---
title: "test"
author: "Testperson"
output:
  html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

<div class = "row">
<div class = "col-md-6">
```{r cars,  warning = FALSE, echo = FALSE, dev=c('svg')}
plot(pressure, main = paste("Lorem Ipsum ",
                        "Ipsum lorem ipsum. ",
                        "\nLorem ipsum", sep=""))
```
</div>
<div class = "col-md-6">
```{r pressure, warning = FALSE, echo=FALSE, dev=c('svg')}
plot(pressure, main = paste("Lorem Ipsum ",
                        "Ipsum lorem ipsum. ",
                        "\nLorem ipsum", sep=""))
```
</div>
</div>

2
太棒了 +1 - 我学到了很多,谢谢。对于未来的读者,这些是响应式列,取决于视口大小。然而,在此设置中,图形变得相当大,需要相当大的放大才能看到两个图形并排的效果。为了始终使图形并排,没有响应式列,人们也可以简单地更改<div style="width:40%; display:inline-block">块</div>的宽度和显示选项。 - tjebo

6

您还可以在代码块选项中将 out.width 更改为 <=50%。

在代码块选项中需要设置 echo = FALSE

---
title: "Side by Side"
output: html_document
---


You can also change the figure output options. 

```{r base plot, warning = FALSE, echo=FALSE, out.width="50%"}

plot(pressure, main = paste("Lorem Ipsum ",
                        "Ipsum lorem ipsum. ",
                        "\nLorem ipsum", sep=""))

plot(pressure, main = paste("Lorem Two ",
                        "Ipsum lorem ipsum. ",
                        "\nLorem ipsum", sep=""))
```

or, with ggplot objects

```{r ggplot2, warning = FALSE, echo=FALSE, out.width="50%"}
library(ggplot2)
ggplot(pressure, aes(temperature, pressure)) +
  geom_point() +
  ggtitle("plot1")

ggplot(pressure, aes(temperature, pressure)) +
  geom_point() +
  ggtitle("plot2")
```

结果

这里输入图片描述


1
这是我在基础R中的做法,但在ggplot2中它不起作用,它们会排列在下面。 - adunaic
@adunaic 很抱歉听到它对你不起作用。它对我有效!(请参见我的答案中的示例截图)。可能是您的块设置问题。祝你好运找到问题! - tjebo
2
我最终使用了 patchwork 包,因为它非常容易使用(尽管如果能够直接使用你的答案会更简单)。 - adunaic

3

另一个简单而直接的选择是使用patchwork包。根据文档:

library(patchwork)
library(ggplot2)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

# for side by side:
p1 + p2

# or to stack the plots:
p1 / p2

这是一个非常整洁且易于使用的软件包。对于简单的任务来说,比网格软件包要容易得多。 - adunaic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接