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


150

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

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


5
Для более точного управления размерами вам может понадобиться использовать HTML-тег img
Marius

5
second @ Комментарий Мариуса: daringfireball.net/projects/markdown/syntax говорит: «На момент написания этой статьи у Markdown нет синтаксиса для указания размеров изображения; если это важно для вас, вы можете просто использовать обычные HTML-теги <img> «.
Бен Болкер

12
проблема с использованием тегов HTML заключается в том, что изображение больше не распознается как внешний ресурс в процессе преобразования Rmd, поэтому оно не будет включено в автономную версию отображаемого HTML.
Фабианцы

Ответы:


101

Вы также можете прочитать изображение , используя 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)
```

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


Спасибо, это работает с использованием слайдов. (Не работает с dzslides, но я не думаю, что это проблема с предоставленным решением).
Адам Смит

1
Требуются кавычки вокруг пути к файлу, img <- readPNG("path/to/your/image")но я не смог отредактировать решение.
Адам Смит,

1
@AdamSmith Я только что скопировал path/to/your/imageтвой вопрос. Да, имя пути - это строка, и вам нужны кавычки для определения строки. Надеюсь, мне ясно.
agstudy

1
Запустив это в RStudio, вы создадите огромное поле для рендеринга png.
Пауло Э. Кардосо,

19
Будущие читатели: этот ответ устарел .
кл.

190

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

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

По состоянию на knitr1.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).


18
Для вывода в формате PDF вам нужно будет указать единицы измерения для размеров фигуры, например out.width='100pt', в противном случае латекс выдаст ошибку о недопустимой единице измерения.
Andybega

4
Также работает для вывода MS Word, но out.width и out.height не работают
Бен

@andybega Спасибо за ваш комментарий; Я включил это в ответ.
кл.

2
Вы, вероятно, хотитеr, echo=FALSE, ...
Джеймсон Куинн

1
@jzadra Пожалуйста, создайте новый вопрос с воспроизводимым кодом для вашей проблемы. В настоящее время я не могу воспроизвести вашу проблему (скопировал второй фрагмент кода дословно в файл RMD и связал его с HTML и Word).
кл.

112

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

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

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

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


6
Я попробовал это в knitr 1.16, и он не работал при использовании ioslides. Затем эта функция была удалена или это проблема ioslides?
Доктор Майк

2
У меня тоже не работает, на последней версии всех пакетов.
slhck

3
У меня работает с помощью knitr 1.17. Убедитесь, что вы пишете без пробелов, например, {width=250px}нет {width = 250px}.
JSB

2
Работает для меня, самое простое решение на сегодняшний день.
военный корабль

Это не будет работать для меня, используя xaringanс knitr_1.21.
Lyngbakr

37

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

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


1
Это хорошее решение, но оно может использоваться только с выводом html! Другой вывод будет игнорировать настройку
xhudik

<div> ... </div>Решение кажется очень простым. Какова styleнастройка для масштабирования изображения до фиксированного процента, сохраняя соотношение сторон?
user101089

Попробуйте использовать% вместо px.
Ник Кеннеди

20

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

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

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


6
проблема с этим решением состоит в том, что изображение больше не распознается как внешний ресурс процессом преобразования Rmd, поэтому оно не будет включено в автономную версию отображаемого HTML.
Фабианцы

8

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


2
это не совсем то же самое, что мой ответ выше?
InspectorSands

2
@hermestrismegistus почти, но я использую процент ширины, а не ширину пикселя. Я нашел эту опцию полезной, потому что в моем конкретном случае я помещал несколько изображений рядом, что вело себя лучше, чем когда я давал точную ширину
Тейлор Пеллерен

5

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

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

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


4

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.