วิธีการตั้งค่าขนาดสำหรับภาพในพื้นที่โดยใช้ knitr สำหรับ markdown?


149

ผมมีภาพในท้องถิ่นที่ฉันต้องการที่จะรวมอยู่ใน.Rmdไฟล์ที่ผมจะแล้วknitและแปลงเป็น HTML Pandocสไลด์ด้วย ต่อโพสต์นี้จะแทรกภาพในพื้นที่:
![Image Title](path/to/your/image)

มีวิธีการแก้ไขรหัสนี้เพื่อตั้งขนาดภาพหรือไม่


5
สำหรับการควบคุมขนาดอย่างละเอียดคุณอาจต้องใช้HTML img tag
Marius

5
ความคิดเห็นที่สองของ @ Marius: daringfireball.net/projects/markdown/syntaxกล่าวว่า "ในขณะที่เขียนนี้ Markdown ไม่มีไวยากรณ์สำหรับการระบุขนาดของรูปภาพถ้าสิ่งนี้สำคัญสำหรับคุณคุณสามารถใช้แท็ก <img> HTML ปกติ ."
Ben Bolker

12
ปัญหาในการใช้แท็ก HTML คือภาพไม่ได้รับการยอมรับว่าเป็นทรัพยากรภายนอกโดยกระบวนการแปลง Rmd ดังนั้นจึงไม่รวมอยู่ใน HTML แบบแสดงผลแบบสแตนด์อโลน
fabians

คำตอบ:


101

นอกจากนี้คุณยังสามารถอ่านภาพโดยใช้pngแพคเกจตัวอย่างและพล็อตมันเช่นพล็อตปกติใช้grid.rasterจากgridแพคเกจ

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

ด้วยวิธีนี้คุณสามารถควบคุมขนาดภาพของคุณได้อย่างเต็มที่


ขอบคุณมันใช้งานได้ลื่น (ใช้งานไม่ได้กับ dzslides แต่ฉันไม่เชื่อว่าเป็นปัญหาของโซลูชันที่ให้มา)
Adam Smith

1
ต้องใส่img <- readPNG("path/to/your/image")เครื่องหมายคำพูดรอบไฟล์พา ธแต่ฉันไม่สามารถแก้ไขโซลูชันได้
Adam Smith

1
@ AdamSmith ฉันเพิ่งคัดลอกของคุณpath/to/your/imageจากคำถามของคุณ ใช่ชื่อพา ธ เป็นสตริงและคุณต้องมีเครื่องหมายคำพูดเพื่อกำหนดสตริง หวังว่าฉันชัดเจน
agstudy

1
ด้วยการใช้งานภายใต้ RStudio คุณจะสร้างความแตกต่างอย่างมากสำหรับ png ที่แสดงผล
เปาโลอีคาโดโซ่

19
ผู้อ่านในอนาคต: คำตอบนี้ล้าสมัย
CL

190

คำถามนั้นเก่า แต่ก็ยังได้รับความสนใจเป็นอย่างมาก เนื่องจากคำตอบที่มีอยู่ล้าสมัยนี่เป็นวิธีแก้ปัญหาที่ทันสมัยมากขึ้น:

ปรับขนาดภาพในเครื่อง

ในฐานะของknitr1.12include_graphicsมีฟังก์ชั่น จาก?include_graphics(เน้นที่เหมือง):

ข้อได้เปรียบที่สำคัญของการใช้ฟังก์ชั่นนี้คือมันพกพาได้ในแง่ที่ว่ามันใช้งานได้กับทุกรูปแบบเอกสารที่knitrรองรับดังนั้นคุณไม่จำเป็นต้องคิดว่าคุณต้องใช้ตัวอย่างเช่น LaTeX หรือ Markdown syntax เพื่อฝังภายนอก ภาพ. ตัวเลือกก้อนที่เกี่ยวข้องกับการส่งออกกราฟิกที่ทำงาน R แปลงปกติยังทำงานสำหรับภาพเหล่านี้เช่นและout.widthout.height

