Автоматически масштабировать размер шрифта (и т.д.) Ggplot2 внутри документа Rmarkdown

У меня есть несколько графиков ggplot2 с большим количеством текста в них (никоим образом), который я строю внутри *.Rmd, например:

---
title: "SO Test"
output: pdf_document
---

```{r}
library(ggplot2)
df <- data.frame(rep(1:5,5),rep(1:5, each=5),rep("Test",5))
colnames(df) <- c("x", "y", "word")
ggplot(data = df, mapping = aes(x = x, y = y, label = word)) +      geom_text()
```

Это отлично работает, давая мне что-то вроде ниже как PDF.

enter image description here

Теперь я хотел бы сделать эти метки (Test) максимально возможными без переопределения.

Моя проблема в том, что теперь я вижу 2 "рычаги", которые я мог бы потянуть, чтобы изменить размер шрифта:

  • "внутрь" ggplot2, изменить, добавить, скажем, geom_text(size=12)
  • при построении "внутри" knitr (или Rmarkdown?) добавьте параметр chunk, например `fig.width = 15, fig.height = 15), который также изменяет размер шрифта по отношению к общему графику размер (по причинам, которые я действительно не понимаю).

Очевидно, что 1. будет простым способом, но мне тогда нужно настроить geom_text(size=...) всегда в зависимости от размера вывода, скажем, при изменении linewidth в LaTeX или ширину столбца моего сообщения в блоге. Это кажется неэлегантным, если не сказать больше.

Как мне это сделать элегантным, масштабируемым способом, который создает красивый сюжет?

Я все еще немного расплывчатый, и где в toolchain (Rmarkdown?, knitr?, ggplot2) я должен начать...

Ps: в качестве бонуса размер шрифта должен быть достигнут программно, потому что длина строки Text изменяется в зависимости от сюжета в сюжет в реальной жизни.

Ответ 1

Я думаю о размере устройства в виде листа бумаги, шрифт 12 pt имеет тот же размер на любом листе бумаги. Однако в pdf_document изображение масштабируется, чтобы соответствовать области фигуры и, соответственно, уменьшать или растягивать размер шрифта в графике.

Я бы порекомендовал попробовать tikz-графику. Rmarkdown позволяет вам включать команды и параметры LaTeX в .Rmd и корректно отображать их в pdf_document. Использование графики tikz позволяет вам указать определенные функции разметки для каждого label в графике.

Во-первых, вам нужно будет включить правильную информацию заголовка

---
title: SO Example
output: pdf_document
header-includes:
   - \usepackage{lipsum}
   - \usepackage{tikz}
---

Файл .Rmd продолжается

```{r}
# Chunk 1: package load and data set up.
# Note: The `word` column contains labels with LaTeX markups
library(ggplot2)
df <- data.frame(x = rep(1:5,5),
                 y = rep(1:5, each=5),
                 word = c(rep("Test",5), 
                          c("$\\alpha$", "{\\bf bold}", "{\\it italic}",
                            "{\\footnotesize footnotesize}", "$\\beta$"), 
                          rep("test", 15)))
```

```{r, dev = "tikz", fig.width = 6, fig.height = 6}
# A 6 inch by 6 inch figure
ggplot(data = df, mapping = aes(x = x, y = y, label = word)) + geom_text() 
```

и выводит результат:

введите описание изображения здесь

Меньшая графика, где размер шрифта ярлыков должен быть отредактирован:

введите описание изображения здесь

```{r, dev = "tikz", fig.width = 3, fig.height = 3}
# A 3 inch by 3 inch figure
ggplot(data = df, mapping = aes(x = x, y = y, label = word)) + geom_text() 
```

Пример построения динамических размеров шрифтов выполняется следующим образом:

# Example of dynamically setting label markups

Some blank text, followed by some lipsum form \LaTeX:

\lipsum[1]

```{r, dev = "tikz"}
library(stringr)
State_Names <- 
  data.frame(x = 1:5, y = rep(10:1, each = 5), state = state.name)

# Set size by lenght of state name
# Less than 8 chars: normalsize
# 8 or more chars: tiny
nchars <- sapply(State_Names$state, nchar)
State_Names$state[nchars >= 8] <- 
  paste0("{\\tiny ", State_Names$state[nchars >= 8], "}")


ggplot(State_Names, aes(x = x, y = y, label = state)) + geom_text() + xlim(0, 6)
```

С выходом:

введите описание изображения здесь