如何使用 knitr 为降价设置本地图像的大小?

Posted

技术标签:

【中文标题】如何使用 knitr 为降价设置本地图像的大小?【英文标题】:How to set size for local image using knitr for markdown? 【发布时间】:2013-03-15 14:15:57 【问题描述】:

我有一个本地图像,我想将它包含在 .Rmd 文件中,然后我将 knit 并使用 Pandoc 转换为 html 幻灯片。根据this post,这将插入本地图像:![Image Title](path/to/your/image)

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

【问题讨论】:

为了更好地控制尺寸,您最终可能不得不使用HTML img tag 第二个@Marius 的评论:daringfireball.net/projects/markdown/syntax 说“在撰写本文时,Markdown 没有用于指定图像尺寸的语法;如果这对您很重要,您可以简单地使用常规 HTML 标签。” 使用 HTML 标签的问题是图像不再被 Rmd 转换过程识别为外部资源,因此它不会包含在呈现的 HTML 的独立版本中。 【参考方案1】:

未更新答案:在knitr 1.17 你可以简单地使用

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

编辑根据@jsb的评论

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

【讨论】:

我在 knitr 1.16 中尝试过这个,但在使用 ioslides 时它不起作用。此功能后来是否已被删除,还是 ioslides 问题? 在所有软件包的最新版本上对我也不起作用。 使用 knitr 1.17 为我工作。确保你写的时候没有空格,例如width=250px 不是 width = 250px 为我工作,迄今为止最简单的解决方案。 对于高度和宽度height=640px width=480px - 两者之间的空格,而不是逗号或其他任何内容。【参考方案2】:

另一个对我有用的选项是使用knitr::include_graphics() 的 dpi 选项,如下所示:

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

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

【讨论】:

【参考方案3】:

这里有一些选项可以使文件保持独立,而无需重新制作图像:

将图片包裹在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 伪选择器。

【讨论】:

这是一个很好的解决方案,但它只能用于 html 输出!其他输出将忽略设置 &lt;div&gt; ... &lt;/div&gt; 的解决方案看起来很简单。什么style 设置可以将图像重新缩放到固定百分比,同时保持纵横比? 尝试使用 % 而不是 px。【参考方案4】:

今天遇到同样的问题,在编织到 PDF 时发现了另一个选项 knitr 1.16(这需要您安装 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。

【讨论】:

这和我上面的回答不完全一样吗? @hermestrismegistus 差不多,但我使用的是宽度百分比而不是像素宽度。我发现这个选项很有用,因为在我的特殊情况下,我将多个图像并排放置,这样当我给出精确宽度时表现得更好【参考方案5】:

knitr::include_graphics 解决方案在调整图形大小方面效果很好,但我无法弄清楚如何使用它来生成并排调整大小的图形。我发现 this post 这样做很有用。

【讨论】:

【参考方案6】:

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

调整本地图片大小

截至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")
```

优点:

超过agastudy's answer:无需外部库或重新光栅化图像。 超过Shruti Kapoor's answer:无需手动编写HTML。此外,图像包含在文件的独立版本中。

包括生成的图像

要组成在块中生成的图的路径(但不包括在内),块选项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)。

【讨论】:

对于 pdf 输出,您必须指定图形尺寸的单位,例如out.width='100pt',否则latex会抛出非法计量单位的错误。 也适用于 MS Word 输出,但 out.width 和 out.height 不起作用 @andybega 谢谢你的评论;我将其合并到答案中。 你可能想要r, echo=FALSE, ... @jzadra 请为您的问题创建一个带有可重现代码的新问题。目前我无法重现您的问题(将第二个代码 sn-p 逐字复制到 RMD 文件并编织到 HTML 和 Word)。【参考方案7】:

例如,您还可以使用 png 包读取图像,并使用 grid 包中的 grid.raster 像常规绘图一样绘制它。

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

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

【讨论】:

谢谢,这可以使用 slidy。 (不适用于 dzslides,但我不认为这是提供的解决方案的问题)。 img &lt;- readPNG("path/to/your/image") 中需要在文件路径周围加上引号,但我无法编辑解决方案。 @AdamSmith 我刚刚从您的问题中复制了您的path/to/your/image。是的,路径名是一个字符串,并且您需要引号来定义一个字符串。希望我很清楚。 通过在 RStudio 下运行它,您将为渲染的 png 创建一个巨大的边距。 未来读者:这个答案是outdated。【参考方案8】:

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

  <img src="path/to/image"   />

或您想要给出的任何高度和宽度。

【讨论】:

这个解决方案的问题是图像不再被 Rmd 转换过程识别为外部资源,因此它不会包含在渲染 HTML 的独立版本中。

以上是关于如何使用 knitr 为降价设置本地图像的大小?的主要内容,如果未能解决你的问题,请参考以下文章

在 RMarkdown 中调整图像大小

Knitr 中的 Cairo 字体大小

将图像插入 IPython 笔记本降价

如何为使用 python 保存的 tiff 图像设置像素大小,以便将像素高度和宽度设置为 ImageJ 中的特定值?

内联图像未从 GatsbyJS 中的降价文件正文加载

如何裁剪图像,如大小为 476X248px 的 Facebook 提要图像