ตัวอย่าง:

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

ข้อดี:

  • กว่าคำตอบของ agastudy : ไม่มีความจำเป็นสำหรับห้องสมุดภายนอกหรืออีก rastering ภาพ
  • มากกว่าคำตอบของ Shruti Kapoor : ไม่จำเป็นต้องเขียน HTML ด้วยตนเอง นอกจากนี้รูปภาพยังรวมอยู่ในไฟล์เวอร์ชั่นที่มีในตัวเอง

รวมถึงภาพที่สร้างขึ้น

ในการเขียนพา ธ ไปยังพล็อตที่สร้างขึ้นใน chunk (แต่ไม่รวม) ตัวเลือก chunk opts_current$get("fig.path")(พา ธ ไปยังไดเร็กตอรี่ไดเรกทอรี) รวมถึงopts_current$get("label")(เลเบลของ chunk ปัจจุบัน) อาจมีประโยชน์ ตัวอย่างต่อไปนี้ใช้fig.pathเพื่อรวมภาพที่สองของสองภาพที่สร้างขึ้น (แต่ไม่แสดง) ในอันแรก:

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

รูปแบบทั่วไปของเส้นทางรูปคือ[fig.path]/[chunklabel]-[i].[ext]โดยที่chunklabelฉลากของชิ้นส่วนที่มีการสร้างiพล็อตคือดัชนีพล็อต (ภายในอันนี้) และextเป็นนามสกุลไฟล์ (โดยค่าเริ่มต้นpngในเอกสาร RMarkdown)


18
สำหรับเอาต์พุต pdf คุณจะต้องระบุหน่วยสำหรับขนาดของตัวเลขเช่นout.width='100pt'มิฉะนั้นยางจะทำให้เกิดข้อผิดพลาดเกี่ยวกับหน่วยวัดที่ผิดกฎหมาย
andybega

4
นอกจากนี้ยังใช้งานได้กับ MS Word เอาท์พุท แต่ out.width และ out.height ไม่สามารถใช้งานได้
Ben

@andybega ขอบคุณสำหรับความคิดเห็นของคุณ; ฉันรวมมันเป็นคำตอบ
CL

2
คุณอาจต้องการr, echo=FALSE, ...
Jameson Quinn

1
@jzadra โปรดสร้างคำถามใหม่ด้วยรหัสที่ทำซ้ำได้สำหรับปัญหาของคุณ ในขณะนี้ฉันไม่สามารถทำซ้ำปัญหาของคุณได้ (คัดลอกโค้ดคำที่สองคำต่อคำไปยังไฟล์ RMD และถูกถักเป็น HTML และ Word)
CL

112

ยังไม่มีคำตอบที่อัปเดต: knitr 1.17คุณสามารถใช้

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

แก้ไขตามความคิดเห็นจาก @jsb

หมายเหตุทำงานได้โดยไม่มีช่องว่างเช่น {width = 250px} ไม่ใช่ {width = 250px}


6
ฉันลองมันใน knitr 1.16 และมันไม่ทำงานเมื่อใช้ ioslides มีการลบฟีเจอร์นี้หรือไม่หรือเป็นปัญหาของ ioslides?
ดร. ไมค์

2
ไม่ได้ผลสำหรับฉันในแพ็คเกจล่าสุดทั้งหมด
slhck

3
ใช้งานได้สำหรับฉันโดยใช้ knitr 1.17 ตรวจสอบให้แน่ใจว่าคุณเขียนโดยไม่มีช่องว่างเช่นไม่ได้{width=250px} {width = 250px}
jsb

2
ใช้งานได้สำหรับฉันทางออกที่ง่ายที่สุดโดยไกล
เรือรบ

นี้จะไม่ทำงานสำหรับฉันใช้กับxaringan knitr_1.21
Lyngbakr

37

