Як встановити розмір для локального зображення, використовуючи плеєр для розмітки?


149

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

Чи є спосіб змінити цей код, щоб також встановити розмір зображення?


5
Для більш точного контролю над розмірами, можливо, вам доведеться використовувати тег HTML img
Marius

5
Другий коментар @ Маріуса: 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

Не оновлена ​​відповідь: у knitr 1.17вас можна просто використовувати

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

редагувати відповідно до коментаря @jsb

Зверніть увагу, що це працює лише без пробілів, наприклад {width = 250px} not {width = 250px}


6
Я спробував це в плеєрі 1.16, і це не спрацювало при використанні ioslides. Чи було потім цю функцію видалено чи це проблема з ioslides?
Доктор Майк

2
Не працює для мене і в останній версії всіх пакетів.
slhck

3
Для мене працює за допомогою плеєра 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>

Використовуйте таблицю стилів

тест.Рмд

---
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параметр дозволяє змінити масштаб зображення до фіксованого відсотка, підтримуючи співвідношення сторін?
користувач101089

Спробуйте використовувати% замість 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.