adding fig.cap="caption text" to code chunk causes figure to print at top of page instead of where it should be

Hi there,

I am writing a paper using R Markdown and have many plots that I would like to have captions. I have added these using <fig.cap=> in the code chunk options for each chunk that has a plot. When I add a figure caption, the plot no longer prints where it should, after the code chunk, and instead will go to the top of the next page or previous page. When the figure caption is removed, it prints where it should.

This only happens for a PDF output - it is fine in an html document.

Things I have tried:

  • turning off and on fig_caption in the YAML

  • PDF vs html output (only occurs in PDF)

  • fig.show='hold' and 'asis' in the code chunk options

Reproducible example code below that illustrates the problem.

Code Example
---
title: "Figure Caption Test"
author: "Tylar"
date: "May 8, 2019"
output:
  pdf_document: #This problem does not happen for html output, only PDF
    toc: true
    number_sections: true
    fig_caption: true #I have tried this will all of the toc, number_sections, and fig_caption removed with no difference.
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius morbi enim. Non nisi est sit amet facilisis magna etiam tempor orci. Id diam vel quam elementum. Sit amet justo donec enim diam vulputate ut pharetra sit. Posuere morbi leo urna molestie at elementum. Turpis massa tincidunt dui ut ornare. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec. Dolor magna eget est lorem ipsum dolor. Euismod elementum nisi quis eleifend quam adipiscing. Facilisis gravida neque convallis a cras.

Egestas purus viverra accumsan in nisl. Eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Felis bibendum ut tristique et egestas quis ipsum suspendisse ultrices. Ac orci phasellus egestas tellus rutrum. Blandit libero volutpat sed cras ornare. Malesuada proin libero nunc consequat interdum. Pharetra vel turpis nunc eget. Tristique senectus et netus et malesuada. Ipsum faucibus vitae aliquet nec. Hendrerit dolor magna eget est lorem ipsum dolor. In pellentesque massa placerat duis ultricies. Ultricies integer quis auctor elit. Etiam sit amet nisl purus in. Fusce id velit ut tortor pretium viverra suspendisse potenti. Maecenas pharetra convallis posuere morbi. Magna etiam tempor orci eu lobortis elementum nibh. Ac turpis egestas maecenas pharetra.

## Including a plot with a figure caption

**Plot with a caption should print right after this text (but does not, it gets printed on the next page after the Lorem ipsum text. I have also had it move to a previous page, before the code that generates it).**
```{r pressure, echo=FALSE, out.height="40%", fig.cap="Test caption"}
plot(pressure)

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius morbi enim. Non nisi est sit amet facilisis magna etiam tempor orci. Id diam vel quam elementum. Sit amet justo donec enim diam vulputate ut pharetra sit. Posuere morbi leo urna molestie at elementum. Turpis massa tincidunt dui ut ornare. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec. Dolor magna eget est lorem ipsum dolor. Euismod elementum nisi quis eleifend quam adipiscing. Facilisis gravida neque convallis a cras.

Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Ullamcorper eget nulla facilisi etiam dignissim. Imperdiet dui accumsan sit amet nulla. Venenatis cras sed felis eget velit aliquet sagittis id consectetur. Lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Nulla facilisi cras fermentum odio eu feugiat pretium. Duis ut diam quam nulla porttitor massa. Feugiat in ante metus dictum. Turpis massa sed elementum tempus egestas sed sed risus pretium. Enim sit amet venenatis urna cursus. Ac placerat vestibulum lectus mauris. Facilisis magna etiam tempor orci eu lobortis elementum nibh tellus. Ac tincidunt vitae semper quis lectus nulla at volutpat. Non nisi est sit amet facilisis. Aliquam ultrices sagittis orci a scelerisque purus semper. Augue lacus viverra vitae congue eu consequat ac felis.

Nisl condimentum id venenatis a. Urna duis convallis convallis tellus id interdum velit laoreet. Nunc consequat interdum varius sit. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula ipsum. Fringilla phasellus faucibus scelerisque eleifend donec pretium. Consequat nisl vel pretium lectus quam id leo. Dictum varius duis at consectetur lorem donec massa sapien. Aliquam malesuada bibendum arcu vitae. Tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Integer vitae justo eget magna fermentum. Cras semper auctor neque vitae tempus quam pellentesque. Porta non pulvinar neque laoreet suspendisse interdum. Semper auctor neque vitae tempus quam pellentesque nec nam. Turpis massa tincidunt dui ut ornare lectus sit amet est.

## Including a plot without a figure caption

**Plot without the caption should print right after this text (and does).**

{r pressure2, echo=FALSE, out.height="40%"}
plot(pressure)

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius morbi enim. Non nisi est sit amet facilisis magna etiam tempor orci. Id diam vel quam elementum. Sit amet justo donec enim diam vulputate ut pharetra sit. Posuere morbi leo urna molestie at elementum. Turpis massa tincidunt dui ut ornare. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec. Dolor magna eget est lorem ipsum dolor. Euismod elementum nisi quis eleifend quam adipiscing. Facilisis gravida neque convallis a cras.
Egestas purus viverra accumsan in nisl. Eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Felis bibendum ut tristique et egestas quis ipsum suspendisse ultrices. Ac orci phasellus egestas tellus rutrum. Blandit libero volutpat sed cras ornare. Malesuada proin libero nunc consequat interdum. Pharetra vel turpis nunc eget. Tristique senectus et netus et malesuada. Ipsum faucibus vitae aliquet nec. Hendrerit dolor magna eget est lorem ipsum dolor. In pellentesque massa placerat duis ultricies. Ultricies integer quis auctor elit. Etiam sit amet nisl purus in. Fusce id velit ut tortor pretium viverra suspendisse potenti. Maecenas pharetra convallis posuere morbi. Magna etiam tempor orci eu lobortis elementum nibh. Ac turpis egestas maecenas pharetra.

Consectetur adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Justo donec enim diam vulputate ut pharetra sit amet aliquam. Sem fringilla ut morbi tincidunt. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Elit ut aliquam purus sit amet luctus venenatis. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Amet nulla facilisi morbi tempus iaculis urna id volutpat. Sociis natoque penatibus et magnis. Nullam non nisi est sit amet. Elementum tempus egestas sed sed risus. Amet purus gravida quis blandit turpis cursus. Id venenatis a condimentum vitae sapien. Ridiculus mus mauris vitae ultricies leo integer malesuada. Gravida cum sociis natoque penatibus et magnis. Ultricies leo integer malesuada nunc. Scelerisque viverra mauris in aliquam sem fringilla. Auctor augue mauris augue neque gravida in. Ultricies mi eget mauris pharetra et ultrices neque. Commodo odio aenean sed adipiscing diam donec adipiscing tristique.

Thank you in advance!

How about using fig.pos="H", it should keep the figure exactly where it is.

2 Likes

This worked! Thank you so much!

Note for other users: You have to install and add the kableExtra package for R to recognize fig.pos="H". Otherwise, it doesn't recognize the capital H option.

1 Like

How exactly do you get use kableExtra in this case?

I installed the kableExtra package and called library(kableExtra) at the beginning of my code. Other than that, you don't need to do anything extra, just set fig.pos="H" either in the global settings or in the particular code chunk.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.