2
votes

I am creating slides on RStudio (Version 0.99.903) in an R Markdown .Rmd file, with output set to PDF (Beamer). On several slides, I would like to insert a plot, either below text or alone on a slide, with the code producing the plot not viewable on the screen. However, despite many things I've tried, there is always a space between the end of the text and the start of the figure, presumably where the code chunk would have appeared had I not set echo=FALSE. For example:

---
title: "Untitled"
author: "Math 35"
date: "October 14, 2016"
output: beamer_presentation
---

```{r setup, echo=FALSE, include=FALSE}
knitr::knit_hooks$set(mysize = function(before, options, envir) {
  if (before) 
    return(options$size)
})
knitr::opts_chunk$set(size='\\small')
knitr::opts_chunk$set(warning=FALSE)
knitr::opts_chunk$set(message=FALSE)
knitr::opts_chunk$set(fig.align='center')
```

## Recap from Last Time: Continuous Random Variables
-- Uniform Random Variable  $X\sim  U(a,b)$
$$f_X(x) = \frac{1}{b-a}, a \leq x \leq b$$
$$E[X] = \frac{a+b}{2}$$
$$Var(X) = \frac{(b-a)^2}{12}$$
```{r, echo=FALSE, fig.height=3, fig.width=3.5}
density <- dunif(x=seq(from=0, to=6, by=0.01), min=1, max=5)
plot(seq(from=0, to=6, by=0.01), density, col="black", type="l", ylim=c(0, 0.5), lwd=4,  xlab="X ~ U(1,5)")
  lines(c(3,3), c(0,dunif(3, min=1, max=5)), col="red", lwd=2)
  text(2.9, 0.1, "E[X]=(1+5)/2 = 3", col="purple")
```

When I "Knit PDF" within R Studio, the slide that is produced has a large blank space between the text and the figure. As a result, the figure doesn't fit on the slide. I would like to remove this blank space so that everything can fit on the slide.

Here are all the code chunk options I've tried that haven't worked:

  • results='hide' which would ordinarily hide regular command results but still show the figure, but in this case still leaves the blank space.

  • strip.white=TRUE

  • tidy=TRUE

  • fig.keep = 'high'

  • fig.keep = 'last'

  • highlight= 'false'

I've also looked at:

  • http://yihui.name/knitr/demo/output/ which refers to https://github.com/yihui/knitr/issues/231 but since that addresses the problem in a .Rnw file, which I'm unfamiliar with, I couldn't get that solution to work. I tried putting the suggested header at the top of the .Rmd file but "Knit PDF" didn't complete compiling. I probably did it wrong.

  • I've looked at the R Markdown reference guide which is where I found the various options I tried above.

I've spent now two hours trying to figure out how to get one figure to show up properly on one slide. Any help would be appreciated.

2
Did you try R presentations for slides? To generate a PDF as slides, you need a lot of control and adjustment on layout, which I don't think the regular RMD can provide. - dracodoc
Thanks @dracodoc for the suggestion. I agree that I'm at the point of switching away from Beamer. R Presentations compiles well on my sample, but I have several presentation files, each having 50+ slides, so switching to the R Presentations syntax is a bit onerous at this point. (I'm in the final editing stages of trying to get figures to show properly, etc.) The ioslides_presentation output format seems to knit well on my .rmd, so I'll probably just switch to that. However, if there are any workarounds to my question posted above, I'd love to learn them. Thanks! - S.M.

2 Answers

1
votes

You could play with par(), but part of the problem comes from the latex side. Using a \begin{center}\end{center} environment adds vertical space. You could try to modify the relevant knitr hook, or simply add the centering instruction by hand,

\centering
```{r, echo=FALSE, fig.height=1.5, fig.width=3.5}
density <- dunif(x=seq(from=0, to=6, by=0.01), min=1, max=5)
par(mar=c(2.5,2.5,0.5,0.5), mgp=c(1.5, 0.5, 0), bg="grey95")
plot(seq(from=0, to=6, by=0.01), density, col="black", type="l", ylim=c(0, 0.5), lwd=4,  xlab="X ~ U(1,5)")
  lines(c(3,3), c(0,dunif(3, min=1, max=5)), col="red", lwd=2)
  text(2.9, 0.1, "E[X]=(1+5)/2 = 3", col="purple")
  ```

enter image description here

1
votes

Thanks to all who responded. I set the code chunk option out.width='65%' which worked (along with changing the yaxis to extend from 0 to 0.3 rather than 0 to 0.5):

---
title: "Lecture 5 - The Normal Distribution"
output:
  beamer_presentation: 
    highlight: null
---
```{r setup, echo=FALSE, include=FALSE}
knitr::knit_hooks$set(mysize = function(before, options, envir) {
  if (before) 
    return(options$size)
})
knitr::opts_chunk$set(size='\\small')
knitr::opts_chunk$set(echo=TRUE)
knitr::opts_chunk$set(warning=FALSE)
knitr::opts_chunk$set(message=FALSE)
knitr::opts_chunk$set(fig.align='center')
```
## Recap from Last Time: Continuous Random Variables
-- Uniform Random Variable  $X\sim  U(a,b)$
$$f_X(x) = \frac{1}{b-a}, a \leq x \leq b$$
$$E[X] = \frac{a+b}{2}$$
$$Var(X) = \frac{(b-a)^2}{12}$$

```{r, echo=FALSE,out.width='65%'}
density <- dunif(x=seq(from=0, to=6, by=0.01), min=1, max=5)
plot(seq(from=0, to=6, by=0.01), density, col="black", type="l", ylim=c(0, 0.3), lwd=4,  xlab="X ~ U(1,5)")
  lines(c(3,3), c(0,dunif(3, min=1, max=5)), col="red", lwd=2)
  text(2.9, 0.1, "E[X]=(1+5)/2 = 3", col="purple")
```