web-dev-qa-db-ja.com

Rマークダウンで画像の上下の空白を削除するにはどうすればよいですか?

.Rmdファイルを主にラテックス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)
```

ご覧のとおり、私はすでにstrip.white=TRUEfig.env='figure'を使用していますが、機能していないようです。 .PNGファイルには、画像の上または下に(白い)スペースがありません。

ラテックスを直接使用して目的を達成できることはわかっていますが、必要に応じてこれをWordで再現できるようにしたいと考えています。また、Wordでは、画像の上下に半ページの空きスペースがあります。

どんな助けでも大歓迎です。ありがとう

16
Pdawg

問題はknitrではなく、ラスターイメージに関連しています。ラスターイメージは、歪まないように白いエッジを生成します。たとえば、? graphics::plot.rasterと入力すると、asp引数を1に設定すると、ラスターからの比率が保持されます。 画像を標準のR出力にプロットすると、空白の部分が表示されます。ウィンドウを調整すると、それらの白い部分が削除されます。したがって、必要なのは、画像のサイズを確認してから、knitrでfig.asp比を使用して、画像が収まるフレームを作成することです。

画像の比率を確認してください

Magickを使用した例

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

これは戻ります

  format width height colorspace filesize
1    PNG   960    600       sRGB   762423

ReadPNG()を使用することもできます

curl::curl_download(url, "image.png")
image <- png::readPNG("image.png",info=TRUE)
attr(image,"info")

Knitrから options パラメータfig.aspがあります

fig.asp:(NULL;数値)プロットのアスペクト比、つまり高さ/幅の比率。 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()

ご覧のとおり、最初の画像には空白のエッジがあり、2番目の画像は正しく表示されています。

docx output

トリム付きのLATEXの使用

質問でLATEXの答えが尋ねられなかったことは知っていますが、一部の読者がニットまたはスウィーブを使用してLATEX出力を生成している場合は、以下にニットで画像をトリミングする方法を示します。使用される引数はtrim={<left> <lower> <right> <upper>であり、単位はcm mm in ...(LATEX nit の長さの1つ)です。これらの引数を渡すには、チャンクオプションで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}

enter image description here

HTMLの使用

Here は、fig.retinaout.widthなどの引数を理解するための優れたブログです。


最後に、strip.white引数は、コードの空白行を削除することです。画像のサイズは変更されません。

strip.white:(TRUE;論理)出力のソースチャンクの最初または最後の白い線を削除するかどうか

5
Cedric