Echarts--日历关系图

767 阅读5分钟

在数据可视化领域,图表的形式多样,适用于不同数据场景的展示。Echarts作为一款被广泛应用的图表库,其中的日历关系图便是其提供的一种创新的可视化形式。日历关系图结合了日历的直观显示和关系图的联系展示,适合展示数据在时间维度的分布及其关联情况。

日历关系图的特点

日历关系图以日历的形式为基础,将每天的数据通过色块或者大小不同的符号来表示,同时通过关系图的连线或其他符号展现数据点之间的连接关系。该图表类型尤为适合展现时间序列数据,或者在特定时间内的数据流动和传播情况。

Echarts中日历关系图的实现方法

为了丰富图表的表现力,Echarts中的日历关系图融合了传统的日历热力图和图关系图的特点。下文将详细介绍Echarts如何创建这一图表,并展示绘制日历关系图的详细代码。

基础数据准备

在绘制日历关系图之前,首先需要准备展示的数据。示例中的数据用于展示2017年2月到3月间的几个时间点及其数值:

const graphData = [
  ['2017-02-01', 260],
  ['2017-02-04', 200],
  ['2017-02-09', 279],
  ['2017-02-13', 847],
  ['2017-02-18', 241],
  ['2017-02-23', 411],
  ['2017-03-14', 985]
];

关系图连线构造

为了在日历格子之间构建关系图,需要确定节点间的连线情况:

const links = graphData.map(function (item, idx) {
  return {
    source: idx,
    target: idx + 1
  };
});
links.pop();

通过上述代码对每一对相邻的数据点创建了连线,构造了一系列的关系链。

虚拟数据生成

为了完善日历视图,通常需要展示一个完整月份的数据。下面的函数生成了2017年全年的日历数据,模拟了随机的数据值:

function getVirtualData(year) {
  const date = +echarts.time.parse(year + '-01-01');
  const end = +echarts.time.parse(+year + 1 + '-01-01');
  const dayTime = 3600 * 24 * 1000;
  const data = [];
  for (let time = date; time < end; time += dayTime) {
    data.push([
      echarts.time.format(time, '{yyyy}-{MM}-{dd}', false),
      Math.floor(Math.random() * 1000)
    ]);
  }
  return data;
}

图表配置与布局

接下来要完成日历关系图的主要配置部分:

option = {
  tooltip: {},  // 工具提示配置
  calendar: {
    top: 'middle',   // 日历位置
    left: 'center',  // 日历位置
    orient: 'vertical', // 日历方向,竖直布局
    cellSize: 40,    // 单元格大小
    yearLabel: {
      margin: 50,
      fontSize: 30   // 年份标签字体大小
    },
    dayLabel: {
      firstDay: 1,
      nameMap: 'cn'  // 中文星期标签
    },
    monthLabel: {
      nameMap: 'cn', // 中文月份标签
      margin: 15,
      fontSize: 20,
      color: '#999'  // 月份标签字体颜色
    },
    range: ['2017-02', '2017-03-31']  // 日期范围
  },
  visualMap: {
    min: 0,
    max: 1000,
    type: 'piecewise',  // 分段型视觉映射组件
    left: 'center',     // 位置
    bottom: 20,         // 位置
    inRange: {
      color: ['#5291FF', '#C7DBFF']  // 数据映射的颜色范围
    },
    seriesIndex: [1],   // 关联的系列序号
    orient: 'horizontal'// 布局方向
  },
  series: [  // 系列列表
    {
      type: 'graph',         // 类型为关系图
      edgeSymbol: ['none', 'arrow'], // 边的箭头符号
      coordinateSystem: 'calendar',  // 使用日历坐标系
      links: links,                  // 关系图的边数据
      symbolSize: 15,                // 关系图的节点大小
      calendarIndex: 0,              // 日历索引
      itemStyle: {
        color: 'yellow',             // 节点颜色
        shadowBlur: 9,               // 阴影的大小
        shadowOffsetX: 1.5,
        shadowOffsetY: 3,
        shadowColor: '#555'               // 阴影颜色
      },
      lineStyle: {
        color: '#D10E00',                   // 联线颜色
        width: 1,                           // 联线宽度
        opacity: 1                          // 联线透明度
      },
      data: graphData,                      // 关系图的节点数据
      z: 20                                 // 层叠顺序
    },
    {
      type: 'heatmap',  // 类型为热力图
      coordinateSystem: 'calendar',  // 使用日历坐标系
      data: getVirtualData('2017')  // 数据来源
    }
  ]
};

在配置项中,calendar定义了日历的布局,visualMap将值映射到颜色上,而series数组中包含了两个系列——一个是表示关系图的graph,另一个是表示热力图的heatmap。其中关系图用于体现数据之间的连带关系,而热力图则用于展示时间序列数据的值。

关系图的每个节点代表一个日期及其数据值,节点的大小和颜色可以代表数据的大小。例子中使用黄色作为节点颜色,并为每条连接线添加了红色和箭头,以突出显示数据间的流向。

热力图则以渐变的色块表示每日的数据,颜色深浅根据数据的大小变换。

实际应用场景

在实际应用中,日历关系图适用于展示时间序列关联数据,如社交网络中信息的传递路径、商品销售随时间的变化、记念日或大事件的关联性分析等。与传统的柱状图或折线图相比,日历关系图更直觉地反映出数据在时间维度上的分布,同时也增强了数据之间关联性的可视化。

使用Echarts创建日历关系图,还可以结合Echarts丰富的交云功能,实现点击节点展示详情、筛选特定时间段内的数据变化等互动操作,大大增强了用户体验。

结语

日历关系图以其独特的展示方式和合理的信息布局,在时间序列数据的可视化展现中担当了重要角色。通过上述示例的代码解析和配置方法,相信读者已对于如何利用Echarts创建这一类型的图表有了深入的理解。随着数据分析和可视化需求的不断提高,类似日历关系图这样直接、形象的数据展现方式必将在未来担当更为重要的角色。