在R中向表格输出添加图像

10

我有一个简单的数据结构:案例是国家,每个国家都有几个数字变量。就像这样:

dat <- data.frame(country = c("Belgium", "Germany", "Holland", "Ireland"), Var1 = 1:4, Var2 = 11:14)
print(dat, row.names = FALSE)

 country Var1 Var2
 Belgium    1   11
 Germany    2   12
 Holland    3   13
 Ireland    4   14

表格仍需要进行格式化,标题应该用粗体显示,行应交替着以灰色或白色进行着色。

现在,我想在“国家”和“Var1”之间添加两列。第一列名为“flag”,应包含所属国家的旗帜。第二个新列称为“flagged”,如果国家在某个人权问题上得分非常低,则应该包含红旗图像,如果得分中等则包含橙色旗帜图像,在其他情况下不包含任何图像。

如何在R中创建一个可以打印成这种形式的对象?如何将图像与数据结合在这样的布局中?

(最终这将成为使用knitr创建的一个更大的文档的一部分。)


这个问题的答案取决于最终文档的格式(HTML、PDF、Word等)。 - Thomas
最终的格式将是PDF。 - Peter Verbeet
3个回答

24

如果您正在使用 knitrrmarkdown,那么很简单——只需使用 Markdown 语法 ![]() 来包含图像,例如:

---
title: "Flags"
author: "Yihui Xie"
date: "2014/08/03"
output: html_document
---

```{r results='asis'}
dat <- data.frame(
  country = c('Canada', 'United Kindom'),
  abbr = c('ca', 'gb'),
  var1 = c(1, 2),
  var2 = rnorm(2)
)
dat$flag <- sprintf('![](http://flagpedia.net/data/flags/mini/%s.png)', dat$abbr)
library(knitr)
kable(dat)
```

knitr、表格和标志

如果您需要LaTeX/PDF输出,则必须自行下载这些图像。以下是一个示例:

---
title: "Flags"
author: "Yihui Xie"
date: "2014/08/03"
output: html_document
---

```{r}
dat <- data.frame(
  country = c('Canada', 'United Kindom'),
  abbr = c('ca', 'gb'),
  var1 = c(1, 2),
  var2 = rnorm(2)
)
dat$file <- paste0(dat$abbr, '.png')
dat$link <- paste0('http://flagpedia.net/data/flags/mini/', dat$file)
dat$flag <- sprintf('![](%s)', dat$file)
for (i in seq_len(nrow(dat))) {
  if (!file.exists(dat$file[i])) xfun::download_file(dat$link[i])
}
knitr::kable(dat[, -c(5, 6)])
```

真的很好。我确实刚开始使用knitr来创建这个表格所在的报告。我还没有想出这个解决方案,本来打算开始编写R HTML代码来实现它。但是你的解决方案非常简单明了。采用R HTML方法是否有优势呢? - Peter Verbeet
1
@PeterVerbeet HTML比Word或LaTeX更有趣。如果您查看我在答案中包含的rmarkdown链接,您将意识到R Markdown的输出不一定是HTML。 - Yihui Xie
谢谢,那个可行,我非常感谢你的指导。我能否向kable传递额外的布局选项?我想让顶部行中的文本加粗,并希望交替填充白色和灰色的行。这可能吗? - Peter Verbeet
1
@mavericks,我已经更新了有关PDF输出的答案。您需要下载这些图片。 - Yihui Xie
1
如果您正在使用bookdown,请使用kable(...,format ='pandoc') - Yihui Xie
显示剩余9条评论

3
使用这个实验性的gtable分支,您可以进行以下操作:
require(gtable)

dat <- data.frame(country = c("Belgium", "Germany", "Holland", "Ireland"), Var1 = 1:4, Var2 = 11:14)
g <- gtable_table(dat)

library(png)
# pirate-land flag for illustration
img <- readPNG(system.file("img", "Rlogo.png", package="png"), native = FALSE)
imgRgb <- rgb(img[,,1],img[,,2],img[,,3])
dim(imgRgb)  <- dim(img)[1:2]
flags <- replicate(nrow(g), rasterGrob(imgRgb), simplify = FALSE)
g <- gtable_add_cols(g, unit(1,"cm"), 0)
g <- gtable_add_grob(g, flags, t = seq_len(nrow(g)), l=1, r=1, z=1)

grid.newpage()
grid.draw(g)

这里描述了格式选项

enter image description here


嗨,Baptiste,这是一个有趣的选项。像这样向表格添加格式(例如交替将浅灰色背景添加到行中)肯定很容易。我需要进一步研究这个,谢谢。 - Peter Verbeet

1

有人问如何将输出转换为pdf,这里提供一个使用knitr的答案,并且使用比\includegraphics更合适的方法。

Table with flags

关键是在latex中使用adjustbox包,以下是参数:
  • height(稍后用作R函数get_picture_code的参数)是图片的高度。
  • valign参数(此处默认为valign=m)将根据文本执行垂直调整,
  • margin在此处定义为1ex,围绕图片分隔旗帜。

因此,我们只需使用此功能即可

get_picture_code <- function(path,height,col=NULL)
{
  paste0("\\adjustimage{height=",height,",valign=m,margin*=1ex}{",path,"}")  
} 

获取添加到表格中的图像向量。
最后,我们使用参数sanitize.text.function = identity的xtable来打印TeX代码:
\documentclass{article}
\usepackage{adjustbox}
\begin{document}
<<load_libraries, echo = FALSE, eval = TRUE, results ="hide">>=
library(knitr) 
library(xtable)
@

<<include_images, echo = FALSE, eval = TRUE, results ="hide">>=
get_picture_code <- function(path,height,col=NULL){
  paste0("\\adjustimage{height=",height,",valign=m,margin*=1ex}{",path,"}")  
} 
@

<<test, echo = FALSE, eval = TRUE, results ="hide">>=
dat <- data.frame(country = c("Belgium", "Germany", "Holland", "Ireland"), 
Var1 = 1:4, Var2 = 11:14) 
mypath <- paste0("images/",dat$country,".png")
dat$flag <- get_picture_code(path=mypath,height="0.8cm")
dat$test <-NA
dat$test[2:3] <-get_picture_code(path="images/orange_flag",height="0.6cm")
print(xtable(dat, 
        align = c("l","l","l","l","c","c"),
        caption = "Example with flags"), 
    sanitize.text.function = identity, 
    file="table_with_images.tex")
@

\input{table_with_images.tex}
\end{document}

adjustbox文档包含许多其他选项,包括背景颜色、修剪、水平对齐等,这将使您能够对图像的位置进行精细调整... 此外,在TeX-Latex stackexchange中还有一个很好的使用示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接