银河·折线组合

描述:当前是关于Echarts图表中的 折线图 示例。
 
            const type = ["疾病分期", "药物治疗", "放射治疗", "检查结果"];

const jianyanData = [
  ["2019-9-1", -10],
  ["2019-9-10", 100],
  ["2019-10-1", -13],
  ["2019-10-10", 31],
  ["2019-10-20", 42],
  ["2019-10-30", 34],
  ["2019-11-1", 55],
  ["2019-11-15", 24],
  ["2019-12-1", 89]
];

// 按“检验结果”的最大数值范围,切割为四份
let interval = Math.floor(Math.max(...jianyanData.map(item => item[1])) / 4);
// XXX: 如果最大值为负数,可能存在问题
if (interval <= 0) interval = 1

option = {
  xAxis: {
    type: "time",
    axisPointer: {
        show: true,
    }
  },
  yAxis: {
    type: "value",
    name: "检验结果",
    // 强制切分,不然 formatter 获取不到对应 value
    interval,
    // 不显示刻度
    axisTick: { show: false },
    axisLabel: {
      // 使用 -10x 表示固定项目,大于 0 的标识检验结果
      formatter(value) {
        if (value < 0) {
          const index = value / -interval - 1;
          if (index >= 0 && index < type.length) return type[index];
        }
      }
    },
    boundaryGap: 0.1
  },
  tooltip: {
    backgroundColor: 'rgba(245, 245, 245, 0.8)',
    borderWidth: 1,
    borderColor: '#ccc',
    padding: 10,
    textStyle: {
        color: '#000'
    },
    extraCssText: 'width: 170px',
    formatter: '{c}'
  },
  series: [
    // 疾病分期
    {
      data: [["2019-10-01", -interval], ["2019-10-15", -interval], ["2019-11-07", -interval]]
    },
    // 药物治疗
    {
      data: [["2019-9-1", -interval * 2], ["2019-10-1", -interval * 2]]
    },
    {
      data: [["2019-9-15", -interval * 2], ["2019-10-15", -interval * 2]]
    },
    // 放射治疗
    {
      data: [["2019-10-3", -interval * 3], ["2019-10-10", -interval * 3]]
    },
    // 检查结果
    {
      data: [["2019-10-10", -interval * 4]]
    },
    {
      data: [["2019-10-10", -interval * 4]],
      // 单个时间范围重叠计算
      symbolOffset: [5, 0]
    },
    {
      data: [["2019-10-10", -interval * 4]],
      // 单个时间范围重叠计算 * 2
      symbolOffset: [10, 0]
    },
    // 检验结果
    {
      data: jianyanData
    }
  ].map(v => {
    // 如果数据中的所有 y 轴数据都相同,认定为特定项
    // 或者通过数据的 type 或者 index 判断?
    const isType = v.data.every(v1 => v.data.every(v2 => v1[1] === v2[1]));
    const style = { symbolSize: 10, lineStyle: { width: 4 } };

    return {
      ...v,
      type: "line",
      ...(isType ? style : null)
    };
  })
};