如何在RMarkdown表中嵌入图? [英] How can I embed a plot within a RMarkdown table?
问题描述
我正在尝试在RMarkdown中生成报告模板.在此报告中,我想在所使用的调查中问题的编号和文本旁边的单元格中绘制一个图表.我生成了一些示例图,并在MS Word中制作了以下示例.可以在RMarkdown的表格中放置R生成的图吗?
I am trying to generate a report template in RMarkdown. In this report, I would like a plot in the cell next to the number and text of a question on the survey that I am using. I generated some example plots and made the following example in MS Word. Is it possible to put an R-generated plot in a table in RMarkdown?
代码是什么样的?
编辑(9/8/16):我现在包括.Rmd文件.问题是html文件无法通过以下消息进行编译.
Edit (9/8/16): I am including the .Rmd file as it stands now. The issue is that the html file fails to compile with the following message.
pandoc: Could not fetch Template1_files/figure-html/score_table-1.png
Template1_files/figure-html/score_table-1.png: openBinaryFile: does not exist (No such file or directory)
Error: pandoc document conversion failed with error 67
Execution halted
Template1是文件名,score_table是块标签.
Template1 is the file name, score_table is the chunk label.
有人愿意帮助我诊断问题吗?
Would someone be willing to help me diagnose the problem?
<meta charset="utf-8">
---
title: "Untitled"
author: "Xander"
date: "September 7, 2016"
output: html_document
self_contained: false
---
```{r mychunk, fig.show = "hide", echo = FALSE, fig.height=3, fig.width=5}
library(knitr)
library(ggplot2)
# sample data
dat <- data.frame(text = sapply(1:10, FUN = function(x) { paste0(sample(x = LETTERS, size = 15), collapse = "") }))
score_set = replicate(n = 10, expr = {data.frame(other = c("other", "other", "other", "other"), score=sample(1:7,4,TRUE))},simplify = F)
#Plot Function
plotgen<-function(score_set,other,score){
p <- ggplot(score_set, aes(factor(other), score))
p + geom_violin(fill = "#99CCFF") + coord_flip() + scale_x_discrete(name=NULL) +
scale_y_continuous(breaks = round(seq(1, 7, by = 1),1), limits = c(1,7), name=NULL) + theme(axis.text.y=element_blank(),axis.title.y=element_blank(),axis.ticks.y=element_blank(),
panel.grid.major.y = element_line(colour = "black"),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "white"),
panel.border = element_rect(colour = "black", fill=NA, size=1)) +
geom_hline(yintercept=sample(1:7,1,TRUE), size = 1.5, colour = "#334466")
}
# generate plots
invisible(lapply(seq_along(score_set), FUN = function(x) {plotgen(score_set[[x]],other,score)}))
out <- cbind(row.names(dat),
as.character(dat$text),
sprintf("![](%s%s-%s.png)", opts_current$get("fig.path"), opts_current$get("label"), 1:nrow(dat)))
kable(out, col.names = c("ID", "Text", ""))
````
推荐答案
您可以执行以下操作(对于基本图,对于ggplot2
图,不是 –请参阅底部的注释):
You could do the following (for base plots, not for ggplot2
plots – see comment at the very bottom):
```{r mychunk, fig.show = "hide", echo = FALSE, fig.height=3, fig.width=5}
library(knitr)
# sample data
dat <- data.frame(
text = sapply(1:10, FUN = function(x) { paste0(sample(x = LETTERS, size = 15), collapse = "") }),
x1 = rnorm(10),
x2 = rnorm(10, mean = 3),
x3 = rnorm(10, mean = 5))
# generate plots
invisible(apply(dat[, 2:4], MARGIN = 1, FUN = boxplot))
out <- cbind(row.names(dat),
as.character(dat$text),
sprintf("![](%s%s-%s.png)", opts_current$get("fig.path"), opts_current$get("label"), 1:nrow(dat)))
kable(out, col.names = c("ID", "Text", "Boxplot"))
```
-
apply(dat[, 2:4], MARGIN = 1, FUN = boxplot)
使用来自x1
,x2
和x3
的数据生成箱形图.这些数字是生成的,但由于fig.show="hide"
而未包含在文档中. -
sprintf("![](%s%s-%s.png)", opts_current$get("fig.path"), opts_current$get("label"), 1:nrow(dat))
生成markdown语法以包括绘图.这类似于调用include_graphics
,但具有将降价作为字符向量的优点. - 最后,
kable
生成表. apply(dat[, 2:4], MARGIN = 1, FUN = boxplot)
generates boxplots using the data fromx1
,x2
andx3
. The figures are produced but not included into the document because offig.show="hide"
.sprintf("![](%s%s-%s.png)", opts_current$get("fig.path"), opts_current$get("label"), 1:nrow(dat))
generates the markdown syntax to include the plots. This is similar to callinginclude_graphics
but has the advantage that we get the markdown as character vector.- Finally,
kable
produces the table.
或者,您也可以使用Pandoc的pipe_table
如此处所示手动生成表格,从而提供更大的灵活性.
Alternatively, you could produce the table manually, using Pandoc's pipe_table
as shown here which gives some more flexibility.
上面代码的输出:
Gregor的答案显示了如何将其应用于ggplot2
地块:打印apply
返回的list
>逐个元素,即invisible(apply(...))
变为invisible(lapply(apply(...), print))
.
Gregor's answer here shows how to apply this to ggplot2
plots: Print the list
returned by apply
element by element, i.e. invisible(apply(...))
becomes invisible(lapply(apply(...), print))
.
这篇关于如何在RMarkdown表中嵌入图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!