R markdown、knitr、pandoc和beamer中的图形尺寸和分辨率

74

默认情况下不适合幻灯片,甚至不能通过其他方式打印。

这是 .Rmd 文件:编辑:似乎你必须在每个块中使用 plot()。第二个图现在可以打印。

# Plot should show at high resolution

```{r echo=FALSE, comment = ""}
# load some data
require(plyr)
rbi <- ddply(baseball, .(year), summarise,  
  mean_rbi = mean(rbi, na.rm = TRUE))
```

```{r}
# plot
plot(mean_rbi ~ year, type = "l", data = rbi)
```

# Second attempt
```{r, fig.width = 2, fig.height = 2}
plot(mean_rbi ~ year, type = "l", data = rbi)
```

# Third attempt
```{r, out.width = 2, out.height = 2}
plot(mean_rbi ~ year, type = "l", data = rbi)
```

# Fourth attempt
```{r, out.width = '200px', out.height = '200px'}
plot(mean_rbi ~ year, type = "l", data = rbi)
```

# Fifth attempt
```{r, out.width = '\\maxwidth'}
plot(mean_rbi ~ year, type = "l", data = rbi)
```

将其保存为test.Rmd 然后使用beamer编译为tex:

knit("test.Rmd")
system("pandoc -s -t beamer --slide-level 1 test.md -o test.tex")

在RStudio中打开test.tex并点击“编译PDF”。

我已经阅读了Yihui的文档,希望我没有错过什么非常明显的东西。

编辑新代码,融入Yihui的建议。

```{r setup, include=FALSE}
opts_chunk$set(dev = 'pdf')
```

# Plot should show at high resolution

```{r echo=FALSE, comment = ""}
# load some data
require(plyr)
rbi <- ddply(baseball, .(year), summarise,  
  mean_rbi = mean(rbi, na.rm = TRUE))
```

```{r}
# plot
plot(mean_rbi ~ year, type = "l", data = rbi)
```

# Second attempt
```{r, fig.width = 4, fig.height = 4}
plot(mean_rbi ~ year, type = "l", data = rbi)
```

sessionInfo()

 R version 3.0.1 (16/05/2013)
Platform: x86_64-pc-linux-gnu (64-bit)

Local:
 [1] LC_CTYPE = en_US.UTF-8 LC_NUMERIC = C LC_TIME = C LC_COLLATE = C        
 [5] LC_MONETARY=C        LC_MESSAGES=C        LC_PAPER=C           LC_NAME=C           
 [9] LC_ADDRESS=C         LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.8       markdown_0.6   knitr_1.2      rCharts_0.3.51 slidify_0.3.52

loaded via a namespace (and not attached):
 [1] RJSONIO_1.0-3   codetools_0.2-8 digest_0.6.3    evaluate_0.4.3  formatR_0.8    
 [6] grid_3.0.1      lattice_0.20-15 stringr_0.6.2   tools_3.0.1     whisker_0.3-2  
[11] yaml_2.1.7  

2
我修改了你的帖子,并删除了print(x),因为它既没有意义,又极易误导。希望你不介意。 - Yihui Xie
2个回答

57

我认为这是一个经常被问到的问题,关于从Pandoc和Markdown生成的beamer幻灯片中图形的行为。真正的问题在于,R Markdown默认会生成PNG图像(来自knitr),而且很难通过LaTeX默认方式来正确获取PNG图像的大小(我不知道为什么)。然而,获取PDF图像的大小却相对容易。其中一种解决方案是在第一个代码块中将默认的图形设备重置为PDF。

```{r setup, include=FALSE}
knitr::opts_chunk$set(dev = 'pdf')
```

然后所有的图像将被写成PDF文件,LaTeX会很高兴。

你的第二个问题是在out.width/out.height中混淆了HTML单位和LaTeX单位。 LaTeX和HTML是非常不同的技术。 你不应该期望\maxwidth在HTML中工作,或者200px在LaTeX中起作用。 特别是当你想把Markdown转换为LaTeX时,最好不要设置out.width/out.height(使用fig.width/fig.height并让LaTeX使用原始大小)。


这有所帮助,但还不够。第一个图仍然很大。第二个图很小,但分辨率非常低。我尝试将this similar question中的代码直接添加到.tex文件中(在编织之后)。它可以控制宽度,但仍会超出幻灯片底部。抱歉用print()打印基本图形。我使用Ubuntu - 会话信息马上就来。 - nacnudus
7
@nacnudus,你最好在再次运行knitr之前先删除figure目录;LaTeX存在许多不为人知的问题,例如默认情况下它更喜欢使用PNG而不是PDF格式,所以如果存在foo.pngfoo.pdf两个文件,那么\includegraphics{foo}命令会使用foo.png文件。 - Yihui Xie
对我不起作用...图仍然超出pdf的边界。 - robertspierre
在使用Markdown渲染PDF时,是否有一种方法可以保存定义的DPI? - PesKchan

38

图形大小以英寸为单位指定,并可作为文档输出格式的全局选项包含。例如:

---
title: "My Document"
output:
  html_document:
    fig_width: 6
    fig_height: 4
---

而图形设备中的图形大小可以在块级别上增加:

```{r, fig.width=14, fig.height=12}          #Expand the plot width to 14 inches

ggplot(aes(x=mycolumn1, y=mycolumn2)) +     #specify the x and y aesthetic
geom_line(size=2) +                         #makes the line thicker
theme_grey(base_size = 25)                  #increases the size of the font
```

您还可以使用out.widthout.height参数直接定义输出文件中绘图的大小:

```{r, out.width="200px", out.height="200px"} #Expand the plot width to 200 pixels

ggplot(aes(x=mycolumn1, y=mycolumn2)) +     #specify the x and y aesthetic
geom_line(size=2) +                         #makes the line thicker
theme_grey(base_size = 25)                  #increases the size of the font
```

1
@theforestecologist 可能需要在第一个选项前加上逗号,像这样 {r chunk-name, opt=val, opt=val2}。这种方式对我有效。但我不够熟悉knitr,无法进行编辑。 - Frank
1
yml头文件中的fig_widthfig_weight设置在使用output: pdf_document时似乎无效。如何进行设置? - elcortegano
此解决方案仅适用于HTML输出。 - RRuiz
1
out.widthout.height 对我来说是不错的选择。谢谢。 - igorkf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接