นี่คือตัวเลือกบางอย่างที่ทำให้ไฟล์มีอยู่ในตัวเองโดยไม่ต้องปรับแต่งภาพใหม่:

ตัดภาพในdivแท็ก

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

ใช้สไตล์ชีท

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

หากคุณมีภาพมากกว่าหนึ่งภาพคุณอาจต้องใช้ตัวเลือกหลอกสำหรับเด็กตัวเลือกที่สองสำหรับตัวเลือกที่สองนี้


1
นี่เป็นทางออกที่ดี แต่สามารถใช้กับเอาต์พุต html เท่านั้น! เอาต์พุตอื่นจะไม่สนใจการตั้งค่า
xhudik

การ<div> ... </div>แก้ปัญหาดูเหมือนง่ายมาก การstyleตั้งค่าเพื่อปรับขนาดรูปภาพใหม่เป็นเปอร์เซ็นต์คงที่คือการรักษาอัตราส่วนกว้างยาว?
user101089

ลองใช้% แทน px
Nick Kennedy

20

หากคุณกำลังแปลงเป็น HTML คุณสามารถกำหนดขนาดของภาพโดยใช้ไวยากรณ์ HTML โดยใช้:

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

หรือความสูงและความกว้างใด ๆ ที่คุณต้องการจะให้


6
ปัญหาเกี่ยวกับการแก้ปัญหานี้คือภาพไม่ได้รับการยอมรับว่าเป็นทรัพยากรภายนอกโดยกระบวนการแปลง Rmd ดังนั้นมันจะไม่รวมอยู่ใน HTML ที่แสดงผลแบบสแตนด์อโลน
fabians

8

มีปัญหาเดียวกันในวันนี้และพบตัวเลือกอื่นknitr 1.16เมื่อถักเป็น PDF (ซึ่งต้องการให้คุณติดตั้งแพนโดก):

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

วิธีนี้อาจทำให้คุณต้องทดลองใช้และมีข้อผิดพลาดเล็กน้อยเพื่อค้นหาขนาดที่เหมาะกับคุณ มันสะดวกมากเป็นพิเศษเพราะมันทำให้การวางภาพสองภาพเคียงข้างกันเป็นกระบวนการที่สวยกว่า ตัวอย่างเช่น:

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

คุณสามารถสร้างสรรค์และซ้อนสองสามด้านข้างนี้และปรับขนาดตามที่เห็นสมควร ดูhttps://rpubs.com/RatherBit/90926สำหรับแนวคิดและตัวอย่างเพิ่มเติม


2
สิ่งนี้ไม่เหมือนกับคำตอบของฉันด้านบนทั้งหมดหรือไม่
InspectorSands

2
@hermestrismegistus เกือบแล้ว แต่ฉันใช้เปอร์เซ็นต์ความกว้างมากกว่าความกว้างของพิกเซล ฉันพบว่าตัวเลือกนี้มีประโยชน์เพราะในกรณีของฉันฉันวางภาพหลายภาพเคียงข้างกันซึ่งทำให้ดีขึ้นด้วยวิธีนี้เมื่อฉันให้ความกว้างที่แน่นอน
Taylor Pellerin

5

ตัวเลือกอื่นที่ใช้งานได้สำหรับฉันคือเล่นกับตัวเลือก dpi knitr::include_graphics()เช่นนี้:

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

... ซึ่งแน่นอน (เว้นแต่ว่าคุณจะทำคณิตศาสตร์) คือการทดลองและข้อผิดพลาดเมื่อเทียบกับการกำหนดขนาดในกลุ่ม แต่อาจจะช่วยใครสักคน


4

วิธีแก้ปัญหา knitr :: include_graphics ทำงานได้ดีสำหรับการปรับขนาดตัวเลข แต่ฉันไม่สามารถหาวิธีใช้เพื่อสร้างตัวเลขที่ปรับขนาดแบบเคียงข้างกัน ฉันพบว่าโพสต์นี้มีประโยชน์สำหรับการทำเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.