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

时间:2015-03-03 15:23:26

标签: r plot ggplot2 knitr r-markdown

我有一些ggplot2图,其中包含 lot 的文字(没办法),我正在*.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 &#34;杠杆&#34;我可以拉来改变字体大小:

  1. &#34;内部&#34; ggplot2,更改,添加,说,geom_text(size=12)
  2. 在策划时,&#34;内部&#34; knitr(或Rmarkdown?),添加一个块选项,如`fig.width = 15,fig.height = 15),其中更改字体大小相对于总体情节大小(出于我不太了解的原因)。
  3. 显然, 1。将是直截了当的方式,但我需要根据输出的大小调整geom_text(size=...),例如,linewidth时LaTeX更改或我的博客帖子的列宽。 至少可以说,这似乎是不优雅的。

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

    我对此仍然有点模糊,工具链(Rmarkdown?,Knitr?,GGplot2)的位置我应该开始...

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

1 个答案:

答案 0 :(得分:9)

我认为设备尺寸为一张纸,12磅字体在任何尺寸的纸张上都是相同的尺寸。但是,在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() 
```

并生成输出:

enter image description here

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

enter image description here

```{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)
```

输出:

enter image description here