Bagaimana mengatur ukuran untuk gambar lokal menggunakan rajutan untuk penurunan harga?

149

Saya memiliki gambar lokal yang ingin saya sertakan dalam .Rmdfile yang kemudian akan saya knitkonversikan ke slide HTML Pandoc. Per posting ini , ini akan memasukkan gambar lokal:
![Image Title](path/to/your/image)

Apakah ada cara untuk mengubah kode ini untuk juga mengatur ukuran gambar?

Adam Smith
sumber
5
Untuk kontrol yang lebih baik atas ukuran, Anda mungkin harus menggunakan tag HTML img
Marius
5
komentar kedua @ Marius: daringfireball.net/projects/markdown/syntax mengatakan "Saat tulisan ini dibuat, Markdown tidak memiliki sintaks untuk menentukan dimensi gambar; jika ini penting bagi Anda, Anda dapat menggunakan tag <img> HTML biasa . "
Ben Bolker
12
masalah menggunakan tag HTML adalah bahwa gambar tidak lagi dikenali sebagai sumber daya eksternal oleh proses konversi Rmd, sehingga gambar tersebut tidak akan disertakan dalam versi mandiri dari HTML yang diberikan.
Fabian

Jawaban:

101

Anda juga dapat membaca gambar menggunakan pngpaket misalnya dan memplotnya seperti plot biasa menggunakan grid.rasterdari gridpaket.

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

Dengan metode ini Anda memiliki kontrol penuh terhadap ukuran gambar Anda.

agstudy
sumber
Terima kasih, ini berfungsi menggunakan slidy. (Tidak berfungsi dengan baik dengan dzslides, tapi saya tidak percaya ini masalah dengan solusi yang disediakan).
Adam Smith
1
Kutipan seputar filepath diperlukan img <- readPNG("path/to/your/image")tetapi saya tidak dapat mengedit solusinya.
Adam Smith
1
@ AdSmithSmith Saya baru saja menyalin path/to/your/imagedari pertanyaan Anda. Ya nama jalur adalah string ,, dan Anda perlu tanda kutip untuk mendefinisikan string. Semoga saya jelas.
agstudy
1
Dengan menjalankan ini di bawah RStudio, Anda akan membuat margin besar untuk png yang diberikan.
Paulo E. Cardoso
19
Pembaca masa depan: Jawaban ini sudah usang .
CL.
190

Pertanyaannya sudah tua, tetapi masih menerima banyak perhatian. Karena jawaban yang ada sudah usang, berikut solusi yang lebih terkini:

Mengubah ukuran gambar lokal

Pada knitr1,12 , ada fungsinya include_graphics. Dari ?include_graphics(beri penekanan pada saya):

Keuntungan utama menggunakan fungsi ini adalah portable dalam arti berfungsi untuk semua format dokumen yang knitrmendukung, jadi Anda tidak perlu berpikir jika Anda harus menggunakan, misalnya, sintaksis LaTeX atau Markdown, untuk menanamkan eksternal gambar. Opsi chunk terkait dengan output grafis yang bekerja untuk plot R normal juga bekerja untuk gambar-gambar ini, seperti out.widthdan out.height.

Contoh:

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

Keuntungan:

  • Atas jawaban agastudy : Tidak perlu untuk perpustakaan eksternal atau untuk rastering ulang gambar.
  • Atas jawaban Shruti Kapoor : Tidak perlu menulis HTML secara manual. Selain itu, gambar termasuk dalam versi file yang lengkap.

Termasuk gambar yang dihasilkan

Untuk menyusun lintasan ke plot yang dihasilkan dalam chunk (tetapi tidak termasuk), opsi chunk opts_current$get("fig.path")(path ke direktori gambar) serta opts_current$get("label")(label chunk saat ini) mungkin berguna. Contoh berikut digunakan fig.pathuntuk memasukkan gambar kedua dari dua yang dihasilkan (tetapi tidak ditampilkan) dalam potongan pertama:

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

Pola umum dari path gambar adalah [fig.path]/[chunklabel]-[i].[ext], di mana chunklabellabel chunk di mana plot telah dihasilkan, iadalah indeks plot (dalam chunk ini) dan extmerupakan ekstensi file (secara default pngdalam dokumen RMarkdown).

