首先,加载recharts:

library(recharts)

1 介绍Introduction

适当的标注点让成图更有信息性。我们可以用addMarkPoint (或简写为addMP) 一个系列一系列、一个时间轴切片一个时间轴切片地添加标注点. 也可以用overideMarkPoint (或简写为 overideMP) 覆写已有的标注点。

2 用法Function Call

所有函数名都有小驼峰法和小写连划线(Hadly Wickham推荐此法)两种形式。为了便于偷懒,还有缩写版(如markPoint缩写成mp)。

addMarkPoint(chart, series = NULL, timeslots = NULL, data = NULL,
  clickable = TRUE, symbol = "pin", symbolSize = 10,
  symbolRotate = NULL, large = FALSE, effect = list(show = FALSE),
  itemStyle = NULL, ...)

addMP(chart, series = NULL, timeslots = NULL, data = NULL,
  clickable = TRUE, symbol = "pin", symbolSize = 10,
  symbolRotate = NULL, large = FALSE, effect = list(show = FALSE),
  itemStyle = NULL, ...)

add_markpoint(chart, series = NULL, timeslots = NULL, data = NULL,
  clickable = TRUE, symbol = "pin", symbolSize = 10,
  symbolRotate = NULL, large = FALSE, effect = list(show = FALSE),
  itemStyle = NULL, ...)

add_mp(chart, series = NULL, timeslots = NULL, data = NULL,
  clickable = TRUE, symbol = "pin", symbolSize = 10,
  symbolRotate = NULL, large = FALSE, effect = list(show = FALSE),
  itemStyle = NULL, ...)

addMarkpoint(chart, series = NULL, timeslots = NULL, data = NULL,
  clickable = TRUE, symbol = "pin", symbolSize = 10,
  symbolRotate = NULL, large = FALSE, effect = list(show = FALSE),
  itemStyle = NULL, ...)

overideMarkPoint(chart, ...)

overideMarkpoint(chart, ...)

overideMP(chart, ...)

overide_mp(chart, ...)

overide_markpoint(chart, ...)

overideMP等价于addMP(mode='overide', ...).

参数 要求

chart

echartRechart生成的Echarts对象.

series

数值型(系列索引值)或文本型(系列名称),前者更好。如设为NULL,则作用于所有系列。

timeslots

数值型(时间轴切片索引值)或文本型(时间轴切片名称),前者更好。如设为NULL,则作用于所有时间轴切片。可简写为z.

data

标注点源数据,数据框形式。必须包含下列列: name, 和/或 value / type 和/或 x / xAxis, y / yAxis 和/或 series. 如提供series,必须与addML中的series参数相对应。

  • 通用:
    • 通用格式: [name, value, x, y]列
    • 最小格式: [name, x, y]列
  • 散点图、线图、柱图:
    • 基本格式: [name, value, x, y]列
    • 最小格式: [name, type]列 (type只能是’max’, ‘min’)
    • 映射到坐标轴: [name, value, xAxis, yAxis]列
  • k线图,事件河流图:
    • 基本格式: [name, value, x, y]列
    • 映射到坐标轴: [name, value, xAxis, yAxis]列
  • 地图:
    • [name, value]列. 可以单独通过addGeoCoord传入 [name, lng, lat]列。

注意 标注线数据集兼容于addMarkPoint.

  • x1, x2被视为x (如果检测到的话,接受第一个)
  • y1, y2被视为y (如果检测到的话,接受第一个)
  • xAxis1, xAxis2被视为xAxis (如果检测到的话,接受第一个)
  • yAxis1, yAxis2被视为yAxis (如果检测到的话,接受第一个)

clickable

逻辑型,数据图形是否可以点击,默认为TRUE.

symbol

标注点图标,参见recharts:::validSymbols. 默认为pin.

symbolSize

数值型向量c(height, width)JS函数,定义标注点大小,默认为10.

symbolRotate

数值型 -180 ~ 180. 默认为NULL.

