Ответ 1
Ваша проблема не связана с knitr, а с растровым изображением, которое создает белый край, чтобы он не искажался. Например, если вы наберете ? graphics::plot.raster
, вы увидите аргумент asp
, установленный в 1, чтобы сохранить коэффициент из растра. Зарисуйте изображение в стандартном выводе R, вы увидите пустые части, если вы приспособите окно, эти белые части будут удалены. Итак, вам нужно проверить размеры изображения, а затем использовать коэффициент fig.asp
в knitr для создания рамки, которая позволит вашему изображению соответствовать.
Проверьте коэффициент изображения
Пример использования 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, высота участка ( chunk option 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()
Как вы можете видеть, первое изображение имеет пустой край, а второй - правильно.
Использование LATEX с обрезкой
Я знаю, что ответ на LATEX не задавался в вопросе, но если некоторые читатели
используют knitr или sweave для получения выходного сигнала LATEX, тогда
показывает, как обрезать изображение в книжке. Используемые аргументы
trim={<left> <lower> <right> <upper>
, и единица может быть cm мм в... (одна из LATEX единица для длины). Чтобы передать эти аргументы, вы можете использовать аргумент out.extra
в параметрах chunk.
Обратите внимание, что использование аргумента 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}
Использование HTML
Здесь - отличный блог и для понимания таких аргументов, как fig.retina
и out.width
Наконец, аргумент strip.white
должен удалить пустые строки кода. Он не будет изменять размер вашего изображения.
strip.white: (ИСТИНА, логично), следует ли удалять белые линии в начало или конец исходного фрагмента на выходе