如何使用knitr为markdown设置本地图片的大小?

187
我有一张本地图片,想要将其包含在.Rmd文件中,然后使用knit命令并通过Pandoc转换为HTML幻灯片。根据此帖子,这将插入本地图片:
![图像标题](路径/到/您的/图片)

是否有修改这段代码以设置图像大小的方法?


5
为了更精细地控制尺寸,你可能需要使用一个HTML img标签。 - Marius
5
根据@Marius的评论(http://daringfireball.net/projects/markdown/syntax),截至本文撰写时,Markdown没有用于指定图像尺寸的语法;如果这很重要,可以直接使用常规的HTML <img>标签。 - Ben Bolker
12
使用HTML标签的问题在于,Rmd转换过程不再将图像识别为外部资源,因此它不会被包含在呈现的HTML独立版本中。 - fabians
8个回答

228

这个问题已经很老了,但仍然受到很多关注。由于现有答案已过时,这里提供一个更加实用的解决方案:

调整本地图片大小

knitr 1.12 版本开始,有了一个名为 include_graphics 的函数。根据 ?include_graphics (我强调):

使用此函数的主要优点在于它是可移植的,因为它适用于 knitr 支持的所有文档格式,因此您无需考虑是否需要使用 LaTeX 或 Markdown 语法来嵌入外部图像。与正常的 R 绘图相关的代码块选项也适用于这些图像,例如 out.widthout.height

示例:

```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png")
```

优点:


包含生成的图片

要组合路径到一个 在块中生成的绘图(但没有包含),可以使用块选项 opts_current$get("fig.path")(图形目录的路径)以及 opts_current$get("label")(当前块的标签)。以下示例使用fig.path来包含第一个块中生成的两个未显示的图像中的第二个图像:

```{r generate_figures, fig.show = "hide"}
library(knitr)
plot(1:10, col = "green")
plot(1:10, col = "red")
```

```{r}
include_graphics(sprintf("%sgenerate_figures-2.png", opts_current$get("fig.path")))
```
一般的图形路径模式为[fig.path]/[chunklabel]-[i].[ext],其中chunklabel是生成绘图所在块的标签,i是该块内的绘图索引,ext是文件扩展名(默认情况下在RMarkdown文档中为png)。

22
对于 PDF 输出,您需要指定图形尺寸的单位,例如 out.width='100pt',否则 LaTeX 将会报告非法的度量单位错误。 - andybega
5
同样适用于 MS Word 输出,但 out.width 和 out.height 不起作用。 - Ben
2
你可能想要使用 r, echo=FALSE, ... - Jameson Quinn
这很奇怪:它能在ioslides Rmd中运行,但不能在Rmd到Word或HTML中运行。对于后两者,我收到错误消息:pandoc: 无法获取~/Google Drive/SI/DataScience/UAC_JRI/output/Master_Report/SI_logo.png ~/Google Drive/SI/DataScience/UAC_JRI/output/Master_Report/SI_logo.png:openBinaryFile:不存在(没有这样的文件或目录) - jzadra
1
@jzadra 请创建一个带有可复现代码的新问题。目前我无法复制您的问题(将第二个代码片段原样复制到RMD文件中,并编织为HTML和Word)。 - CL.
显示剩余2条评论

152

更新的回答:在knitr 1.17中,您可以简单地使用

![Image Title](path/to/your/image){width=250px}
根据@jsb的评论进行编辑 请注意,这仅适用于没有空格的情况,例如{width = 250px}而不是{width = 250px}。

6
我在使用knitr 1.16时尝试了这个功能,但在使用ioslides时无法正常工作。这个功能被删除了还是ioslides的问题? - Dr. Mike
2
最新版本的所有软件包对我也不起作用。 - slhck
6
在使用knitr 1.17时对我有效。确保你写的时候不要有空格,例如{width=250px}而不是{width = 250px} - Samuel
2
使用 knitr_1.21xaringan 对我来说无法正常工作。 - Dan
5
对于高度和宽度,应使用“{height=640px width=480px}”,之间需要留有一个空格,而不是逗号或其他任何符号。 - dsz
显示剩余3条评论

112

您也可以使用 png 包读取图像并像正常绘制一样使用 grid.rastergrid 包中绘制它。

```{r fig.width=1, fig.height=10,echo=FALSE}
library(png)
library(grid)
img <- readPNG("path/to/your/image")
 grid.raster(img)
```

使用这种方法,您可以完全控制您的图像的大小。


谢谢,这个使用slidy可以工作。(使用dzslides不太好用,但我不认为这是提供的解决方案的问题)。 - Adam Smith
1
img <- readPNG("path/to/your/image") 中,路径周围的引号是必需的,但我无法编辑解决方案。 - Adam Smith
1
@AdamSmith 我刚刚从你的问题中复制了 path/to/your/image。是的,路径名是一个字符串,你需要用引号来定义一个字符串。希望我表达清楚了。 - agstudy
1
通过在RStudio下运行此代码,您将为渲染的png图像创建一个巨大的边距。 - Paulo E. Cardoso
22
未来的读者:这个答案已经过时了(https://dev59.com/JmUo5IYBdhLWcg3w-zei#36057971)。 - CL.

38

下面是几个选项,可以使文件本身包含图像而无需重新制作图像:

div 标签包装图像


div 标签包装图像

<div style="width:300px; height:200px">
![Image](path/to/image)
</div>

使用样式表

test.Rmd

---
title: test
output: html_document
css: test.css
---

## Page with an image {#myImagePage}

![Image](path/to/image)

test.css

#myImagePage img {
  width: 400px;
  height: 200px;
}

如果您有多张图片,您可能需要使用nth-child伪选择器来进行第二个选项。


2
这是一个很好的解决方案,但它只能与HTML输出一起使用!其他输出将忽略此设置。 - xhudik
“<div>…</div>” 的解决方案似乎非常简单。如何使用“style”设置将图像按固定百分比重新缩放,同时保持其宽高比? - user101089
尝试使用%代替px。 - Nick Kennedy
<div> ... </div> 方法能够与文本内联使用吗?我想让图片直接在一些常规文本旁边。谢谢! - Cassandra
这只能用于 HTML 内容。我建议使用 knitr 本身而不是这种策略。 - thus__

21

如果你正在将文件转换为HTML格式,你可以使用HTML语法来设置图像的大小:

  <img src="path/to/image" height="400px" width="300px" />

或者您想要设置的任何高度和宽度。


7
这个解决方案的问题在于,Rmd转换过程不再将该图像视为外部资源,因此在呈现的HTML的独立版本中将不会包含该图像。 - fabians

11

今天我也遇到了同样的问题,并在使用 knitr 1.16 将内容转化为 PDF 格式时找到了另一个选项(需要安装 pandoc):

![Image Title](path/to/your/image){width=70%}

这种方法可能需要你经过一些试错才能找到最适合自己的尺寸。它特别方便的是让将两个图片并排放置变得更加美观。例如:

![Image 1](path/to/image1){width=70%}![Image 2](path/to/image2){width=30%}

你可以进行创意拼贴,将一些图片并排堆叠并按照你的意愿调整它们的大小。欲了解更多想法和示例,请参见https://rpubs.com/RatherBit/90926


2
这不是和我上面的答案完全一样吗? - InspectorSands
3
@hermestrismegistus,差不多了,但我使用的是宽度百分比而不是像素宽度。我发现这个选项很有用,因为在我的特定情况下,我将多张图片并排放置,使用这种方式更加稳定,比直接给定精确宽度效果要好。 - Taylor Pellerin

8

我发现另一种可行的方法是通过调整 knitr::include_graphics() 的 dpi 选项来实现:

```{r}
knitr::include_graphics("path/to/image.png", dpi = 100)
```

...这种方法(除非你进行计算)相对于在块中定义尺寸而言是试错的,但也许它能帮助某些人。


4

对于调整图片大小,可使用knitr::include_graphics方法,但我无法找到如何使用它来生成并排调整大小的图片。我在这篇文章中找到了有用的信息。


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