使用 sparkline 绘制迷你图

最近有小伙伴问到了这样的一幅图:

图表

这幅图在 R 语言中可以使用 sparkline 包绘制,今天就让我们来一起学习下这个包的用法。

基础用法

sparkline() 可以绘制线图、箱线图、柱形图、三态图、离散图、子弹图和饼图共其中图表:

library(sparkline)
x <- rnorm(10)
y <- rnorm(10)

sparkline(x)
图表
# 柱形图
sparkline(x, type = "bar")
图表
# 箱线图
sparkline(x, type = "box")
图表
# 三态图(仅仅表示正负零的状态)
sparkline(x, type = "tristate")
图表
# 离散图
sparkline(x, type = "discrete")
图表
# 子弹图
# Target -> 1
# Performance -> 2
# Range -> 3
sparkline(c(1, 2, 3), type = "bullet")
图表
# 饼图
sparkline(c(1, 2, 3), type = "pie")
图表

除了共同参数外,每一种图表都有着不同的参数。具体可以参考这里:http://omnipotent.net/jquery.sparkline/#common

例如对于饼图,可以使用如下参数设置样式:

sparkline(c(1, 2, 3), type = "pie",
sliceColors = c("red", "blue", "green"),
offset = 50,
borderWidth = 5,
borderColor = "black")
图表

和 formattable 一起使用

如果仅仅是绘制这种简单的图表,那么 sparkline 的用处就不大了。sparkline 可以和其他包组合起来使用构建复杂的图表,例如 formattable:

library(sparkline)
library(formattable)
tibble(
id = c("a", "b"),
sparkline = c(
spk_chr(runif(10, 0, 10), type = "bar"),
spk_chr(runif(10, 0, 5), type = "bar")
)
) %>%
formattable() %>%
as.htmlwidget() -> fw
spk_add_deps(fw)
图表

多个 sparkline 组建也可以组合起来使用:

sl1 <- sparkline(
c(5, 4, 5, -2, 0, 3),
type = "bar",
barColor = "#aaf",
chartRangeMin = -5,
chartRangeMax = 10,
elementId = "sparkline-for-composite"
)
sl2 <- sparkline(
c(4, 1, 5, 7, 9, 9, 8, 7, 6, 6, 4, 7,
8, 4, 3, 2, 2, 5, 6, 7),
type = "line",
fillColor = FALSE,
lineColor = "red",
chartRangeMin = -5,
chartRangeMax = 10
)
spk_composite(sl1, sl2)

也可以使用向量值和选项作为一个组分:

spk_composite(
sl1,
values = c(4, 1, 5, 7, 9, 9, 8, 7, 6, 6, 4, 7, 8, 4, 3, 2, 2, 5, 6, 7),
options = list(
type = "line",
fillColor = FALSE,
lineColor = "red",
chartRangeMin = -5,
chartRangeMax = 10
)
)
图表

也可以组合图表,然后设置选项:

spk_composite(
sl1,
sl2,
options = list(
type = "box"
)
)
图表

在 RMarkdown 中使用

在 RMarkdown 中也可以使用。例如下面的案例绘图展示了截止到 2020 年 4 月中国各城市的新冠疫情状况:

library(tidyverse)
library(formattable)
haven::read_dta("china-covid19.dta") %>%
arrange(provcode, prov, citycode, city, date) %>%
nest(data = c(date, confirmed, recovered, deaths)) -> df

df %>%
slice(1:20) %>%
rename(省代码 = provcode,
省份 = prov,
市代码 = citycode,
市 = city) %>%
mutate(
确诊人数 = map_chr(data, function(x){
spk_chr(x$confirmed)
}),
治愈人数 = map_chr(data, function(x){
spk_chr(x$recovered)
}),
病死人数 = map_chr(data, function(x){
spk_chr(x$deaths)
})
) %>%
select(-data) %>%
formattable() %>%
as.datatable(
options = list(
fnDrawCallback = htmlwidgets::JS(
'function(){HTMLWidgets.staticRender();}'
)
)
) %>%
spk_add_deps()
图表

这里面用了

options = list(
fnDrawCallback = htmlwidgets::JS(
'function(){HTMLWidgets.staticRender();}'
)
)

的设置。在单独的图表绘制中并不需要这个,但是如果在 RMarkdown 中插入了多个含 sparkline 的图表,表格中的 sparkline 会无法渲染,添加这个 options 设置就可以渲染了。

点击这里跳转到 RStata 短书平台获取附件:使用 sparkline 绘制迷你图

评论