CL.
sumber
18
Untuk keluaran pdf, Anda harus menentukan unit untuk dimensi gambar, mis out.width='100pt'. Jika tidak, lateks akan menimbulkan kesalahan tentang satuan ukuran ilegal.
andybega
4
Juga berfungsi untuk output MS Word, tetapi out.width dan out.height tidak berfungsi
Ben
@andybega Terima kasih atas komentar Anda; Saya memasukkannya ke dalam jawaban.
CL.
2
Anda mungkin inginr, echo=FALSE, ...
Jameson Quinn
1
@jzadra Harap buat pertanyaan baru dengan kode yang dapat direproduksi untuk masalah Anda. Saat ini saya tidak dapat mereproduksi masalah Anda (menyalin potongan kode kedua kata demi kata ke file RMD dan dirajut ke HTML dan Word).
CL.
112

Un answer answer: di knitr 1.17dalamnya Anda cukup menggunakan

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

edit sesuai komentar dari @jsb

Perhatikan ini hanya berfungsi tanpa spasi, misalnya {width = 250px} bukan {width = 250px}

Inspektur Pasir
sumber
6
Saya mencoba ini dalam rajutan 1,16 dan tidak berhasil ketika menggunakan ioslides. Apakah fitur ini kemudian dihapus atau itu masalah ioslides?
Dr. Mike
2
Juga tidak berfungsi untuk saya, pada versi terbaru dari semua paket.
slhck
3
Bekerja untuk saya menggunakan rajutan 1,17. Pastikan Anda menulis tanpa spasi, mis . {width=250px}Tidak {width = 250px}.
jsb
2
Bekerja untuk saya, solusi termudah sejauh ini.
kapal perang
Ini tidak akan bekerja untuk saya menggunakan xaringandengan knitr_1.21.
Lyngbakr
37

Berikut adalah beberapa opsi yang menjaga file mandiri tanpa memutar ulang gambar:

Bungkus gambar dalam divtag

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

Gunakan lembar gaya

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

Jika Anda memiliki lebih dari satu gambar, Anda mungkin perlu menggunakan pemilih-anak semu untuk opsi kedua ini.

Nick Kennedy
sumber
1
ini adalah solusi yang bagus tetapi hanya bisa digunakan dengan output html! Output lainnya akan mengabaikan pengaturan
xhudik
The <div> ... </div>solusi tampaknya sangat sederhana. Apa stylepengaturan untuk mengubah skala gambar ke persentase tetap, mempertahankan rasio aspek?
user101089
Coba gunakan% daripada px.
Nick Kennedy
20

Jika Anda mengonversi ke HTML, Anda dapat mengatur ukuran gambar menggunakan sintaks HTML menggunakan:

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

atau tinggi dan lebar apa pun yang ingin Anda berikan.

Shruti Kapoor
sumber
6
masalah dengan solusi ini adalah bahwa gambar tidak lagi dikenali sebagai sumber daya eksternal oleh proses konversi Rmd, jadi itu tidak akan dimasukkan dalam versi yang berdiri sendiri dari HTML yang diberikan.
Fabian
8

Punya masalah yang sama hari ini dan temukan opsi lain knitr 1.16ketika merajut ke PDF (yang mengharuskan Anda menginstal pandoc):

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

Metode ini mungkin mengharuskan Anda melakukan sedikit trial and error untuk menemukan ukuran yang sesuai untuk Anda. Ini sangat nyaman karena membuat menempatkan dua gambar berdampingan menjadi proses yang lebih cantik. Sebagai contoh:

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

Anda dapat menjadi kreatif dan menumpuk beberapa dari sisi-sisi ini dan ukuran mereka sesuai keinginan Anda. Lihat https://rpubs.com/RatherBit/90926 untuk lebih banyak ide dan contoh.

Taylor Pellerin
sumber
2
apakah ini tidak persis sama dengan jawaban saya di atas?
Inspektur
2
@hermestrismegistus hampir, tapi saya menggunakan persen lebar daripada lebar piksel. Saya menemukan opsi ini berguna karena dalam kasus khusus saya, saya meletakkan beberapa gambar berdampingan, yang berperilaku lebih baik dengan cara ini ketika saya memberikan lebar yang tepat
Taylor Pellerin
5

Opsi lain yang berfungsi untuk saya adalah bermain dengan opsi dpi knitr::include_graphics()seperti ini:

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

... yang pasti (kecuali jika Anda menghitungnya) adalah coba-coba dibandingkan dengan menentukan dimensi di chunk, tapi mungkin itu akan membantu seseorang.

Jan Alleman
sumber
4

Solusi knitr :: include_graphics bekerja dengan baik untuk mengubah ukuran angka, tetapi saya tidak dapat menemukan cara menggunakannya untuk menghasilkan gambar yang diubah ukurannya berdampingan. Saya menemukan posting ini bermanfaat untuk melakukannya.

SM
sumber