¿Cómo establecer el tamaño de la imagen local usando knitr para markdown?

149

Tengo una imagen local que me gustaría incluir en un .Rmdarchivo que luego knitconvertiré en diapositivas HTML Pandoc. Según esta publicación , esto insertará la imagen local:
![Image Title](path/to/your/image)

¿Hay alguna forma de modificar este código para establecer también el tamaño de la imagen?

Adam Smith
fuente
55
Para un control más fino sobre los tamaños, puede terminar teniendo que usar una etiqueta img HTML
Marius
55
el segundo comentario de @Marius : daringfireball.net/projects/markdown/syntax dice "Al momento de escribir esto, Markdown no tiene sintaxis para especificar las dimensiones de una imagen; si esto es importante para usted, simplemente puede usar etiquetas HTML normales <img> ".
Ben Bolker
12
El problema con las etiquetas HTML es que el proceso de conversión Rmd ya no reconoce la imagen como un recurso externo, por lo que no se incluirá en una versión independiente del HTML representado.
fabians

Respuestas:

101

También puede leer la imagen usando el pngpaquete, por ejemplo, y trazarla como una trama normal usando grid.rasterel gridpaquete.

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

Con este método, tiene control total del tamaño de su imagen.

estudio
fuente
Gracias, esto funciona usando slidy. (No funciona tan bien con dzslides, pero no creo que sea un problema con la solución provista).
Adam Smith
1
Se requieren citas alrededor de filepath img <- readPNG("path/to/your/image")pero no pude editar la solución.
Adam Smith
1
@ AdamSmith Acabo de copiar path/to/your/imagetu pregunta. Sí, el nombre de la ruta es una cadena, y necesita comillas para definir una cadena. Espero estar claro.
Agstudy
1
Al ejecutar esto en RStudio, creará un gran margen para el png renderizado.
Paulo E. Cardoso
19
Futuros lectores: esta respuesta está desactualizada .
CL.
190

La pregunta es antigua, pero aún recibe mucha atención. Como las respuestas existentes están desactualizadas, aquí hay una solución más actualizada:

Cambiar el tamaño de las imágenes locales

A partir de knitr1.12 , existe la función include_graphics. De ?include_graphics(énfasis mío):

La principal ventaja de usar esta función es que es portátil en el sentido de que funciona para todos los formatos de documentos knitrcompatibles, por lo que no necesita pensar si tiene que usar, por ejemplo, la sintaxis de LaTeX o Markdown, para incrustar un externo imagen. Las opciones de fragmentos relacionadas con la salida de gráficos que funcionan para trazados R normales también funcionan para estas imágenes, como out.widthy out.height.

Ejemplo:

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

Ventajas:


Incluyendo imágenes generadas

Para componer la ruta a un gráfico que se genera en un fragmento (pero no incluido), las opciones de fragmento opts_current$get("fig.path")(ruta al directorio de figuras) así como opts_current$get("label")(etiqueta del fragmento actual) pueden ser útiles. El siguiente ejemplo utiliza fig.pathpara incluir la segunda de dos imágenes que se generaron (pero no se muestran) en el primer fragmento:

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

El patrón general de las rutas de la figura es [fig.path]/[chunklabel]-[i].[ext], donde chunklabelestá la etiqueta del fragmento donde se ha generado iel gráfico , es el índice del gráfico (dentro de este fragmento) y extes la extensión del archivo (por defecto pngen los documentos de RMarkdown).

CL.
fuente
18
Para la salida en pdf, tendrá que especificar unidades para las dimensiones de la figura, por ejemplo out.width='100pt', de lo contrario, el látex arrojará un error sobre la unidad de medida ilegal.
andybega
44
También funciona para la salida de MS Word, pero out.width y out.height no funcionan
Ben
@andybega Gracias por tu comentario; Lo incorporé a la respuesta.
CL.
2
probablemente quierasr, echo=FALSE, ...
Jameson Quinn
1
@jzadra Cree una nueva pregunta con código reproducible para su problema. Por el momento no puedo reproducir su problema (copié el segundo fragmento de código literalmente en un archivo RMD y lo uní a HTML y Word).
CL.
112

Una respuesta actualizada: knitr 1.17simplemente puedes usar

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

editar según el comentario de @jsb

Tenga en cuenta que esto funciona solo sin espacios, por ejemplo, {ancho = 250 px} no {ancho = 250 px}

InspectorArenas
fuente
66
Intenté esto en knitr 1.16 y no funcionó al usar ioslides. ¿Se ha eliminado esta característica o es un problema de ioslides?
Dr. Mike
2
Tampoco funciona para mí, en la última versión de todos los paquetes.
slhck
3
Funciona para mí usando knitr 1.17. Asegúrese de escribir sin espacios, por ejemplo, {width=250px}no {width = 250px}.
jsb
2
Funciona para mí, la solución más fácil con diferencia.
buque de guerra
Esto no funcionaría para mí usar xaringancon knitr_1.21.
Lyngbakr
37

Aquí hay algunas opciones que mantienen el archivo autocontenido sin modificar la imagen:

Envuelva la imagen en divetiquetas

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

Usa una hoja de estilo

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

Si tiene más de una imagen, es posible que deba usar el pseudo-selector nth-child para esta segunda opción.

Nick Kennedy
fuente
1
¡esta es una buena solución, pero solo se puede usar con salida html! La otra salida ignorará la configuración
xhudik
La <div> ... </div>solución parece muy simple. ¿Cuál es la styleconfiguración para reescalar una imagen a un porcentaje fijo, manteniendo la relación de aspecto?
user101089
Intenta usar% en lugar de px.
Nick Kennedy el
20

Si está convirtiendo a HTML, puede establecer el tamaño de la imagen usando la sintaxis HTML usando:

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

o cualquier altura y ancho que quieras dar.

Shruti Kapoor
fuente
66
El problema con esta solución es que el proceso de conversión Rmd ya no reconoce la imagen como un recurso externo, por lo que no se incluirá en una versión independiente del HTML renderizado.
fabians
8

Tuve el mismo problema hoy y encontré otra opción knitr 1.16al tejer en PDF (que requiere que tenga instalado Pandoc):

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

Este método puede requerir que haga un poco de prueba y error para encontrar el tamaño que funcione para usted. Es especialmente conveniente porque hace que poner dos imágenes una al lado de la otra sea un proceso más bonito. Por ejemplo:

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

Puede ser creativo y apilar un par de estos uno al lado del otro y dimensionarlos como mejor le parezca. Consulte https://rpubs.com/RatherBit/90926 para obtener más ideas y ejemplos.

Taylor Pellerin
fuente
2
¿No es esto exactamente lo mismo que mi respuesta anterior?
InspectorSands
2
@hermestrismegistus casi, pero estoy usando el porcentaje de ancho en lugar del ancho de píxel. Encontré esta opción útil porque en mi caso particular ponía varias imágenes una al lado de la otra, lo que se comportó mejor de esta manera que cuando di el ancho exacto
Taylor Pellerin el
5

Otra opción que funcionó para mí es jugar con la opción dpi de knitr::include_graphics()esta manera:

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

... que seguro (a menos que hagas los cálculos) es prueba y error en comparación con la definición de dimensiones en el fragmento, pero tal vez ayude a alguien.

Jan Alleman
fuente
4

La solución knitr :: include_graphics funcionó bien para cambiar el tamaño de las figuras, pero no pude descubrir cómo usarla para producir figuras redimensionadas lado a lado. Encontré esta publicación útil para hacerlo.

SM
fuente