如何删除R Markdown中图像上方和下方的空白区域?

Pda*_*awg 15 latex r rstudio knitr r-markdown

我想主要将.Rmd文件导出为latex pdf.

这是我目前正在使用的代码

```{r ,fig.cap="caption",fig.env='figure', fig.width=10, fig.height=10,echo=FALSE, results='asis', warning=FALSE, strip.white=TRUE}
library(png)
library(grid)
img <- readPNG("filepath/overview.png")
grid.raster(img)
```
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经在使用strip.white=TRUE&fig.env='figure'但它们似乎不起作用..PNG文件在图像上方或下方没有任何(白色)间距.

我知道我可以直接使用乳胶并实现我想要的,但我希望能够在Word中重现这一点,如果需要的话.同样在Word中,图像上方和下方有半页空白空间.

任何帮助将不胜感激.谢谢

Ced*_*ric 8

您的问题与 knitr 无关,而是与光栅图像有关,它会产生白色边缘以防止其变形。例如,如果您键入,? graphics::plot.raster您将看到asp设置为 1的参数保留来自栅格的比率。在标准 R 输出中绘制您的图像,您将看到空白部分,如果您调整窗口,这些白色部分将被删除。所以你需要的是检查你的图像尺寸,然后fig.asp在 knitr 中使用一个比率来生成一个框架,让你的图像适合。

检查您的图像比例

使用魔法的例子

url <- "https://cdn.pixabay.com/photo/2017/11/15/20/27/diamonds-2952447_960_720.png"
image<- image_read(url)
print(image) 
Run Code Online (Sandbox Code Playgroud)

这返回

  format width height colorspace filesize
1    PNG   960    600       sRGB   762423
Run Code Online (Sandbox Code Playgroud)

您也可以使用 readPNG()

curl::curl_download(url, "image.png")
image <- png::readPNG("image.png",info=TRUE)
attr(image,"info")
Run Code Online (Sandbox Code Playgroud)

从 knitr选项我们有参数fig.asp

fig.asp: (NULL; numeric) 绘图的纵横比,即高/宽之比;当指定 fig.asp 时,绘图的高度(块选项 fig.height)由 fig.width * fig.asp 计算

所以这里我们计算height/width= 0.62。

使用 knitr 和 docx 输出

在这里,我使用作为第一个块中设置opts.label参数传递的方形输出,这将在图像宽时放大问题。

--- 
title: "Crop image ?" 
output: word_document
--- 

```{r echo=FALSE}
require(knitr)
library(magick)
opts_template$set(squarefigure = list(fig.height = 6, fig.width = 6))
```
=lorem()
```{r opts.label ="squarefigure", echo=FALSE, fig.cap = "plot without setting the right raster output size"}
url <- "https://cdn.pixabay.com/photo/2017/11/15/20/27/diamonds-2952447_960_720.png"
img <- image_read(url)
img%>%grid.raster()
```
=lorem()

```{r  opts.label ="squarefigure", fig.cap = "plot with correct margin, square size", fig.asp=0.62}
img%>%grid.raster()
```
=lorem()
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个图像有一个空白边缘,而第二个图像正确显示。

文档输出

使用带修剪的 LATEX

我知道问题中没有问 LATEX 的答案,但如果有些读者正在使用 knitr 或 sweave 来生成 LATEX 输出,那么下面将展示如何在 knitr 中修剪图像。使用的参数是 trim={<left> <lower> <right> <upper>,单位可以是 cm mm in ...(LATEX长度单位之一)。要传递这些参数,您可以out.extra在块选项中使用该参数。请注意,使用fig.asp像上面这样的图像参数也可以使用。

\documentclass{article}
\usepackage{graphicx}
\usepackage[english]{babel}
\usepackage{blindtext}
\begin{document}
\blindtext

<<r1, echo=FALSE >>=
library(knitr)    
library(ggplot2)
library(magick)
# download image to disk
url <- "https://cdn.pixabay.com/photo/2017/11/15/20/27/diamonds-2952447_960_720.png"
curl::curl_download(url, "image.png")
img <- image_read(png::readPNG("image.png"))
plot(img)
@

\blindtext
\newpage
\blindtext
<<r2, echo=FALSE,out.extra='trim={0 5cm 0 5cm},clip' >>=
plot(img)
@
\blindtext

\end{document}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用 HTML

是一个很好的博客,也用于理解像fig.retinaout.width


最后的strip.white论点是删除空白的代码行。它不会调整您的图像大小。

strip.white: (TRUE;logical) 是否删除输出中源块开头或结尾的白线