Come impostare le dimensioni per l'immagine locale usando knitr per il markdown?


150

Ho un'immagine locale che vorrei includere in un .Rmdfile che poi knitconvertirò in diapositive HTML Pandoc. Per questo post , questo inserirà l'immagine locale:
![Image Title](path/to/your/image)

C'è un modo per modificare questo codice per impostare anche la dimensione dell'immagine?


5
Per un controllo più preciso delle dimensioni, potresti dover utilizzare un tag img HTML
Marius

5
secondo il commento di Marius: daringfireball.net/projects/markdown/syntax dice "Al momento della stesura di questo articolo, Markdown non ha sintassi per specificare le dimensioni di un'immagine; se questo è importante per te, puoi semplicemente usare tag HTML <img> normali ".
Ben Bolker,

12
il problema utilizzando i tag HTML è che l'immagine non è più riconosciuta come risorsa esterna dal processo di conversione Rmd, quindi non verrà inclusa in una versione autonoma dell'HTML renderizzato.
fabians,

Risposte:


101

Puoi anche leggere l'immagine usando il pngpacchetto per esempio e tracciarla come una trama normale usando grid.rasterdal gridpacchetto.

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

Con questo metodo hai il pieno controllo della dimensione della tua immagine.


Grazie, questo funziona usando slidy. (Non funziona altrettanto bene con dzslides, ma non credo sia un problema con la soluzione fornita).
Adam Smith,

1
Le citazioni intorno al percorso del file sono richieste img <- readPNG("path/to/your/image")ma non sono stato in grado di modificare la soluzione.
Adam Smith,

1
@AdamSmith Ti ho appena copiato path/to/your/imagedalla tua domanda. Sì, il nome del percorso è una stringa e sono necessarie le virgolette per definire una stringa. Spero di essere chiaro.
agstudy,

1
Eseguendo questo in RStudio, creerai un enorme margine per il png renderizzato.
Paulo E. Cardoso,

19
Lettori futuri: questa risposta è obsoleta .
CL.

190

La domanda è vecchia, ma riceve ancora molta attenzione. Poiché le risposte esistenti sono obsolete, ecco una soluzione più aggiornata:

Ridimensionamento delle immagini locali

A partire da knitr1.12 , c'è la funzione include_graphics. Da ?include_graphics(enfasi mia):

Il vantaggio principale dell'utilizzo di questa funzione è che è portatile nel senso che funziona per tutti i formati di documento che knitrsupporta, quindi non è necessario pensare se è necessario utilizzare, ad esempio, la sintassi LaTeX o Markdown, per incorporare un esterno Immagine. Le opzioni di blocco relative all'output grafico che funzionano per i normali grafici R funzionano anche per queste immagini, come out.widthe out.height.

Esempio:

```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png")
```

vantaggi:

  • Oltre la risposta di agastudy : non sono necessarie librerie esterne o rielaborare l'immagine.
  • Sulla risposta di Shruti Kapoor : Non è necessario scrivere manualmente HTML. Inoltre, l'immagine è inclusa nella versione autonoma del file.

Incluse immagini generate

Per comporre il percorso di un grafico generato in un blocco (ma non incluso), possono essere utili le opzioni di blocco opts_current$get("fig.path")(percorso alla directory della figura) e opts_current$get("label")(etichetta del blocco corrente). L'esempio seguente usa fig.pathper includere la seconda di due immagini che sono state generate (ma non visualizzate) nel primo blocco:

```{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")))
```

