Wie stelle ich die Größe für ein lokales Bild mit knitr für Markdown ein?

149

Ich habe ein lokales Bild, das ich in eine .RmdDatei aufnehmen möchte, die ich dann knitin HTML-Folien konvertieren werde Pandoc. In diesem Beitrag wird das lokale Bild eingefügt:
![Image Title](path/to/your/image)

Gibt es eine Möglichkeit, diesen Code zu ändern, um auch die Bildgröße festzulegen?

Adam Smith
quelle
5
Für eine genauere Kontrolle über die Größe müssen Sie möglicherweise ein HTML-IMG-Tag verwenden
Marius
5
zweiter @ Marius 'Kommentar: daringfireball.net/projects/markdown/syntax sagt: "Zum jetzigen Zeitpunkt hat Markdown keine Syntax zum Festlegen der Abmessungen eines Bildes. Wenn dies für Sie wichtig ist, können Sie einfach reguläre HTML-Tags <img> verwenden . "
Ben Bolker
12
Das Problem bei der Verwendung von HTML-Tags besteht darin, dass das Bild vom Rmd-Konvertierungsprozess nicht mehr als externe Ressource erkannt wird und daher nicht in einer eigenständigen Version des gerenderten HTML-Codes enthalten ist.
Fabians

Antworten:

101

Sie können das Bild beispielsweise auch mit dem pngPaket lesen und wie ein normales Diagramm mit grid.rasterdem gridPaket zeichnen .

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

Mit dieser Methode haben Sie die volle Kontrolle über die Größe Ihres Bildes.

Agstudy
quelle
Danke, das funktioniert mit Slidy. (Funktioniert nicht so gut mit dzslides, aber ich glaube nicht, dass es ein Problem mit der bereitgestellten Lösung ist).
Adam Smith
1
Anführungszeichen rund um den Dateipfad sind in erforderlich, img <- readPNG("path/to/your/image")aber ich konnte die Lösung nicht bearbeiten.
Adam Smith
1
@AdamSmith Ich habe gerade Ihre path/to/your/imagevon Ihrer Frage kopiert . Ja, der Pfadname ist eine Zeichenfolge, und Sie benötigen Anführungszeichen, um eine Zeichenfolge zu definieren. Hoffe ich bin klar.
Agstudy
1
Wenn Sie dies unter RStudio ausführen, erstellen Sie einen großen Rand für das gerenderte PNG.
Paulo E. Cardoso
19
Zukünftige Leser: Diese Antwort ist veraltet .
CL.
190

Die Frage ist alt, erhält aber immer noch viel Aufmerksamkeit. Da die vorhandenen Antworten veraltet sind, finden Sie hier eine aktuellere Lösung:

Ändern der Größe lokaler Bilder

Ab knitr1.12 gibt es die Funktion include_graphics. Von ?include_graphics(Hervorhebung von mir):

Der Hauptvorteil dieser Funktion besteht darin, dass sie in dem Sinne portabel ist, dass sie für alle unterstützten Dokumentformate funktioniert. knitrSie müssen also nicht überlegen, ob Sie beispielsweise LaTeX- oder Markdown-Syntax verwenden müssen, um eine externe Funktion einzubetten Bild. Chunk-Optionen für die Grafikausgabe, die für normale R-Diagramme funktionieren, funktionieren auch für diese Bilder, z. B. out.widthund out.height.

Beispiel:

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

Vorteile:

  • Über die Antwort von agastudy : Keine Notwendigkeit für externe Bibliotheken oder für ein erneutes Rastering des Bildes.
  • Über Shruti Kapoors Antwort : Keine Notwendigkeit, HTML manuell zu schreiben. Außerdem ist das Bild in der eigenständigen Version der Datei enthalten.

Einschließlich generierter Bilder

Um den Pfad zu einem Plot zu erstellen, der in einem Block generiert wird (aber nicht enthalten ist), können die Blockoptionen opts_current$get("fig.path")(Pfad zum Figurenverzeichnis) sowie opts_current$get("label")(Bezeichnung des aktuellen Blocks) hilfreich sein. Im folgenden Beispiel wird fig.pathdas zweite von zwei Bildern, die generiert (aber nicht angezeigt) wurden, in den ersten Block aufgenommen:

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

Das allgemeine Muster der Figurenpfade lautet [fig.path]/[chunklabel]-[i].[ext]: Wo chunklabelist die Bezeichnung des Blocks, in dem der Plot generiert wurde ? Ist der Plotindex i(innerhalb dieses Blocks) und extdie Dateierweiterung (standardmäßig pngin RMarkdown-Dokumenten).

