Как сделать несколько участков с разной высотой в уценке R? - PullRequest
2 голосов
/ 25 марта 2020

Я использую Rmarkdown для автоматизации генерации множества графиков. У меня есть такой код:

```{r make_plots}
for (a_ggplot in a_bunch_of_ggplots()) {
    print(a_ggplot)
}
```

Я хотел бы сделать графики разной высоты. Обычно я бы установил высоту с помощью fig.height в заголовке чанка. Я попытался использовать вектор для fig.height безуспешно. (Я думаю, что он просто использовал последнее значение.)

Как сделать графики разной высоты?

Кроме того, я хочу добавить некоторые заголовки документов. Я планирую попробовать технику из этого ответа (генерация необработанной уценки и использование results='asis'). Бонусные баллы, если ваше решение совместимо с ним!

РЕДАКТИРОВАТЬ : Возможно, я мог бы ggsave графики как изображения, а затем использовать include_graphics . Кажется, хак. Хуже того, он растеризует их, поэтому их нельзя увеличивать. Но это мысль.

1 Ответ

1 голос
/ 26 марта 2020

Лучше всего использовать .pdf здесь, так как формат предназначен для того, чтобы не изменять при масштабировании. Вы можете просто использовать for l oop или, возможно, лучше Map, чтобы, во-первых, создать свои графики, а во-вторых, чтобы создать код LaTeX "как есть", используя cat. Я использую базовые графики здесь, я уверен, вы также можете сделать это с ggplot2. Вокруг Map мы обертываем invisible, чтобы пропустить вывод консоли.

---
title: "Untitled"
output: pdf_document
header-includes:
- \usepackage{lipsum}  % just used for sample loremipsum text
---

\lipsum[1]

```{r plots, echo=FALSE, results="asis"}

what <- rep("AirPassengers", 4)  ## mimicking multiple plots

invisible(Map(function(w) {
  pdf(file=paste0(w, ".pdf"))
  plot(get(w))
  dev.off()
}, what))

heights <- c(2, 4, 6, 8)  ## define heights for each plot

invisible(Map(function(w, h) cat(
"
\\begin{figure}[ht]
\\includegraphics[height=", paste0(h, "cm"), "]{", paste0(w, ".pdf"), "}
\\caption{", w, "}\\label{fig:", w, "}
\\end{figure}
", sep=""), what, heights))

```

\lipsum[1]

Производит:

enter image description here

Если вы на самом деле вам нужны только разные высоты, вы можете указать размеры в первом вызове Map, например, используя второй аргумент для ширины, и использовать постоянную высоту / ширину во втором.

...