Lo schema generale dei percorsi delle figure è [fig.path]/[chunklabel]-[i].[ext], dove si chunklabeltrova l'etichetta del blocco in cui è stato generato iil diagramma , è l'indice del diagramma (all'interno di questo blocco) ed extè l'estensione del file (per impostazione predefinita pngnei documenti RMarkdown).


18
Per l'output pdf, dovrai specificare le unità per le dimensioni della figura, ad esempio out.width='100pt', altrimenti il ​​lattice genererà un errore sull'unità di misura illegale.
Andybega,

4
Funziona anche per l'output di MS Word, ma out.width e out.height non funzionano
Ben

@andybega Grazie per il tuo commento; L'ho incorporato nella risposta.
CL.

2
probabilmente vorrair, echo=FALSE, ...
Jameson Quinn,

1
@jzadra Crea una nuova domanda con codice riproducibile per il tuo problema. Al momento non riesco a riprodurre il problema (copiato il secondo frammento di codice alla lettera in un file RMD e lavorato a maglia in HTML e Word).
CL.

112

Risposta non aggiornata: knitr 1.17puoi semplicemente usare

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

modifica come da commento da @jsb

Nota che funziona solo senza spazi, ad es. {Larghezza = 250px} non {larghezza = 250px}


6
Ho provato questo in Knitr 1.16 e non ha funzionato quando ho usato ioslides. Questa funzione è stata quindi rimossa o è un problema di ioslides?
Dr. Mike

2
Non funziona neanche per me, sull'ultima versione di tutti i pacchetti.
slhck,

3
Funziona per me usando Knitr 1.17. Assicurati di scrivere senza spazi, ad esempio {width=250px}no {width = 250px}.
jsb

2
Funziona per me, la soluzione più semplice in assoluto.
nave da guerra

Questo non avrebbe funzionato per me usando xaringancon knitr_1.21.
Lyngbakr,

37

Ecco alcune opzioni che mantengono il file indipendente senza rielaborare l'immagine:

Avvolgi l'immagine nei divtag

<div style="width:300px; height:200px">
![Image](path/to/image)
</div>

Usa un foglio di stile

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;
}

Se si dispone di più di un'immagine, potrebbe essere necessario utilizzare lo pseudo-selettore nth-child per questa seconda opzione.


1
questa è una buona soluzione ma può essere utilizzata solo con output HTML! L'altra uscita ignorerà l'impostazione
xhudik

La <div> ... </div>soluzione sembra molto semplice. Qual è l' styleimpostazione per ridimensionare un'immagine a una percentuale fissa, mantenendo le proporzioni?
user101089

Prova a utilizzare% anziché px.
Nick Kennedy,

20

Se stai convertendo in HTML, puoi impostare la dimensione dell'immagine usando la sintassi HTML usando:

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

o qualunque altezza e larghezza tu voglia dare.


6
il problema con questa soluzione è che l'immagine non è più riconosciuta come risorsa esterna dal processo di conversione di Rmd, quindi non verrà inclusa in una versione autonoma dell'HTML renderizzato.
fabians,

8

Ho avuto lo stesso problema oggi e knitr 1.16ho trovato un'altra opzione con quando si lavora a maglia in PDF (che richiede che tu abbia installato pandoc):

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

Questo metodo potrebbe richiedere un po 'di tentativi ed errori per trovare la dimensione adatta a te. È particolarmente conveniente perché rende due immagini affiancate un processo più bello. Per esempio:

![Image 1](path/to/image1){width=70%}![Image 2](path/to/image2){width=30%}

Puoi essere creativo e impilare un paio di questi fianco a fianco e ridimensionarli come meglio credi. Vedi https://rpubs.com/RatherBit/90926 per ulteriori idee ed esempi.


2
non è esattamente la stessa della mia risposta sopra?
InspectorSands

2
@hermestrismegistus quasi, ma sto usando la percentuale di larghezza anziché la larghezza dei pixel. Ho trovato questa opzione utile perché nel mio caso particolare stavo affiancando più immagini, che si sono comportate meglio in questo modo rispetto a quando ho dato la larghezza esatta
Taylor Pellerin

5

Un'altra opzione che ha funzionato per me è giocare con l'opzione dpi in knitr::include_graphics()questo modo:

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

... che sicuramente (a meno che tu non faccia la matematica) è prova ed errore rispetto alla definizione delle dimensioni nel blocco, ma forse aiuterà qualcuno.


4

La soluzione knitr :: include_graphics ha funzionato bene per ridimensionare le figure, ma non sono riuscito a capire come usarlo per produrre figure ridimensionate fianco a fianco. Ho trovato questo post utile per farlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.