CL.
quelle
18
Für die PDF-Ausgabe müssen Sie Einheiten für die Abmessungen der Abbildung angeben, z. B. out.width='100pt'gibt Latex einen Fehler bezüglich der unzulässigen Maßeinheit aus.
Andybega
4
Funktioniert auch für die MS Word-Ausgabe, aber die out.width und out.height funktionieren nicht
Ben
@andybega Vielen Dank für Ihren Kommentar; Ich habe es in die Antwort aufgenommen.
CL.
2
Sie wollen wahrscheinlichr, echo=FALSE, ...
Jameson Quinn
1
@jzadra Bitte erstellen Sie eine neue Frage mit reproduzierbarem Code für Ihr Problem. Im Moment kann ich Ihr Problem nicht reproduzieren (habe das zweite Code-Snippet wörtlich in eine RMD-Datei kopiert und in HTML und Word gestrickt).
CL.
112

Un aktualisierte Antwort: in können knitr 1.17Sie einfach verwenden

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

bearbeiten gemäß Kommentar von @jsb

Beachten Sie, dass dies nur ohne Leerzeichen funktioniert, z. B. {width = 250px}, nicht {width = 250px}

InspectorSands
quelle
6
Ich habe dies in knitr 1.16 versucht und es hat bei der Verwendung von ioslides nicht funktioniert. Wurde diese Funktion dann entfernt oder handelt es sich um ein Problem mit ioslides?
Dr. Mike
2
Funktioniert auch bei mir nicht, bei der neuesten Version aller Pakete.
Slhck
3
Funktioniert bei mir mit knitr 1.17. Stellen Sie sicher, dass Sie ohne Leerzeichen schreiben, z . B. {width=250px}nicht {width = 250px}.
jsb
2
Funktioniert für mich, mit Abstand einfachste Lösung.
Kriegsschiff
Dies würde nicht für mich arbeitet mit xaringanmit knitr_1.21.
Lyngbakr
37

Hier sind einige Optionen, mit denen die Datei in sich geschlossen bleibt, ohne das Bild erneut zu erstellen:

Wickeln Sie das Bild in divTags

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

Verwenden Sie ein Stylesheet

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

Wenn Sie mehr als ein Bild haben, müssen Sie möglicherweise den Pseudo-Selektor für das n-te Kind für diese zweite Option verwenden.

Nick Kennedy
quelle
1
Dies ist eine gute Lösung, kann aber nur mit HTML-Ausgabe verwendet werden! Die andere Ausgabe wird die Einstellung ignorieren
xhudik
Die <div> ... </div>Lösung scheint sehr einfach zu sein. Was ist die styleEinstellung, um ein Bild unter Beibehaltung des Seitenverhältnisses auf einen festen Prozentsatz zu skalieren?
user101089
Versuchen Sie es mit% anstelle von px.
Nick Kennedy
20

Wenn Sie in HTML konvertieren, können Sie die Größe des Bildes mithilfe der HTML-Syntax wie folgt festlegen:

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

oder welche Höhe und Breite Sie geben möchten.

Shruti Kapoor
quelle
6
Das Problem bei dieser Lösung besteht darin, dass das Bild vom Rmd-Konvertierungsprozess nicht mehr als externe Ressource erkannt wird und daher nicht in einer eigenständigen Version des gerenderten HTML-Codes enthalten ist.
Fabians
8

Hatte heute das gleiche Problem und fand eine andere Option knitr 1.16beim Stricken zu PDF (was erfordert, dass Sie Pandoc installiert haben):

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

Diese Methode erfordert möglicherweise einige Versuche, um die für Sie geeignete Größe zu ermitteln. Dies ist besonders praktisch, da dadurch das Nebeneinanderstellen von zwei Bildern einfacher wird. Beispielsweise:

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

Sie können kreativ werden und einige davon nebeneinander stapeln und nach Belieben dimensionieren. Weitere Ideen und Beispiele finden Sie unter https://rpubs.com/RatherBit/90926 .

Taylor Pellerin
quelle
2
Ist das nicht genau das Gleiche wie meine Antwort oben?
InspectorSands
2
@hermestrismegistus fast, aber ich verwende Prozent der Breite anstelle der Pixelbreite. Ich fand diese Option nützlich, weil ich in meinem speziellen Fall mehrere Bilder nebeneinander platzierte, was sich besser verhielt als bei der genauen Breite
Taylor Pellerin
5

Eine andere Option, die für mich funktioniert hat, ist das Spielen mit der dpi-Option knitr::include_graphics()wie folgt :

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

... was sicher (es sei denn, Sie rechnen) im Vergleich zum Definieren von Dimensionen im Block Versuch und Irrtum ist, aber vielleicht hilft es jemandem.

Jan Alleman
quelle
4

Die knitr :: include_graphics-Lösung hat sich gut für die Größenänderung der Figuren bewährt, aber ich konnte nicht herausfinden, wie sie verwendet werden kann, um nebeneinander skalierte Figuren zu erstellen. Ich fand diesen Beitrag nützlich dafür.

SM
quelle