Comment définir la taille de l'image locale à l'aide de knitr pour le démarquage?

150

J'ai une image locale que je voudrais inclure dans un .Rmdfichier que je vais ensuite knitconvertir en diapositives HTML avec Pandoc. Selon cet article , cela insérera l'image locale:
![Image Title](path/to/your/image)

Existe-t-il un moyen de modifier ce code pour définir également la taille de l'image?

Adam Smith
la source
5
Pour un contrôle plus fin sur les tailles, vous pourriez devoir utiliser une balise HTML img
Marius
5
second commentaire de @ Marius: daringfireball.net/projects/markdown/syntax dit: "Au moment d'écrire ces lignes , Markdown n'a pas de syntaxe pour spécifier les dimensions d'une image; si cela est important pour vous, vous pouvez simplement utiliser des balises HTML <img> régulières . "
Ben Bolker
12
le problème avec les balises HTML est que l'image n'est plus reconnue comme une ressource externe par le processus de conversion Rmd, elle ne sera donc pas incluse dans une version autonome du HTML rendu.
fabians

Réponses:

101

Vous pouvez également lire l'image en utilisant pngpackage par exemple et la tracer comme un tracé normal en utilisant à grid.rasterpartir du gridpackage.

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

Avec cette méthode, vous avez un contrôle total sur la taille de votre image.

étude
la source
Merci, cela fonctionne en utilisant slidy. (Ne fonctionne pas aussi bien avec dzslides, mais je ne pense pas que ce soit un problème avec la solution fournie).
Adam Smith
1
Des citations autour du chemin de fichier sont requises dans img <- readPNG("path/to/your/image")mais je n'ai pas pu modifier la solution.
Adam Smith
1
@AdamSmith Je viens de copier votre path/to/your/imagede votre question. Oui, le nom du chemin est une chaîne, et vous avez besoin de guillemets pour définir une chaîne. J'espère que je suis clair.
agstudy
1
En exécutant ceci sous RStudio, vous créerez une énorme marge sur le png rendu.
Paulo E. Cardoso le
19
Futurs lecteurs: Cette réponse est dépassée .
CL.
190

La question est ancienne, mais reçoit encore beaucoup d'attention. Les réponses existantes étant obsolètes, voici une solution plus à jour:

Redimensionner les images locales

