Reputation: 2356
I'm printing two plots with ggplot into an R Markdown HTML output, but I'd like them to appear side by side. Is this possible? Could I set the size of the figures as well?
SO far I can only print them one after the other. I also tried the multiplot function from the R Cookbook, but that severely distorts the plots...
Thanks!
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)
```
This produces the following:
UPDATE: Following the suggestion I received below, I tried using the gridExtra
library, and printed the plots by adding:
grid.arrange(genesDetectedDensity_MiSeq, genesDetectedHistogram_MiSeq, ncol=2)
This almost works, but it's still kind of messy:
Upvotes: 17
Views: 24815
Reputation: 10432
Another simple and straightforward option is using the patchwork
package. From the docs:
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
Upvotes: 3
Reputation: 23807
You can also change the out.width to <=50% in the chunk options.
Need to have echo = FALSE
in the chunk options!
---
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")
```
result
Upvotes: 6
Reputation: 3092
You can use grid.arrange() in the gridExtra library to achieve this :)
Edit : using iris see the image :
library(gridExtra)
plot1 <- qplot(iris$Sepal.Length)
plot2 <- qplot(iris$Sepal.Width)
grid.arrange(plot1, plot2, ncol=2)
Upvotes: 20
Reputation: 1501
As long as your using a standard R Markdown html-report you can use the fact that R Markdown uses bootstrap to get two graphs side by side. If you have long titles you can use the escape character \n
to line break them, as so:
---
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>
Upvotes: 15