large

数值型, 是否开启大规模效果. 默认为FALSE.

effect

列表,标注点效果配置器。默认为NULL, 即 list(show=FALSE, type='scale', loop=TRUE, period=15, scaleSize=2, bounceDistance=10, color=NULL, shadowColor=NULL, shadowBlur=0)

itemStyle

列表,结构为 list(normal=list(...), emphasis=list(...)). 默认为NULL.

mode

将标注点的data部分’add’ 或 ‘overide’到echarts对象. 默认为’add’. 也可以直接用 overideMarkPoint函数覆写已有的标注点的data部分

省略号

3 举例Showcase

3.1 直角坐标系Cartesian Coordinate System

下例来自Scatterplot Manual.

我们分别向数据系列1 (‘setosa’)和2 (‘versicolor’)添加最大、最小值标注点,在另外添加两个绝对位置标注点。

第三个标注点的数据结构比较特别,是一个数据框,包含这些列:‘name’, ‘value’, ‘xAxis’, ‘yAxis’。这是直角坐标系唯一接受的标注点数据结构。

第四个标注点的数据结构是通用结构,x和y对应画布坐标。然而在直角坐标系中却无法正确显示,只能被放在坐标系的零点。

g = echartr(iris, Sepal.Width, Petal.Width, Species) %>% 
    setToolbox(show=FALSE) %>% setTheme(width=400, height=300)
g = g %>% addMP(series=1, data=data.frame(
    name='Max', type='max'))
g
g = g %>% addMP(series=2, data=data.frame(
        name='Min', type='min')) 
g
g = g %>%  addMP(series=3, data=data.frame(
    name='Misc', value=5, xAxis=3, yAxis=5)) 
g
g = g %>% addMP(series='Not Known', data=data.frame(
    name='Not Known', value=2, x=350, y=300))
g

可以把上述三个标注点的数据框合并为一个,包含这些有效列: ‘name’, ‘type’, ‘series’, 等。其中,’series’必须与series参数对应 (即,数据框的每一行都映射到 addMPseries向量).

data <- data.frame(
    name=c('Max', 'Min', 'Misc', 'Not Known'), type=c('max', 'min', NA, NA),
    series=c(levels(iris$Species), 'Not Known'), x=c(NA, NA, NA, 350),
    y=c(NA, NA, NA, 300), xAxis=c(NA, NA, 3, NA), yAxis=c(NA, NA, 5, NA))
knitr::kable(data)
name type series x y xAxis yAxis
Max max setosa NA NA NA NA
Min min versicolor NA NA NA NA
Misc NA virginica NA NA 3 5
Not Known NA Not Known 350 300 NA NA
echartr(iris, Sepal.Width, Petal.Width, Species) %>%
    addMP(series=c(levels(iris$Species), 'Not Known'), data=data)

3.2 非直角坐标系Non-cartesian Coordinate System

对于非直角坐标系(如极坐标、地理坐标),不要提供映射到坐标轴的数据结构。对于极坐标系,x和y对应于画布坐标,而在地理坐标系里,必须用addGeoCoord传入所涉及的坐标,而不能直接用addMP来传。

注意,画布坐标的零点是左上角。

Pie Chart Manual中的例子。

titanic <- data.table::melt(apply(Titanic, c(1,4), sum))
names(titanic) <- c('Class', 'Survived', 'Count')
g <- echartr(titanic, Survived, Count, facet=Class, type='pie') 
## Warning in split_indices(.group, .n): '.Random.seed' is not an integer
## vector but of type 'NULL', so ignored
data <- data.frame(
    name=rep('', 4), value=1:4, x=c(190, 490, 190, 490), y=c(132, 132, 348, 348)
)
knitr::kable(data)
name value x y
1 190 132
2 490 132
3 190 348
4 490 348
g %>% addMP(series='Series Index', data=data) %>% 
    setSeries(series='Series Index', type='scatter')