如何使用knitr进行Markdown设置本地图像的大小?


149

我有一个本地图像,希望将其包含在.Rmd文件中,然后将其knit转换为HTML幻灯片Pandoc。根据这篇文章,这将插入本地图像:
![Image Title](path/to/your/image)

有没有办法修改此代码以同时设置图像大小?


5
为了更好地控制尺寸,您可能最终不得不使用HTML img标签
Marius

5
第二条@Marius的评论:daringfireball.net/projects/markdown/syntax说:“截至撰写本文时,Markdown尚无用于指定图像尺寸的语法;如果这对您很重要,则可以简单地使用常规HTML <img>标签”。
Ben Bolker

12
使用HTML标记的问题是Rmd转换过程不再将图像识别为外部资源,因此它不会包含在呈现的HTML的独立版本中。
fabians 2014年

Answers:


101

您也可以使用读取图像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上效果不佳,但是我不认为所提供的解决方案有问题)。
亚当·史密斯

1
文件路径中的引号是必需的,img <- readPNG("path/to/your/image")但是我无法编辑解决方案。
亚当·斯密

1
@AdamSmith我只是path/to/your/image从您的问题中复制了您。是的,路径名是一个字符串,并且您需要用引号将其定义为字符串。希望我清楚。
agstudy 2013年

1
通过在RStudio下运行它,您将为渲染的png创建巨大的边距。
Paulo E. Cardoso 2014年

19
未来的读者:这个答案已经过时了
CL。

190

这个问题很老,但是仍然引起很多关注。由于现有答案已过时,因此这里提供了最新的解决方案:

调整本地图像的大小

knitr1.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文件扩展名(默认情况下png在RMarkdown文档中)。


18
对于pdf输出,您将必须指定图形尺寸的单位,例如out.width='100pt',否则乳胶将引发有关非法计量单位的错误。
andybega '16

4
也适用于微软Word输出,但out.width和out.height不起作用

@andybega谢谢您的评论;我将其纳入答案。
CL。

2
你可能想r, echo=FALSE, ...
詹姆逊奎因

1
@jzadra请为您的问题创建一个具有可复制代码的新问题。目前,我无法重现您的问题(将第二个代码片段逐字复制到RMD文件中,并编织为HTML和Word)。
CL。

112

未更新的答案:knitr 1.17您可以简单地使用

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

编辑按从@jsb评论

请注意,这仅适用于没有空格的情况,例如{width = 250px}而不是{width = 250px}


6
我在knitr 1.16中尝试过,但在使用ioslides时不起作用。此功能是否已删除,或者是滑坡问题?
迈克博士

2
在所有软件包的最新版本上,这对我也不起作用。
slhck

3
使用knitr 1.17为我工作。确保书写时没有空格,例如{width=250px}not {width = 250px}
jsb

2
为我工作,是迄今为止最简单的解决方案。
战舰

xaringan与使用时,这对我不起作用knitr_1.21
Lyngbakr

37

以下是一些选项,可在不重新映像的情况下保持文件自包含:

将图像包装在div标签中

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

使用样式表

测试文件

---
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;
}

如果您有多个图像,则可能需要为第二个选项使用第n个子级伪选择器。


1
这是一个很好的解决方案,但只能与html输出一起使用!其他输出将忽略该设置
xhudik

<div> ... </div>解决方案似乎很简单。什么是style重新缩放图像到一个固定的百分比,保持纵横比设置?
user101089

尝试使用%而不是px。
尼克·肯尼迪

20

如果要转换为HTML,则可以使用以下HTML语法来设置图像的大小:

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

或您要提供的任何高度和宽度。


6
此解决方案的问题是Rmd转换过程不再将图像识别为外部资源,因此它不会包含在呈现的HTML的独立版本中。
fabians 2014年

8

今天遇到了同样的问题,并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'Mar

2
@hermestrismegistus差不多,但是我使用的是宽度百分比,而不是像素宽度。我发现此选项很有用,因为在我的特定情况下,我并排放置了多张图像,这种方式的表现更好,以至于当我给出确切宽度时
Taylor Pellerin

5

对我有用的另一个选项是使用knitr::include_graphics()像这样的dpi选项:

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

...与在块中定义尺寸相比,这肯定(除非您进行数学计算)是反复试验的,但也许会有所帮助。


4

knitr :: include_graphics解决方案在调整数字大小时效果很好,但是我无法弄清楚如何使用它来生成并排调整大小的数字。我发现这篇文章对此很有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.