[feat] 新增自定义系列

This commit is contained in:
智能大石头 2025-07-28 10:06:45 +08:00
parent b421e77c0c
commit 55cd18109c
3 changed files with 649 additions and 0 deletions

View File

@ -405,6 +405,7 @@ public class ECharts : IExtend
"gauge" => new SeriesGauge { Type = type },
"pictorialBar" => new SeriesPictorialBar { Type = type },
"themeRiver" => new SeriesThemeRiver { Type = type },
"custom" => new SeriesCustom { Type = type },
"line3D" => new SeriesLine3D { Type = type },
"lines3D" => new SeriesLines3D { Type = type },
"bar3D" => new SeriesBar3D { Type = type },
@ -446,6 +447,7 @@ public class ECharts : IExtend
SeriesTypes.Gauge => new SeriesGauge(),
SeriesTypes.PictorialBar => new SeriesPictorialBar(),
SeriesTypes.ThemeRiver => new SeriesThemeRiver(),
SeriesTypes.Custom => new SeriesCustom(),
SeriesTypes.Line3D => new SeriesLine3D(),
SeriesTypes.Lines3D => new SeriesLines3D(),
SeriesTypes.Bar3D => new SeriesBar3D(),

View File

@ -0,0 +1,644 @@
namespace NewLife.Cube.Charts;
/// <summary>自定义系列</summary>
/// <remark>
/// 自定义系列可以自定义系列中的图形元素渲染。从而能扩展出不同的图表。
/// 同时echarts 会统一管理图形的创建删除、动画、与其他组件(如 dataZoom、visualMap的联动使开发者不必纠结这些细节。
/// 例如,下面的例子使用 custom series 扩展出了 x-range 图:
/// 更多的例子参见custom examples
/// 这里是个教程
/// 开发者自定义渲染逻辑renderItem 函数)
/// custom 系列需要开发者自己提供图形渲染的逻辑。这个渲染逻辑一般命名为 renderItem。例如
/// var option = {
/// ...,
/// series: [{
/// type: 'custom',
/// renderItem: function (params, api) {
/// var categoryIndex = api.value(0);
/// var start = api.coord([api.value(1), categoryIndex]);
/// var end = api.coord([api.value(2), categoryIndex]);
/// var height = api.size([0, 1])[1] * 0.6;
/// var rectShape = echarts.graphic.clipRectByRect({
/// x: start[0],
/// y: start[1] - height / 2,
/// width: end[0] - start[0],
/// height: height
/// }, {
/// x: params.coordSys.x,
/// y: params.coordSys.y,
/// width: params.coordSys.width,
/// height: params.coordSys.height
/// });
/// return rectShape && {
/// type: 'rect',
/// shape: rectShape,
/// style: api.style()
/// };
/// },
/// data: data
/// }]
/// }
/// 对于 data 中的每个数据项(为方便描述,这里称为 dataItem),会调用此 renderItem 函数。
/// renderItem 函数提供了两个参数:
/// params包含了当前数据信息和坐标系的信息。
/// api是一些开发者可调用的方法集合。
/// renderItem 函数须返回根据此 dataItem 绘制出的图形元素的定义信息,参见 renderItem.return。
/// 一般来说renderItem 函数的主要逻辑,是将 dataItem 里的值映射到坐标系上的图形元素。这一般需要用到 renderItem.arguments.api 中的两个函数:
/// api.value(...),意思是取出 dataItem 中的数值。例如 api.value(0) 表示取出当前 dataItem 中第一个维度的数值。
/// api.coord(...),意思是进行坐标转换计算。例如 var point = api.coord([api.value(0), api.value(1)]) 表示 dataItem 中的数值转换成坐标系上的点。
/// 有时候还需要用到 api.size(...) 函数,表示得到坐标系上一段数值范围对应的长度。
/// 返回值中样式的设置可以使用 api.style(...) 函数,他能得到 series.itemStyle 中定义的样式信息以及视觉映射的样式信息。也可以用这种方式覆盖这些样式信息api.style({fill: 'green', stroke: 'yellow'})。
/// 维度的映射encode 和 dimensions 属性)
/// custom 系列往往需要定义 series.encode主要用于指明 data 的哪些维度映射到哪些数轴上。从而echarts 能根据这些维度的值的范围,画出合适的数轴刻度。
/// 同时encode.tooltip 和 encode.label 也可以被指定,指明默认的 tooltip 和 label 显示什么内容。series.dimensions 也可以被指定,指明显示在 tooltip 中的维度名称,或者维度的类型。
/// 例如:
/// series: {
/// type: 'custom',
/// renderItem: function () {
/// ...
/// },
/// encode: {
/// x: [2, 4, 3],
/// y: 1,
/// label: 0,
/// tooltip: [2, 4, 3]
/// }
/// }
/// 与 dataZoom 组件的结合
/// 与 dataZoom 结合使用的时候,常常使用会设置 dataZoom.filterMode 为 'weakFilter',从而让 dataItem 部分超出坐标系边界的时候,不会整体被过滤掉。
/// 关于 dataIndex 和 dataIndexInside 的区别
/// dataIndex 指的 dataItem 在原始数据中的 index。
/// dataIndexInside 指的是 dataItem 在当前数据窗口(参见 dataZoom中的 index。
/// renderItem.arguments.api 中使用的参数都是 dataIndexInside 而非 dataIndex因为从 dataIndex 转换成 dataIndexInside 需要时间开销。
/// Event listener
/// chart.setOption({
/// // ...
/// series: {
/// type: 'custom',
/// renderItem: function () {
/// // ...
/// return {
/// type: 'group',
/// children: [{
/// type: 'circle'
/// // ...
/// }, {
/// type: 'circle',
/// name: 'aaa',
/// // 用户指定的信息,可以在 event handler 访问到。
/// info: 12345,
/// // ...
/// }]
/// };
/// }
/// }
/// });
/// chart.on('click', {element: 'aaa'}, function (params) {
/// // 当 name 为 'aaa' 的图形元素被点击时,此回调被触发。
/// console.log(params.info);
/// });
/// </remark>
public class SeriesCustom : Series
{
/// <summary>实例化自定义系列</summary>
public SeriesCustom() => Type = "custom";
//public String Type { get; set; } = "custom";
///// <summary>组件 ID</summary>
///// <remark>默认不指定。指定则可用于在 option 或者 API 中引用组件。</remark>
//public String Id { get; set; }
///// <summary></summary>
///// <remark>系列名称用于tooltip的显示legend 的图例筛选,在 setOption 更新数据和配置项时用于指定对应的系列。</remark>
//public String Name { get; set; }
///// <summary></summary>
///// <remark>
///// 从 v5.2.0 开始支持
///// 从调色盘 option.color 中取色的策略,可取值为:
///// 'series':按照系列分配调色盘中的颜色,同一系列中的所有数据都是用相同的颜色;
///// 'data':按照数据项分配调色盘中的颜色,每个数据项都使用不同的颜色。
///// </remark>
//public String ColorBy { get; set; }
/// <summary>是否启用图例 hover 时的联动高亮</summary>
public Boolean? LegendHoverLink { get; set; }
/// <summary></summary>
/// <remark>
/// 该系列使用的坐标系,可选:
/// null 或者 'none'
/// 无坐标系。
/// 'cartesian2d'
/// 使用二维的直角坐标系(也称笛卡尔坐标系),通过 xAxisIndex, yAxisIndex指定相应的坐标轴组件。
/// 'polar'
/// 使用极坐标系,通过 polarIndex 指定相应的极坐标组件
/// 'geo'
/// 使用地理坐标系,通过 geoIndex 指定相应的地理坐标系组件。
/// 'calendar'
/// 使用日历坐标系,通过 calendarIndex 指定相应的日历坐标系组件。
/// 'none'
/// 不使用坐标系。
/// </remark>
public String CoordinateSystem { get; set; }
///// <summary>使用的 x 轴的 index在单个图表实例中存在多个 x 轴的时候有用。</summary>
//public Double? XAxisIndex { get; set; }
///// <summary>使用的 y 轴的 index在单个图表实例中存在多个 y轴的时候有用。</summary>
//public Double? YAxisIndex { get; set; }
/// <summary>使用的极坐标系的 index在单个图表实例中存在多个极坐标系的时候有用。</summary>
public Double? PolarIndex { get; set; }
/// <summary>使用的地理坐标系的 index在单个图表实例中存在多个地理坐标系的时候有用。</summary>
public Double? GeoIndex { get; set; }
/// <summary>使用的日历坐标系的 index在单个图表实例中存在多个日历坐标系的时候有用。</summary>
public Double? CalendarIndex { get; set; }
/// <summary>custom 系列需要开发者自己提供图形渲染的逻辑</summary>
/// <remark>
/// 这个渲染逻辑一般命名为 renderItem。例如
/// var option = {
/// ...,
/// series: [{
/// type: 'custom',
/// renderItem: function (params, api) {
/// var categoryIndex = api.value(0);
/// var start = api.coord([api.value(1), categoryIndex]);
/// var end = api.coord([api.value(2), categoryIndex]);
/// var height = api.size([0, 1])[1] * 0.6;
/// var rectShape = echarts.graphic.clipRectByRect({
/// x: start[0],
/// y: start[1] - height / 2,
/// width: end[0] - start[0],
/// height: height
/// }, {
/// x: params.coordSys.x,
/// y: params.coordSys.y,
/// width: params.coordSys.width,
/// height: params.coordSys.height
/// });
/// return rectShape && {
/// type: 'rect',
/// shape: rectShape,
/// style: api.style()
/// };
/// },
/// data: data
/// }]
/// }
/// 对于 data 中的每个数据项(为方便描述,这里称为 dataItem),会调用此 renderItem 函数。
/// renderItem 函数提供了两个参数:
/// params包含了当前数据信息和坐标系的信息。
/// api是一些开发者可调用的方法集合。
/// renderItem 函数须返回根据此 dataItem 绘制出的图形元素的定义信息,参见 renderItem.return。
/// 一般来说renderItem 函数的主要逻辑,是将 dataItem 里的值映射到坐标系上的图形元素。这一般需要用到 renderItem.arguments.api 中的两个函数:
/// api.value(...),意思是取出 dataItem 中的数值。例如 api.value(0) 表示取出当前 dataItem 中第一个维度的数值。
/// api.coord(...),意思是进行坐标转换计算。例如 var point = api.coord([api.value(0), api.value(1)]) 表示 dataItem 中的数值转换成坐标系上的点。
/// 有时候还需要用到 api.size(...) 函数,表示得到坐标系上一段数值范围对应的长度。
/// 返回值中样式的设置可以使用 api.style(...) 函数,他能得到 series.itemStyle 中定义的样式信息以及视觉映射的样式信息。也可以用这种方式覆盖这些样式信息api.style({fill: 'green', stroke: 'yellow'})。
/// </remark>
public Object RenderItem { get; set; }
/// <summary>图形样式</summary>
public Object ItemStyle { get; set; }
/// <summary></summary>
/// <remark>
/// 从 v5.0.0 开始支持
/// 标签的视觉引导线配置。
/// </remark>
public Object LabelLine { get; set; }
/// <summary></summary>
/// <remark>
/// 从 v5.0.0 开始支持
/// 标签的统一布局配置。
/// 该配置项是在每个系列默认的标签布局基础上,统一调整标签的(x, y)位置,标签对齐等属性以实现想要的标签布局效果。
/// 该配置项也可以是一个有如下参数的回调函数
/// // 标签对应数据的 dataIndex
/// dataIndex: number
/// // 标签对应的数据类型,只在关系图中会有 node 和 edge 数据类型的区分
/// dataType?: string
/// // 标签对应的系列的 index
/// seriesIndex: number
/// // 标签显示的文本
/// text: string
/// // 默认的标签的包围盒,由系列默认的标签布局决定
/// labelRect: {x: number, y: number, width: number, height: number}
/// // 默认的标签水平对齐
/// align: 'left' | 'center' | 'right'
/// // 默认的标签垂直对齐
/// verticalAlign: 'top' | 'middle' | 'bottom'
/// // 标签所对应的数据图形的包围盒,可用于定位标签位置
/// rect: {x: number, y: number, width: number, height: number}
/// // 默认引导线的位置,目前只有饼图(pie)和漏斗图(funnel)有默认标签位置
/// // 如果没有该值则为 null
/// labelLinePoints?: number[][]
/// 示例:
/// 将标签显示在图形右侧 10px 的位置,并且垂直居中:
/// labelLayout(params) {
/// return {
/// x: params.rect.x + 10,
/// y: params.rect.y + params.rect.height / 2,
/// verticalAlign: 'middle',
/// align: 'left'
/// }
/// }
/// 根据图形的包围盒尺寸决定文本尺寸
/// labelLayout(params) {
/// return {
/// fontSize: Math.max(params.rect.width / 10, 5)
/// };
/// }
/// </remark>
public Object LabelLayout { get; set; }
/// <summary></summary>
/// <remark>
/// 从 v5.0.0 开始支持
/// 选中模式的配置,表示是否支持多个选中,默认关闭,支持布尔值和字符串,字符串取值可选'single''multiple''series' 分别表示单选,多选以及选择整个系列。
/// 从 v5.3.0 开始支持 'series'。
/// </remark>
public Object SelectedMode { get; set; }
/// <summary></summary>
/// <remark>
/// 使用 dimensions 定义 series.data 或者 dataset.source 的每个维度的信息。
/// 注意:如果使用了 dataset那么可以在 dataset.dimensions 中定义 dimension ,或者在 dataset.source 的第一行/列中给出 dimension 名称。于是就不用在这里指定 dimension。但如果在这里指定了 dimensions那么优先使用这里的。
/// 例如:
/// option = {
/// dataset: {
/// source: [
/// // 有了上面 dimensions 定义后,下面这五个维度的名称分别为:
/// // 'date', 'open', 'close', 'highest', 'lowest'
/// [12, 44, 55, 66, 2],
/// [23, 6, 16, 23, 1],
/// ...
/// ]
/// },
/// series: {
/// type: 'xxx',
/// // 定义了每个维度的名称。这个名称会被显示到默认的 tooltip 中。
/// dimensions: ['date', 'open', 'close', 'highest', 'lowest']
/// }
/// }
/// series: {
/// type: 'xxx',
/// dimensions: [
/// null, // 如果此维度不想给出定义,则使用 null 即可
/// {type: 'ordinal'}, // 只定义此维度的类型。
/// // 'ordinal' 表示离散型,一般文本使用这种类型。
/// // 如果类型没有被定义,会自动猜测类型。
/// {name: 'good', type: 'number'},
/// 'bad' // 等同于 {name: 'bad'}
/// ]
/// }
/// dimensions 数组中的每一项可以是:
/// string如 'someName',等同于 {name: 'someName'}
/// Object属性可以有
/// name: string。
/// type: string支持
/// number默认表示普通数据。
/// ordinal对于类目、文本这些 string 类型的数据,如果需要能在数轴上使用,须是 'ordinal' 类型。ECharts 默认会自动判断这个类型。但是自动判断也是不可能很完备的,所以使用者也可以手动强制指定。
/// float即 Float64Array。
/// int即 Int32Array。
/// time表示时间类型。设置成 'time' 则能支持自动解析数据成时间戳timestamp比如该维度的数据是 '2017-05-10',会自动被解析。时间类型的支持参见 data。
/// displayName: 一般用于 tooltip 中维度名的展示。string 如果没有指定,默认使用 name 来展示。
/// 值得一提的是,当定义了 dimensions 后,默认 tooltip 中对个维度的显示,会变为『竖排』,从而方便显示每个维度的名称。如果没有定义 dimensions则默认 tooltip 会横排显示,且只显示数值没有维度名称可显示。
/// </remark>
public double[] Dimensions { get; set; }
/// <summary>可以定义 data 的哪个维度被编码成什么</summary>
/// <remark>
/// 比如:
/// option = {
/// dataset: {
/// source: [
/// // 每一列称为一个『维度』。
/// // 这里分别是维度 0、1、2、3、4。
/// [12, 44, 55, 66, 2],
/// [23, 6, 16, 23, 1],
/// ...
/// ]
/// },
/// series: {
/// type: 'xxx',
/// encode: {
/// x: [3, 1, 5], // 表示维度 3、1、5 映射到 x 轴。
/// y: 2, // 表示维度 2 映射到 y 轴。
/// tooltip: [3, 2, 4] // 表示维度 3、2、4 会在 tooltip 中显示。
/// }
/// }
/// }
/// 当使用 dimensions 给维度定义名称后encode 中可直接引用名称,例如:
/// series: {
/// type: 'xxx',
/// dimensions: ['date', 'open', 'close', 'highest', 'lowest'],
/// encode: {
/// x: 'date',
/// y: ['open', 'close', 'highest', 'lowest']
/// }
/// }
/// encode 声明的基本结构如下,其中冒号左边是坐标系、标签等特定名称,如 'x', 'y', 'tooltip' 等冒号右边是数据中的维度名string 格式或者维度的序号number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)。通常情况下,下面各种信息不需要所有的都写,按需写即可。
/// 下面是 encode 支持的属性:
/// // 在任何坐标系和系列中,都支持:
/// encode: {
/// // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示
/// tooltip: ['product', 'score']
/// // 使用第一个维度和第三个维度的维度名连起来作为系列名。(有时候名字比较长,这可以避免在 series.name 重复输入这些名字)
/// seriesName: [1, 3],
/// // 表示使用第二个维度中的值作为 id。这在使用 setOption 动态更新数据时有用处,可以使新老数据用 id 对应起来,从而能够产生合适的数据更新动画。
/// itemId: 2,
/// // 指定数据项的名称使用第三个维度在饼图等图表中有用可以使这个名字显示在图例legend中。
/// itemName: 3,
/// // 指定数据项的组 ID (groupId)。当全局过渡动画功能开启时setOption 前后拥有相同 groupId 的数据项会进行动画过渡。
/// itemGroupId: 4,
/// // 指定数据项对应的子数据组 ID (childGroupId),用于实现多层下钻和聚合。详见 childGroupId。
/// // 从 v5.5.0 开始支持
/// itemChildGroupId: 5
/// }
/// // 直角坐标系grid/cartesian特有的属性
/// encode: {
/// // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴:
/// x: [1, 5, 'score'],
/// // 把“维度0”映射到 Y 轴。
/// y: 0
/// }
/// // 单轴singleAxis特有的属性
/// encode: {
/// single: 3
/// }
/// // 极坐标系polar特有的属性
/// encode: {
/// radius: 3,
/// angle: 2
/// }
/// // 地理坐标系geo特有的属性
/// encode: {
/// lng: 3,
/// lat: 2
/// }
/// // 对于一些没有坐标系的图表,例如饼图、漏斗图等,可以是:
/// encode: {
/// value: 3
/// }
/// 这是个更丰富的 encode 的示例:
/// 特殊地,在 自定义系列custom seriesencode 中轴可以不指定或设置为 null/undefined从而使系列免于受这个轴控制也就是说轴的范围extent不会受此系列数值的影响轴被 dataZoom 控制时也不会过滤掉这个系列:
/// var option = {
/// xAxis: {},
/// yAxis: {},
/// dataZoom: [{
/// xAxisIndex: 0
/// }, {
/// yAxisIndex: 0
/// }],
/// series: {
/// type: 'custom',
/// renderItem: function (params, api) {
/// return {
/// type: 'circle',
/// shape: {
/// cx: 100, // x 位置永远为 100
/// cy: api.coord([0, api.value(0)])[1],
/// r: 30
/// },
/// style: {
/// fill: 'blue'
/// }
/// };
/// },
/// encode: {
/// // 这样这个系列就不会被 x 轴以及 x
/// // 轴上的 dataZoom 控制了。
/// x: -1,
/// y: 1
/// },
/// data: [ ... ]
/// }
/// };
/// </remark>
public object Encode { get; set; }
/// <summary></summary>
/// <remark>
/// 当使用 dataset 时seriesLayoutBy 指定了 dataset 中用行还是列对应到系列上,也就是说,系列“排布”到 dataset 的行还是列上。可取值:
/// 'column'默认dataset 的列对应于系列,从而 dataset 中每一列是一个维度dimension
/// 'row'dataset 的行对应于系列,从而 dataset 中每一行是一个维度dimension
/// 参见这个 示例
/// </remark>
public String SeriesLayoutBy { get; set; }
/// <summary></summary>
/// <remark>如果 series.data 没有指定,并且 dataset 存在,那么就会使用 dataset。datasetIndex 指定本系列使用哪个 dataset。</remark>
public Double? DatasetIndex { get; set; }
/// <summary>该系列所有数据项的组 ID优先级低于groupId</summary>
/// <remark>详见series.data.groupId。</remark>
public String DataGroupId { get; set; }
/// <summary>系列中的数据内容数组</summary>
/// <remark>
/// 数组项通常为具体的数据项。
/// 注意,如果系列没有指定 data并且 option 有 dataset那么默认使用第一个 dataset。如果指定了 data则不会再使用 dataset。
/// 可以使用 series.datasetIndex 指定其他的 dataset。
/// 通常来说,数据用一个二维数组表示。如下,每一列被称为一个『维度』。
/// series: [{
/// data: [
/// // 维度X 维度Y 其他维度 ...
/// [ 3.4, 4.5, 15, 43],
/// [ 4.2, 2.3, 20, 91],
/// [ 10.8, 9.5, 30, 18],
/// [ 7.2, 8.8, 18, 57]
/// ]
/// }]
/// 在 直角坐标系 (grid) 中『维度X』和『维度Y』会默认对应于 xAxis 和 yAxis。
/// 在 极坐标系 (polar) 中『维度X』和『维度Y』会默认对应于 radiusAxis 和 angleAxis。
/// 后面的其他维度是可选的,可以在别处被使用,例如:
/// 在 visualMap 中可以将一个或多个维度映射到颜色,大小等多个图形属性上。
/// 在 series.symbolSize 中可以使用回调函数,基于某个维度得到 symbolSize 值。
/// 使用 tooltip.formatter 或 series.label.formatter 可以把其他维度的值展示出来。
/// 特别地当只有一个轴为类目轴axis.type 为 'category')的时候,数据可以简化用一个一维数组表示。例如:
/// xAxis: {
/// data: ['a', 'b', 'm', 'n']
/// },
/// series: [{
/// // 与 xAxis.data 一一对应。
/// data: [23, 44, 55, 19]
/// // 它其实是下面这种形式的简化:
/// // data: [[0, 23], [1, 44], [2, 55], [3, 19]]
/// }]
/// 『值』与 轴类型 的关系:
/// 当某维度对应于数值轴axis.type 为 'value' 或者 'log')的时候:
/// 其值可以为 number例如 12也可以兼容 string 形式的 number例如 '12'
/// 当某维度对应于类目轴axis.type 为 'category')的时候:
/// 其值须为类目的『序数』(从 0 开始)或者类目的『字符串值』。例如:
/// xAxis: {
/// type: 'category',
/// data: ['星期一', '星期二', '星期三', '星期四']
/// },
/// yAxis: {
/// type: 'category',
/// data: ['a', 'b', 'm', 'n', 'p', 'q']
/// },
/// series: [{
/// data: [
/// // xAxis yAxis
/// [ 0, 0, 2 ], // 意思是此点位于 xAxis: '星期一', yAxis: 'a'。
/// [ '星期四', 2, 1 ], // 意思是此点位于 xAxis: '星期四', yAxis: 'm'。
/// [ 2, 'p', 2 ], // 意思是此点位于 xAxis: '星期三', yAxis: 'p'。
/// [ 3, 3, 5 ]
/// ]
/// }]
/// 双类目轴的示例可以参考 Github Punchcard 示例。
/// 当某维度对应于时间轴type 为 'time')的时候,值可以为:
/// 一个时间戳,如 1484141700832表示 UTC 时间。
/// 或者字符串形式的时间描述:
/// ISO 8601 的子集,只包含这些形式(这几种格式,除非指明时区,否则均表示本地时间,与 moment 一致):
/// 部分年月日时间: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06'.
/// 使用 'T' 或空格分割: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123'.
/// 时区设定: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00'.
/// 其他的时间字符串,包括(均表示本地时间):
/// '2012', '2012-3-1', '2012/3/1', '2012/03/01',
/// '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
/// 或者用户自行初始化的 Date 实例:
/// 注意,用户自行初始化 Date 实例的时候,浏览器的行为有差异,不同字符串的表示也不同。
/// 例如:在 chrome 中new Date('2012-01-01') 表示 UTC 时间的 2012 年 1 月 1 日,而 new Date('2012-1-1') 和 new Date('2012/01/01') 表示本地时间的 2012 年 1 月 1 日。在 safari 中,不支持 new Date('2012-1-1') 这种表示方法。
/// 所以,使用 new Date(dataString) 时,可使用第三方库解析(如 moment或者使用 echarts.time.parse或者参见 这里。
/// 当需要对个别数据进行个性化定义时:
/// 数组项可用对象,其中的 value 像表示具体的数值,如:
/// [
/// 12,
/// 34,
/// {
/// value : 56,
/// //自定义标签样式,仅对该数据项有效
/// label: {},
/// //自定义特殊 itemStyle仅对该数据项有效
/// itemStyle:{}
/// },
/// 10
/// ]
/// // 或
/// [
/// [12, 33],
/// [34, 313],
/// {
/// value: [56, 44],
/// label: {},
/// itemStyle:{}
/// },
/// [10, 33]
/// ]
/// 空值:
/// 当某数据不存在时ps不存在不代表值为 0可以用 '-' 或者 null 或者 undefined 或者 NaN 表示。
/// 例如,无数据在折线图中可表现为该点是断开的,在其它图中可表示为图形不存在。
/// </remark>
public override Object[] Data { get; set; }
/// <summary></summary>
/// <remark>
/// 从 v4.4.0 开始支持
/// 是否裁剪超出坐标系部分的图形,具体裁剪效果根据系列决定:
/// 散点图/带有涟漪特效动画的散点(气泡)图:忽略中心点超出坐标系的图形,但是不裁剪单个图形
/// 柱状图:裁掉完全超出的柱子,但是不会裁剪只超出部分的柱子
/// 折线图:裁掉所有超出坐标系的折线部分,拐点图形的逻辑按照散点图处理
/// 路径图:裁掉所有超出坐标系的部分
/// K 线图:忽略整体都超出坐标系的图形,但是不裁剪单个图形
/// 象形柱图:裁掉所有超出坐标系的部分(从 v5.5.0 开始支持)
/// 自定义系列:裁掉所有超出坐标系的部分
/// 除了象形柱图和自定义系列,其它系列的默认值都为 true及开启裁剪如果你觉得不想要裁剪的话可以设置成 false 关闭。
/// </remark>
public Boolean? Clip { get; set; }
/// <summary>自定义图所有图形的 zlevel 值</summary>
/// <remark>
/// zlevel用于 Canvas 分层不同zlevel值的图形会放置在不同的 Canvas 中Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁例如有动画的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大,在手机端上需要谨慎使用以防崩溃。
/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
/// </remark>
public Double? Zlevel { get; set; }
/// <summary>自定义图组件的所有图形的z值</summary>
/// <remark>
/// 控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
/// z相比zlevel优先级更低而且不会创建新的 Canvas。
/// </remark>
public Double? Z { get; set; }
/// <summary>图形是否不响应和触发鼠标事件,默认为 false即响应和触发鼠标事件。</summary>
public Boolean? Silent { get; set; }
/// <summary>是否开启动画</summary>
public Boolean? Animation { get; set; }
/// <summary>是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。</summary>
public Double? AnimationThreshold { get; set; }
/// <summary>初始动画的时长</summary>
/// <remark>
/// 支持回调函数,可以通过每个数据返回不同的时长实现更戏剧的初始动画效果:
/// animationDuration: function (idx) {
/// // 越往后的数据时长越大
/// return idx * 100;
/// }
/// </remark>
public Object AnimationDuration { get; set; }
/// <summary>初始动画的缓动效果</summary>
/// <remark>不同的缓动效果可以参考 缓动示例。</remark>
public String AnimationEasing { get; set; }
/// <summary></summary>
/// <remark>
/// 初始动画的延迟,支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
/// 如下示例:
/// animationDelay: function (idx) {
/// // 越往后的数据延迟越大
/// return idx * 100;
/// }
/// 也可以看该示例
/// </remark>
public Object AnimationDelay { get; set; }
/// <summary>数据更新动画的时长</summary>
/// <remark>
/// 支持回调函数,可以通过每个数据返回不同的时长实现更戏剧的更新动画效果:
/// animationDurationUpdate: function (idx) {
/// // 越往后的数据时长越大
/// return idx * 100;
/// }
/// </remark>
public Object AnimationDurationUpdate { get; set; }
/// <summary>数据更新动画的缓动效果</summary>
public String AnimationEasingUpdate { get; set; }
/// <summary></summary>
/// <remark>
/// 数据更新动画的延迟,支持回调函数,可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
/// 如下示例:
/// animationDelayUpdate: function (idx) {
/// // 越往后的数据延迟越大
/// return idx * 100;
/// }
/// 也可以看该示例
/// </remark>
public Object AnimationDelayUpdate { get; set; }
/// <summary></summary>
/// <remark>
/// 从 v5.2.0 开始支持
/// 全局过渡动画相关的配置。
/// 全局过渡动画Universal Transition提供了任意系列之间进行变形动画的功能。开启该功能后每次setOption相同id的系列之间会自动关联进行动画的过渡更细粒度的关联配置见universalTransition.seriesKey配置。
/// 通过配置数据项的groupId和childGroupId还可以实现诸如下钻聚合等一对多或者多对一的动画。
/// 可以直接在系列中配置 universalTransition: true 开启该功能。也可以提供一个对象进行更多属性的配置。
/// </remark>
public Object UniversalTransition { get; set; }
/// <summary>本系列特定的 tooltip 设定</summary>
public Object Tooltip { get; set; }
}

View File

@ -63,6 +63,9 @@ public enum SeriesTypes
/// <summary>主题河流</summary>
ThemeRiver,
/// <summary>自定义系列</summary>
Custom,
/// <summary>三维折线图</summary>
Line3D,