嵌入表格和图表

如果没有 R 代码块,R Markdown 与普通的 markdown 文档没有什么区别。使用代码块,
代码的输出便可以嵌入到文档中,动态生成最终结果。如果代码块使用的是随机数生成器
而没有设定随机数种子,那么每次渲染文档,都将得到不同的结果。
在默认情况下,代码块的输出直接放在代码下面,以##开头,固定宽度字体,就像代
码在控制台中运行一样。这种输出方式是高效的,但并不总是令人满意,特别是当我们想
以更直观的形式呈现数据时。
1.嵌入表格
在编写报告时,经常需要在内容中放置表格。在 R Markdown 文档中,直接运行一个
data.frame 变量,便可以得到该变量对应的 data.frame 数据内容。举个例子:
toys <- data.frame(
id = 1:3,
name = c("Car", "Plane", "Motocycle"),
price = c(15, 25, 14),
share = c(0.3, 0.1, 0.2),
stringsAsFactors = FALSE
)
500 第 15 章 效率提升
以纯文本格式输出变量,只需在代码块中键入变量名:
toys
## id name price share
## 1 1 Car 15 0.3
## 2 2 Plane 25 0.1
## 3 3 Motocycle 14 0.2
注意,HTML、PDF 和 Word 文档都可以渲染 markdown 的原生表格。想要生成上面这
种形式的表格,可以调用 knitr::kable( ) 生成一种 markdown 版本的表格:
| id|name | price| share|
|--:|:---------|-----:|-----:|
| 1|Car | 15| 0.3|
| 2|Plane | 25| 0.1|
| 3|Motocycle | 14| 0.2|
然后,pandoc 将编辑好的 markdown 文档渲染成其他格式时,就会从 markdown 形式
生成一个常见形式的表格:
knitr::kable(toys)
渲染出来的效果如表 15-1 所示。
表 15-1
id name price share
1 Car 15 0.3
2 Plane 25 0.1
3 Motocycle 14 0.2
还有其他扩展包可以渲染表格,而且具有增强功能。例如,xtable 包不仅可以将
data.frame 转换为 LaTeX,还提供了一些预定义的模板,用于呈现多个统计模型的
结果。
xtable::xtable(lm(mpg ~ cyl + vs, data = mtcars))
在组织上述代码时,如果设置了 results = 'asis'选项,那么,在输出的 PDF 文
档中,线形模型将会呈现为表 15-2 的形式。
表 15-2
Estimate Std.Error t value Pr(>|t|)
(Intercept) 39.6250 4.2246 9.38 0.0000
cy1 −3.0907 0.5581 −5.54 0.0000
vs −0.9391 1.9775 −0.47 0.6384
Microsoft Excel 是著名的数据分析软件。Excel 有一个非常有趣的特性,即条件化格式
操作。为了在 R 中也能实现这样的特性,作者开发了 formattable 扩展包,可以运行
install.packages("formattable")命令安装这个包。它能够使数据框中的单元格格
式显示更多的比较信息:
library(formattable)
formattable(toys,
list(price = color_ _bar("lightpink"), share = percent))
生成的表格如表 15-3 所示。
表 15-3
id name price Share
1 Car 15 30.00%
2 Plane 25 10.00%
3 Motocycle 14 20.00%
有时,数据会有很多行,而将这样的表格嵌入到文档中并不是一个好主意。可喜的是,
JavaScript 库(例如 DataTables)可以比较方便地将大数据集嵌入到网页中,它可以自动执
行分页,也支持搜索和筛选。R Markdown 文档可以渲染成 HTML 网页,自然也可以利用
JavaScript 库。一个名为 DT 的 R 扩展包(http://rstudio.github.io/DT/)可以将 DataTables 连
接到 R 数据框,实现交互式操作。因此,我们可以轻松地将大型数据集放入文档中,以便
读者详细地探索和检查数据:
library(DT)
datatable(mtcars)
生成的表格如表 15-4 所示。

 


表 15-4
formattable 和 DT 扩展包只是众多 HTML 工具(http://www.htmlwidgets.org/)的两
个例子。很多工具都是从流行的 JavaScript 库改编而来,因为社区中已经有很多高质量的
JavaScript 库。
2.嵌入图表
嵌入图表就像前面演示的嵌入表格那样简单。如果一个代码块生成了一幅图,knitr 模
块会将图像保存到文件中,并用代码块中的名字进行命名。如果在代码下面写上[name]
(image-file.png),pandoc 模块在渲染文档时,就会找到图像并将其插入到正确的
位置:
set.seed(123)
x <- rnorm(1000)
y <- 2 * x + rnorm(1000)
m <- lm(y ~ x)
plot(x, y, main = "Linear regression", col = "darkgray")
abline(coef(m))
绘制的图形如图 15-12 所示。图像的默认大小可能不适用于所有情况。我们可以设定
chunk 选项中的 fig.height 和 fig.width 来改变图像的大小。

 


图 15-12
对于图表的创建,除了使用基本的绘图函数和 ggplot2 等扩展
包之外,我们还可以使用DiagrammeR 包。从 CRAN 安装扩展包,
请运行 install.packages(“DiagrammeR”)。
这个包使用 Graphviz(https://en.wikipedia.org/wiki/Graphviz)
描述图的结构和样式。下面的代码生成一个非常简单的有向图,
如图 15-13 所示。
library(DiagrammeR)
grViz("
digraph rmarkdown {
A -> B
B -> C;
C -> A;
}")
DiagrammeR 扩展包也提供了一个更程式化的方式来构建图表。它输出一系列的函数
以对图表执行操作。每个函数获取一个图表,并输出修改后的图表。因此,可以很方便地
使用管道操作进行连接以生成流型图形。想了解这个扩展包的更多细节,请访问以下网
址: http://rich-iannone.github.io/DiagrammeR。
3.嵌入交互图
前面的内容中,我们演示了静态表(knitr::kable、xtable 和 formattable)
和交互表(DT)。类似地,绘图也有静态图和交互图。不仅可以像上一节那样,将静态图
像放在文档中,也可以在查看器或者输出文档中创建动态交互图。

 


图 15-13
事实上,与交互表相比,有更多扩展包是为生成交互图而设计的。并且,大多数扩展
包都是利用现有的 JavaScript 库,使 R 的数据结构能够便于操作。接下来,我们介绍一些
创建交互图最常用的扩展包。
ggvis(http://ggvis.rstudio.com/) 是由 RStudio 开发的一个交互图扩展包,它利用了 Vega
(https://vega.github.io/vega/) 作为其后端支持:
library(ggvis)
mtcars %>%
ggvis(~mpg, ~disp, opacity := 0.6) %>%
layer_ _points(size := input_ _slider(1, 100, value = 50, label = "size"))
%>%
layer_ _smooths(span = input_ _slider(0.5, 1, value = 1, label = "span"))
生成的交互图如图 15-14 所示。

 


图 15-14
注意,这个扩展包的语法有点像 ggplot2,最好与管道操作符配合使用。
还有一个扩展包 dygraphs(https://rstudio.github.io/dygraphs/),它使用同名的
JavaScript
库(http://dygraphs.com/)。这个扩展包专门用于绘制具有交互功能的时间序列数据。
接下来的例子中,我们使用 nycflights13 扩展包提供的机场的气温数据。要绘制
数据中所包含的每个机场每天的温度时间序列图,我们需要计算每天的平均气温代表日度
数据,从而将数据格式由“长表”重塑成“宽表”,并将结果转换为 xts 时间序列对象。这
样,每个机场都对应一个日期索引和温度数据:
library(dygraphs)
library(xts)
library(dplyr)
library(reshape2)
data(weather, package = "nycflights13")
temp <- weather %>%
group_ _by(origin, year, month, day) %>%
summarize(temp = mean(temp)) %>%
ungroup() %>%
mutate(date = as.Date(sprintf("%d-%02d-%02d",
year, month, day))) %>%
select(origin, date, temp) %>%
dcast(date ~ origin, value.var = "temp")
temp_xts <- as.xts(temp[-1], order.by = temp[[1]])
head(temp_xts)
## EWR JFK LGA
## 2013-01-01 38.4800 38.8713 39.23913
## 2013-01-02 28.8350 28.5425 28.72250
## 2013-01-03 29.4575 29.7725 29.70500
## 2013-01-04 33.4775 34.0325 35.26250
## 2013-01-05 36.7325 36.8975 37.73750
## 2013-01-06 37.9700 37.4525 39.70250
接下来,我们对数据 temp_xts 调用函数 dygraph( ),创建一个交互式时间序列图,
该图带有时间范围选择器,且能动态高亮显示:
dygraph(temp_xts, main = "Airport Temperature") %>%
dyRangeSelector() %>%
dyHighlight(highlightCircleSize = 3,
highlightSeriesBackgroundAlpha = 0.3,
hideOnMouseOut = FALSE)
生成的交互图如图 15-15 所示。

 


图 15-15
如果代码在 R 终端运行,浏览器会自动打开包含这个交互图的网页。如果代码
在 RStudio 中运行,该交互图则会在 Viewer 窗格中显示。如果代码是 R Markdown 文档中
的一个代码块,交互图将会嵌入到生成的文档中。
相较于静态图,交互图的主要优点就在于交互性、动态性,允许用户进一步检查和探
索数据,而不是迫使用户只能从一个固定的视角查看数据。
此外,还有一些能够绘制交互式图形的强大且卓越的扩展包。例如,plotly
(https://plot.ly/r/)和 highcharter(http://jkunst.com/highcharter/),它们基于 JavaScript 后
端,用于创建多种多样的交互图。
对于 R Markdown 而言,除了我们前面演示的功能,它还能创建幻灯片、杂志文章、
图书和网站。请浏览官方网站 http://rmarkdown.rstudio.com 了解更多信息。

posted @ 2019-02-11 15:03  NAVYSUMMER  阅读(700)  评论(0编辑  收藏  举报
交流群 编程书籍