Как установить размер локального изображения с помощью knitr для уценки?

У меня есть локальное изображение, которое я хотел бы включить в .Rmd файл, который затем knit и конвертирую в слайды HTML с помощью Pandoc. Согласно этому сообщению, это будет вставьте локальное изображение:
![Image Title](path/to/your/image)

Есть ли способ изменить этот код, чтобы также установить размер изображения?


person Adam Smith    schedule 25.03.2013    source источник
comment
Для более точного контроля размеров вам может потребоваться использование HTML-тега img   -  person Marius    schedule 26.03.2013
comment
второй комментарий @ Marius: daringfireball.net/projects/markdown/syntax говорит, что на момент написания этой статьи Markdown не имеет синтаксиса для указания размеров изображения; если это важно для вас, вы можете просто использовать обычные теги HTML ‹img›.   -  person Ben Bolker    schedule 26.03.2013
comment
проблема с использованием тегов HTML заключается в том, что изображение больше не распознается как внешний ресурс процессом преобразования Rmd, поэтому оно не будет включено в автономную версию обработанного HTML.   -  person fabians    schedule 29.09.2014


Ответы (8)


Вы также можете прочитать изображение, например, с помощью пакета png, и построить его как обычный график, используя grid.raster из пакета grid.

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

С помощью этого метода у вас есть полный контроль над размером вашего изображения.

person agstudy    schedule 25.03.2013
comment
Спасибо, это работает с использованием slidy. (Не работает с dzslides, но я не считаю, что это проблема с предоставленным решением). - person Adam Smith; 28.03.2013
comment
Цитаты вокруг пути к файлу требуются в img <- readPNG("path/to/your/image"), но я не смог отредактировать решение. - person Adam Smith; 28.03.2013
comment
@AdamSmith Я только что скопировал ваш path/to/your/image из вашего вопроса. Да, имя пути - это строка, и для определения строки нужны кавычки. Надеюсь, я ясно. - person agstudy; 28.03.2013
comment
Запустив это в RStudio, вы создадите огромный запас для визуализированного png. - person Paulo E. Cardoso; 29.09.2014
comment
Будущие читатели: этот ответ устарел. - person CL.; 17.03.2016

Вопрос старый, но все еще привлекает много внимания. Поскольку существующие ответы устарели, вот более современное решение:

Изменение размера локальных изображений

Начиная с 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: нет необходимости во внешних библиотеках или в повторном растрировании изображения.
  • За ответ Шрути Капура: нет необходимости вручную писать 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 - расширение файла (по умолчанию png в документах RMarkdown).

person CL.    schedule 17.03.2016
comment
Для вывода в формате PDF вам нужно будет указать единицы измерения размеров фигуры, например out.width='100pt', иначе латекс выдаст ошибку о недопустимой единице измерения. - person andybega; 15.04.2016
comment
Также работает для вывода MS Word, но out.width и out.height не работают - person Ben; 23.05.2016
comment
@andybega Спасибо за ваш комментарий; Я включил это в ответ. - person CL.; 07.09.2016
comment
ты, наверное, хочешь r, echo=FALSE, ... - person Jameson Quinn; 04.02.2017
comment
Это странно: он работает с ioslides Rmd, но не с Rmd to word или html. Для последних двух я получаю ошибки: pandoc: Не удалось получить ~ / Google Drive / SI / DataScience / UAC_JRI / output / Master_Report / SI_logo.png ~ / Google Drive / SI / DataScience / UAC_JRI / output / Master_Report / SI_logo.png : openBinaryFile: не существует (нет такого файла или каталога) - person jzadra; 23.06.2017
comment
@jzadra Создайте новый вопрос с воспроизводимым кодом для вашей проблемы. На данный момент я не могу воспроизвести вашу проблему (дословно скопировал второй фрагмент кода в файл RMD и привязал к HTML и Word). - person CL.; 23.06.2017
comment
stackoverflow.com/questions/44728551/ - person jzadra; 23.06.2017

Не обновленный ответ: в knitr 1.17 вы можете просто использовать

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

изменить согласно комментарию @jsb

Обратите внимание, что это работает только без пробелов, например. {width = 250px}, а не {width = 250px}

person InspectorSands    schedule 29.08.2017
comment
Я пробовал это в knitr 1.16, и при использовании ioslides это не сработало. Была ли эта функция удалена или это проблема ioslides? - person Dr. Mike; 03.09.2017
comment
У меня тоже не работает, на последней версии всех пакетов. - person slhck; 29.09.2017
comment
У меня работает knitr 1.17. Убедитесь, что вы пишете без пробелов, например {width=250px} не {width = 250px}. - person Samuel; 19.02.2018
comment
Работает для меня, самое простое решение на сегодняшний день. - person warship; 28.03.2018
comment
Это не сработает для меня, если я использую xaringan с knitr_1.21. - person Lyngbakr; 31.01.2019
comment
На ioslides это еще не работает, используя knitr_1.21 - person André Costa; 11.02.2019
comment
Для высоты И ширины {height=640px width=480px} - пробел между ними, а не запятая или что-то еще. - person dsz; 08.05.2020
comment
в процентах, например {width=100%} тоже работает! - person giocomai; 26.05.2020

Вот несколько параметров, позволяющих сохранить самодостаточность файла без ретастеринга изображения:

Оберните изображение в теги 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 для этого второго варианта.

person Nick Kennedy    schedule 27.06.2015
comment
это хорошее решение, но его можно использовать только с выводом html! Другой выход будет игнорировать настройку - person xhudik; 23.02.2016
comment
Решение <div> ... </div> кажется очень простым. Какая настройка style позволяет масштабировать изображение до фиксированного процента с сохранением соотношения сторон? - person user101089; 19.09.2017
comment
Попробуйте использовать% вместо px. - person Nick Kennedy; 19.09.2017

Если вы конвертируете в HTML, вы можете установить размер изображения с помощью синтаксиса HTML, используя:

  <img src="path/to/image" height="400px" width="300px" />

или любую высоту и ширину, которые вы хотели бы дать.

person Shruti Kapoor    schedule 28.03.2013
comment
Проблема с этим решением заключается в том, что изображение больше не распознается как внешний ресурс процессом преобразования Rmd, поэтому оно не будет включено в автономную версию обработанного HTML. - person fabians; 29.09.2014

Была такая же проблема сегодня, и я нашел другой вариант с knitr 1.16 при вязании в PDF (для чего требуется, чтобы у вас был установлен 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.

person Taylor Pellerin    schedule 08.12.2017
comment
это не совсем то же самое, что и мой ответ выше? - person InspectorSands; 29.03.2018
comment
@hermestrismegistus почти, но я использую процент ширины, а не ширину в пикселях. Я нашел эту опцию полезной, потому что в моем конкретном случае я помещал несколько изображений бок о бок, что вело себя лучше, чем когда я давал точную ширину - person Taylor Pellerin; 30.03.2018

Другой вариант, который сработал для меня, - это играть с параметром dpi knitr::include_graphics() следующим образом:

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

... что, конечно (если вы не выполняете математику), является методом проб и ошибок по сравнению с определением размеров в чанке, но, возможно, это кому-то поможет.

person Jan Alleman    schedule 20.04.2018

Решение knitr :: include_graphics хорошо работало для изменения размера фигур, но я не мог понять, как использовать его для создания фигур с измененными размерами бок о бок. Я нашел этот пост полезным для этого.

person S.M.    schedule 16.10.2016