自定义系列:散点图
图表底层基于 ECharts,所以参考 ECharts 官方配置项文档使用即可。
同时,在 ECharts 之上我们对其能力做了扩展,暴露了部分自定义配置项(均以 dv 前缀进行命名,以和 ECharts 配置项做以区分),在这里进行说明。
概念约定
【约定】:dv 开头的配置项称作【自定义配置项】
【约定】:每个气泡整体命名为【图形】,图形中的最小单元形状命名为【图元】
【约定】:data 数组中的单个数据命名为 dataItem
【约定】:dataItem 的 value 中,索引 0,1,2 分别代表 xValue,yValue,rValue
【约定】:dataItem.itemStyle只是dvScatterSeries.dvItemStyle在 data 中的的局部实现,上述俩个部分称作【图元属性】
【约定】:dataItem.itemConfig只是dvScatterSeries.dvItemConfig在 data 中的局部实现,上述俩个部分称作【图形配置项】
自定义散点图适应的问题场景
自定义散点图基本全面覆盖的原有散点图的配置项
且扩展了以下功能
-
支持任意数量、任意形状、任意交互、任意动画的图形组合为一个【气泡】
1.这里的气泡代指代表一个(组)数据渲染的图形如果你对上述描述没有概念,可以查看ECharts 官方示例,该示例通过一个复杂图形,很好的描述了一组数据
2.由于图形数量从一个变为了多个,所以原有的散点图的部分配置项将失效,见附录 4
-
支持个性化配置每个【气泡】中每个图元的样式、动画、交互
-
扩展了自定义配置项以及辅助函数,以满足范式中涉及的功能,比如历史轨迹、临近搜索、轴线范围自适应等
-
重写交互,使其支持 click、hover 俩种交互效果
交互重写
由于 ECharts 交互设计原因,无法满足气泡图应用场景,故在底层重新实现交互依赖的状态变更相关的 Action,Action 相应的 API 和回调都有所更改
如果你不关心或者不用控制图形元素的状态变化,那么你可以忽略掉这部分
ECharts 原有的 action 机制参考这里:ECharts 原生 Action
详细内容见:Action
以下是变化的部分:
-
重写原有的
highlight为dvHighlight -
重写原有的
downplay为dvDownplay -
新增
dvSelect -
新增
dvUnselect -
新增
dvEmphasis -
新增
dvBlur
原本的 echarts,虽然同样支持 click 与 hover,但是二者只能存在一个高亮,当开启’series.emphasis.focus‘配置时,另一个就会替换为 blur 状态。
比如先 click 选中一个点,然后 hover 另一个点,期望的是俩个点都保持高亮,但 ECharts 原生机制只会高亮 hover 的点
故重新实现底层状态控制
dvHighlight 与 dvDownplay 现在与 mouseover 与 mouseout 绑定,移入高亮,移出取消高亮(不会取消点击触发的高亮状态)
dvSelect 与 dvUnselect 现在与 click 绑定,点击气泡高亮,点击空白画布取消高亮
dvEmphasis 与 dvBlur 仅控制单个气泡的状态,不会像上述俩组影响全部气泡的状态,dvEmphasis 与 dvBlur 仅作为补丁 Action,一般不会被用到
自定义配置项
以下配置项只在 series.type: 'dvScatter' 时有效
series.dvSymbol
目前只支持'circle',后续根据业务需求扩展,详见附录 2
-
类型
string -
默认值
'circle'
图形种类
series.dvSymbolSize
- 类型
number|[number, number]
图形大小,如果传入数组,则根据数据范围线性分布自动计算每个图形的大小
series.dvItemStyle
详细可配置属性和配置示例见附录 1
- 类型
ItemStyleOption[]
图元样式数组,通过指定对应的 ID,可以配置所有图形中每个图元的样式。每个图形种类中的图元 ID 可能不同,详见附录 2
series.dvItemConfig
- 类型
ItemConfigOption<T>
图形配置项,每个图形种类的配置项可能不同,详见附录 2
series.dvAnimationConfig
- 类型
AnimationConfigs
图形的全局动画配置项,详见附录 3,一般不需要手动干预
series.dvRValueRange
与series.dvSymbolSize搭配使用。由于图表是单周期渲染,所以需要用户提供该属性,以保证所有时间周期内,半径数据相同的气泡大小相同。不提供时,以当前周期传入的数据中的极值为准。单周期可以省略该配置项。
- 类型
[number, number]
全周期 RValue 极值
series.dvKeepHighlight
-
类型
boolean -
默认值
false
是否总保持一个点高亮,即在点击空白画布与开启临近搜索且没有搜到点时不会取消高亮
series.dvMultipleSelect
仅在 PC 端有效
-
类型
boolean -
默认值
false
是否开启多选
series.dvAutoHide
- 类型
{enable: boolean, delay?: number}
是否开启自动取消高亮,即触发自动取消高亮的延时
series.dvNearSearch
仅在移动端有效
- 类型
{enable: boolean, trigger?: 'mousemove' | 'click' | 'all'} - 默认值
{enable:false, trigger: 'mousemove'}
是否开启临近搜索,以及临近搜索的触发方式
series.labelLayout.dvAutoLayout
- 类型
boolean - 默认值
true
是否开启 label 的自动布局,即坐标系的上半部分散点 label position 为'bottom',下半部分散点 label position 为'top'
xAxis.dvNameLocation
- 类型
'right'|'center'|'left'
X 轴名称所在的位置
yAxis.dvNameLocation
- 类型
'right'|'left'
Y 轴名称所在的位置
数据配置项
沿用 ECharts 的设计理念,传入的数据可以是数组,也可以是对象
在气泡图中,推荐使用对象,通过原生或者扩展的配置项,可以更加细粒度的控制单个气泡的样式和行为
option:{
series:{
type:'dvScatter',
data: [
// arr
[10,10,10], // [xValue,yValue,rValue]
// object
{
value:[10,10,10],// [xValue,yValue,rValue]
itemStyle: [],
itemConfig: [],
// ...other options
}
]
}
}
dataItem.name
该属性为 ECharts 原生属性,此处仅作补充说明
在不同生命周期中,name属性相同的数据会开启过度动画,如果没有name属性,则默认使用数据下标
dataItem.value
该属性为 ECharts 原生属性,此处仅作补充说明
value 为数组,其中索引 0,1,2 与组件约定为 XValue,YValue,RValue,用户可以在后续索引追加自定义信息以便在各种 API 中获取这部分信息,比如 label 的 formatter,或者 tooltip 的 formatter 等
当用户场景下的 RValue 没有差异时,可以均设置为 1
dataItem.itemStyle
按照命名规则,dataItem中的itemStyle和itemConfig应该增加dv前缀
但是由于这里已经取代了原有的 ECharts 设计,为了防止使用者在dataItem.itemStyle与dataItem.dvItemStyle中混淆不清,故采用itemStyle
在简单情况下,series.itemStyle中的部分属性仍然有效,比如color,但还是推荐使用series.dvItemStyle
- 类型
ItemStyleOption[]
图元样式数组,通过指定对应的 ID,可以配置所有图形中每个图元的样式。每个图形种类中的图元 ID 可能不同,详见附录 2
dataItem.itemConfig
- 类型
ItemConfigOption<T>
图形配置项,每个图形种类的配置项可能不同,详见附录 2
dataItem.nextValue
这看起来不是一个很好的封装,可能会在后续版本中变更
- 类型
number[]
传入一组 X,Y 数据,绘制时,生成一条线,连接【该数据对应的坐标点】与【当前图形中心】,可以通过该配置项实现历史轨迹
dataItem.preValue
这看起来不是一个很好的封装,可能会在后续版本中变更
- 类型
number[]
传入一组 X,Y 数据,图形将会从圆形气泡变为外接等边三角形,并旋转到与前一个点链接线的角度,一般用于最后一个点用以指明运动趋势
Action
这里的 API 需要通过 ECharts 实例的 dispatchAction 方法调用。
调用示例参考ECharts 原生 highlight 调用
以下action接受同一参数类型:
export type ActionPayloadApplication = ActionPayload & {
// 可选,是否开启反选
reverse?: boolean;
};
type ActionPayload = {
// 用 index 或 name 来指定系列。
// 可以使用数组指定多个系列。
seriesIndex?: number | number[];
seriesName?: string | string[];
// 用 index 或 name 来指定数据。
// 可以使用数组指定多个数据。
dataIndex?: number | number[];
dataName?: string | string[];
// 用 dataIndex 或 dataName 来指定数据。
itemsInfo?: { seriesIndex: number; dataIndex: number }[];
};
dvHighlight
dvHighlight
触发指定范围内气泡的高亮样式
dispatchAction({
type: 'dvHighlight',
...params:ActionPayloadApplication
})
dvDownplay
dvDownplay
触发指定范围内气泡取消高亮
dispatchAction({
type: '`dvDownplay',
...params:ActionPayloadApplication
})
dvSelect
dvSelect
触发指定范围内气泡的选中样式(目前取高亮样式,后续有需求后再做扩展)
dispatchAction({
type: 'dvSelect',
...params:ActionPayloadApplication
})