将图像添加到R中的表格式输出

时间:2014-08-03 16:03:49

标签: r dataframe knitr

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

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

表格需要格式化,标题为粗体,行颜色为灰色或白色,交替显示。

现在,我想要的是在“country”和“Var1”之间添加两个额外的列。第一个新列称为“标志”,应包含国家/地区的标志。第二个新栏目被称为“被标记”,其中包含一个红旗的图像,该国家在特定的人权问题上得分非常糟糕,如果得分平庸则没有其他方面的橙旗。

如何创建在R中以这种方式打印的对象?如何在这种布局中将图像与数据相结合?

(最终这将是使用knitr创建的更大文档的一部分)

3 个答案:

答案 0 :(得分:13)

如果您对rmarkdown package使用 knitr ,则非常简单 - 只需使用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, tables, and flags

答案 1 :(得分:3)

使用this experimental fork of 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)

formatting options described here

enter image description here

答案 2 :(得分:1)

问题是用pdf作为输出,这是一个使用knitr的答案,更合适的东西只是\ includegraphics

Table with flags

诀窍是使用latex中的adjustbox包,使用以下参数:

  • height(后来用作R函数get_picture_code的参数)是图片的高度。
  • valign参数(此处默认为valign = m),将根据文字执行垂直调整,
  • 此处定义为margin的{​​{1}}允许将图片分开。

所以我们只使用这个功能

1ex

获取添加到表格中的图像矢量。

最后我们使用xtable和参数get_picture_code <- function(path,height,col=NULL) { paste0("\\adjustimage{height=",height,",valign=m,margin*=1ex}{",path,"}") } 来打印tex代码:

sanitize.text.function = identity

adjustbox文档包含许多其他选项,包括背景颜色,修剪,水平对齐,这将允许您对图像的位置进行一些非常精细的调整... 在TeX-Latex stackexchange

中使用此包也有一个很好的例子