在Rmarkdown文档中自动缩放ggplot2的字体大小(等)

max*_*eld 10 plot r ggplot2 knitr r-markdown

我有一些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()
```
Run Code Online (Sandbox Code Playgroud)

这很好用,给我一些类似下面的PDF格式.

在此输入图像描述

我现在想让这些标签(Test)尽可能大而不会过度绘图.

我的问题是我现在看到2个 "杠杆"我可以拉动来改变字体大小:

  1. "内部" ggplot2,改变,添加,说,geom_text(size=12)
  2. 在绘图时,"内部" knitr(或Rmarkdown?),添加一个块选项,如`fig.width = 15,fig.height = 15),这改变了对于整体绘图大小的字体大小(原因我不是真的了解).

显然,1.将是直截了当的方式,但我需要geom_text(size=...)根据输出的大小进行调整,例如,当linewidthLaTeX中的更改或我的博客帖子的列宽时.至少可以说,这似乎是不优雅的.

我如何以优雅,可扩展的方式实现这一目标,从而产生漂亮的情节?

我对此仍然有点模糊,在工具链中哪里(Rmarkdown?,KnitrGGplot2),我应该开始......

Ps:作为奖励,字体大小应该以编程方式到达,因为字符串的长度Text在现实生活中从剧情到情节不等.

Pet*_*ter 9

我认为设备尺寸为一张纸,12磅字体在任何尺寸的纸张上都是相同的尺寸.但是,在pdf_document中,缩放图像以适合图形区域,从而相应地缩小或拉伸图形中的字体大小.

我建议尝试tikz图形.Rmarkdown允许您将LaTeX命令和选项合并到.Rmd中,并在pdf_document中正确呈现它们.使用tikz图形允许您为label图形中的每个指定特定的标记功能.

首先,您需要包含正确的标头信息

---
title: SO Example
output: pdf_document
header-includes:
   - \usepackage{lipsum}
   - \usepackage{tikz}
---
Run Code Online (Sandbox Code Playgroud)

.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() 
```
Run Code Online (Sandbox Code Playgroud)

并产生输出:

在此输入图像描述

一个较小的图形,需要编辑标签的字体大小:

在此输入图像描述

```{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() 
```
Run Code Online (Sandbox Code Playgroud)

动态构建字体大小的示例如下:

# 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)
```
Run Code Online (Sandbox Code Playgroud)

随着输出:

在此输入图像描述