À partir de knitr1.12 , il y a la fonction include_graphics. De ?include_graphics(c'est moi qui souligne):

Le principal avantage de l'utilisation de cette fonction est qu'elle est portable dans le sens où elle fonctionne pour tous les formats de document pris en knitrcharge, vous n'avez donc pas besoin de vous demander si vous devez utiliser, par exemple, la syntaxe LaTeX ou Markdown, pour incorporer une image. Les options de bloc liées à la sortie graphique qui fonctionnent pour les tracés R normaux fonctionnent également pour ces images, telles que out.widthet out.height.

Exemple:

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

Avantages:


Y compris les images générées

Pour composer le chemin vers un tracé généré dans un morceau (mais non inclus), les options de morceau opts_current$get("fig.path")(chemin vers le répertoire de la figure) ainsi que opts_current$get("label")(étiquette du morceau actuel) peuvent être utiles. L'exemple suivant utilise fig.pathpour inclure la deuxième des deux images qui ont été générées (mais non affichées) dans le premier bloc:

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

Le modèle général des chemins de figure est [fig.path]/[chunklabel]-[i].[ext], où chunklabelest l'étiquette du morceau où le tracé a été généré, iest l'index du tracé (dans ce morceau) et extest l'extension de fichier (par défaut pngdans les documents RMarkdown).

CL.
la source
18
Pour la sortie PDF, vous devrez spécifier des unités pour les dimensions de la figure, par exemple out.width='100pt', sinon latex générera une erreur sur l'unité de mesure illégale.
andybega
4
Fonctionne également pour la sortie MS Word, mais les out.width et out.height ne fonctionnent pas
Ben
@andybega Merci pour votre commentaire; Je l'ai incorporé dans la réponse.
CL.
2
vous voulez probablementr, echo=FALSE, ...
Jameson Quinn
1
@jzadra Veuillez créer une nouvelle question avec un code reproductible pour votre problème. Pour le moment, je ne peux pas reproduire votre problème (copié le deuxième extrait de code textuellement dans un fichier RMD et tricoté en HTML et Word).
CL.
112

Une réponse mise à jour: dans knitr 1.17vous pouvez simplement utiliser

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

modifier selon le commentaire de @jsb

Notez que cela ne fonctionne que sans espaces, par exemple {width = 250px} pas {width = 250px}

InspecteurSables
la source
6
J'ai essayé cela dans knitr 1.16 et cela n'a pas fonctionné lors de l'utilisation d'ioslides. Cette fonctionnalité a-t-elle ensuite été supprimée ou s'agit-il d'un problème ioslides?
Dr Mike
2
Cela ne fonctionne pas non plus pour moi, sur la dernière version de tous les packages.
slhck
3
Fonctionne pour moi en utilisant knitr 1.17. Assurez-vous d'écrire sans espaces, par exemple {width=250px}non {width = 250px}.
jsb
2
Fonctionne pour moi, la solution la plus simple de loin.
navire de guerre
Cela ne fonctionnerait pas pour moi en utilisant xaringanavec knitr_1.21.
Lyngbakr
37

Voici quelques options qui maintiennent le fichier autonome sans retastering de l'image:

Enveloppez l'image dans des divbalises

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

Utiliser une feuille de style

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

Si vous avez plus d'une image, vous devrez peut-être utiliser le pseudo-sélecteur nth-child pour cette deuxième option.

Nick Kennedy
la source
1
c'est une bonne solution mais elle ne peut être utilisée qu'avec une sortie html! L'autre sortie ignorera le paramètre
xhudik
La <div> ... </div>solution semble très simple. Quel est le styleparamètre pour redimensionner une image à un pourcentage fixe, en conservant le rapport hauteur / largeur?
user101089
Essayez d'utiliser% au lieu de px.
Nick Kennedy
20

Si vous effectuez une conversion au format HTML, vous pouvez définir la taille de l'image à l'aide de la syntaxe HTML en utilisant:

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

ou quelle que soit la hauteur et la largeur que vous voudriez donner.

Shruti Kapoor
la source
6
le problème avec cette solution est que l'image n'est plus reconnue comme une ressource externe par le processus de conversion Rmd, donc elle ne sera pas incluse dans une version autonome du HTML rendu.
fabians
8

J'ai eu le même problème aujourd'hui et knitr 1.16j'ai trouvé une autre option lors du tricotage au format PDF (ce qui nécessite l'installation de pandoc):

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

Cette méthode peut nécessiter que vous fassiez quelques essais et erreurs pour trouver la taille qui vous convient. C'est particulièrement pratique car cela rend le processus plus joli de mettre deux images côte à côte. Par exemple:

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

Vous pouvez faire preuve de créativité et empiler quelques-uns de ces éléments côte à côte et les dimensionner comme bon vous semble. Voir https://rpubs.com/RatherBit/90926 pour plus d'idées et d'exemples.

Taylor Pellerin
la source
2
n'est-ce pas exactement la même chose que ma réponse ci-dessus?
InspectorSands
2
@hermestrismegistus presque, mais j'utilise le pourcentage de largeur plutôt que la largeur de pixel. J'ai trouvé cette option utile car dans mon cas particulier, je mettais plusieurs images côte à côte, ce qui se comportait mieux ainsi que lorsque j'ai donné la largeur exacte
Taylor Pellerin
5

Une autre option qui a fonctionné pour moi est de jouer avec l'option dpi knitr::include_graphics()comme ceci:

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

... ce qui est sûr (sauf si vous faites le calcul) est un essai et une erreur par rapport à la définition des dimensions dans le morceau, mais peut-être que cela aidera quelqu'un.

Jan Alleman
la source
4

La solution knitr :: include_graphics a bien fonctionné pour redimensionner les figures, mais je n'ai pas pu comprendre comment l'utiliser pour produire des figures redimensionnées côte à côte. J'ai trouvé cet article utile pour ce faire.

SM
la source