如何使用 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 输出!其他输出将忽略设置<div> ... </div>
的解决方案看起来很简单。什么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.width
和out.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 <- readPNG("path/to/your/image")
中需要在文件路径周围加上引号,但我无法编辑解决方案。
@AdamSmith 我刚刚从您的问题中复制了您的path/to/your/image
。是的,路径名是一个字符串,并且您需要引号来定义一个字符串。希望我很清楚。
通过在 RStudio 下运行它,您将为渲染的 png 创建一个巨大的边距。
未来读者:这个答案是outdated。【参考方案8】:
如果要转换为 HTML,可以使用 HTML 语法设置图像的大小:
<img src="path/to/image" />
或您想要给出的任何高度和宽度。
【讨论】:
这个解决方案的问题是图像不再被 Rmd 转换过程识别为外部资源,因此它不会包含在渲染 HTML 的独立版本中。以上是关于如何使用 knitr 为降价设置本地图像的大小?的主要内容,如果未能解决你的问题,请参考以下文章