简介

提示信息(tooltip),是指当鼠标悬停在图标上的某点时,以框的形式提示该点的数据,比如该点的值,数据单位等。tooltip 内显示的信息完全可以通过格式化函数动态指定;通过调用 chart.tooltip(false) 即可不启用提示信息功能。

image

tooltip 配置语法

在 G2 中提供了两种配置 tooltip 的方法,一种是设置在 chart 对象上的全局配置,另一种是设置在每个几何标记对象上的 tooltip 配置,具体如下:

(1) chart 对象上的全局配置

  1. chart.tooltip(true, cfg); // 开启 tooltip,并设置 tooltip 配置信息
  2. chart.tooltip(cfg); // 省略 true, 直接设置 tooltip 配置信息
  3. chart.tooltip(false); // 关闭 tooltip

常用的 tooltip 配置信息如下:

  1. chart.tooltip({
  2. offset: 10, // 设置 tooltip 显示位置时距离当前鼠标 x 轴方向上的距离
  3. crosshairs: true, // 是否显示 tooltip 辅助线
  4. title: null, // 用于控制是否显示 tooltip 框内的 title
  5. map: { // 用于指定 tooltip 内显示内容同原始数据字段的映射关系
  6. title: '数据字段名或者常量', // 为数据字段名时则显示该字段名对应的数值,常量则显示常量
  7. name: '数据字段名或者常量', // 为数据字段名时则显示该字段名对应的数值,常量则显示常量
  8. value: '数据字段名' // 为数据字段名时则显示该字段名对应的数值
  9. }
  10. });

image

更详细的配置请查看 tooltip api

(2)几何标记上的 tooltip 配置

可以在 geom 几何标记上配置 tooltip 的显示内容,如下语法所示:

  1. chart.<geom>.tooltip('dim1*dim2...*dimN');

这个时候 tooltip 的显示内容如下:

image

注意:几何标记上的 tooltip 配置会覆盖 chart 对象上的 map 映射配置。

配置提示信息内容

提示信息的目的是为了展示数据点相关的数据,具体展示的内容完全可以通过多种灵活的方式来实现。

1. 指定 tooltip 的显示信息

如果 G2 默认生成的 tooltip 展示内容不满足需求,用户可以通过调用几何标记的 tooltip 方法手动指定要显示的 tooltip 内容。

  1. var data = [
  2. {"month":0,"tem":7,"city":"tokyo"},
  3. {"month":1,"tem":6.9,"city":"tokyo"},
  4. {"month":2,"tem":9.5,"city":"tokyo"},
  5. {"month":3,"tem":14.5,"city":"tokyo"},
  6. {"month":4,"tem":18.2,"city":"tokyo"},
  7. {"month":5,"tem":21.5,"city":"tokyo"},
  8. {"month":6,"tem":25.2,"city":"tokyo"},
  9. {"month":7,"tem":26.5,"city":"tokyo"},
  10. {"month":8,"tem":23.3,"city":"tokyo"},
  11. {"month":9,"tem":18.3,"city":"tokyo"},
  12. {"month":10,"tem":13.9,"city":"tokyo"},
  13. {"month":11,"tem":9.6,"city":"tokyo"}
  14. ];
  15. var chart = new G2.Chart({
  16. id: 'c0',
  17. width: 800,
  18. height: 300
  19. });
  20. var defs = {
  21. 'month':{
  22. type: 'cat',
  23. alias: '月份', // 别名,如果没有别名显示成字段名 month
  24. values: [
  25. '一月','二月','三月','四月','五月','六月',
  26. '七月','八月','九月','十月','十一月','十二月']
  27. },
  28. 'tem': {
  29. alias: '温度'
  30. }
  31. };
  32. chart.source(data,defs);
  33. chart.tooltip(true, {
  34. title: null // 默认标题不显示
  35. });
  36. chart.line().position('month*tem').tooltip('month*tem');
  37. chart.render();

2. 格式化 tooltip 的显示内容

当需要格式化 tooltip 的显示内容时,需要监听 chart 对象上的 tooltipchange 事件。这个事件会返回如下参数:

  1. {
  2. x: 当前鼠标的 x 坐标,
  3. y: 当前鼠标的 y 坐标,
  4. tooltip: 当前的 tooltip 对象
  5. items: 数组对象,当前 tooltip 显示的每条内容
  6. }

通过修改 items 的内容就可以修改 tooltip 的展示内容了。

(1)实例 1:格式化 tooltip 的 value 值

  1. $.getJSON('../../../../static/data/diamond.json', function(data) {
  2. var Stat = G2.Stat;
  3. var chart = new G2.Chart({
  4. id: 'c1',
  5. width: 800,
  6. height: 400,
  7. plotCfg: {
  8. margin: [20, 80, 60, 60]
  9. }
  10. });
  11. chart.source(data);
  12. chart.coord('theta', {
  13. radius: 0.6 // 设置饼图的半径,设置的数值必须在 [0, 1] 范围内
  14. });
  15. // 不同 cut(切割工艺)所占的比例
  16. chart.intervalStack()
  17. .position(Stat.summary.proportion())
  18. .color('cut');
  19. chart.render();
  20. chart.on('tooltipchange',function(ev){
  21. var item = ev.items[0]; // 获取tooltip要显示的内容
  22. item.value = '格式化-' + item.value;
  23. });
  24. });

(2) 更改 tooltip 的显示内容

  1. var data = [ // 数据
  2. {"time": 1428163200000,"start": 469,"end": 480},
  3. {"time": 1428163203600,"start": 480,"end": 430},
  4. {"time": 1428163207200,"start": 430,"end": 410},
  5. {"time": 1428163210800,"start": 410,"end": 420},
  6. {"time": 1428163214400,"start": 420,"end": 440},
  7. {"time": 1428163218000,"start": 440,"end": 460},
  8. {"time": 1428163221600,"start": 460,"end": 410},
  9. {"time": 1428163225200,"start": 410,"end": 440},
  10. {"time": 1428163228800,"start": 440,"end": 490}
  11. ];
  12. var frame = new G2.Frame(data); // 创建数据源
  13. frame.addCol('range', function(obj) { // 添加列
  14. return [obj.start, obj.end];
  15. });
  16. frame.addCol('trend', function(obj) {
  17. return (obj.start <= obj.end) ? 0 : 1;
  18. });
  19. var chart = new G2.Chart({
  20. id: 'c2',
  21. width: 800,
  22. height: 400
  23. });
  24. var defs = {
  25. 'time': { // 设置日期类型
  26. type: 'time',
  27. mask: 'yyyy-mm-dd HH:MM:ss'
  28. },
  29. 'trend': { //设置条件,显示不同的颜色
  30. type: 'cat',
  31. alias: '趋势',
  32. values: ['上涨', '下跌']
  33. }
  34. };
  35. chart.source(frame, defs);
  36. chart.interval().position('time*range').color('trend', ['#1bbd19', '#fa513a']).size(20);
  37. chart.render();
  38. chart.on('tooltipchange', function(ev) {
  39. var items = ev.items; // tooltip显示的项
  40. var origin = items[0]; // 将一条数据改成多条数据
  41. var range = origin.point._origin.range;
  42. items.splice(0); // 清空
  43. items.push({
  44. name: '开始值',
  45. title: origin.title,
  46. marker: true,
  47. color: origin.color,
  48. value: range[0]
  49. });
  50. items.push({
  51. name: '结束值',
  52. marker: true,
  53. title: origin.title,
  54. color: origin.color,
  55. value: range[1]
  56. });
  57. });

3. html 内容

G2 也支持使用自定义的 html 展示 tooltip。配置方法如下:

  1. chart.tooltip(true, {
  2. custom: true, // 开启 tooltip 自定义模板功能
  3. html: '<div class="ac-tooltip" style="position:absolute;visibility: hidden;"><h4 class="ac-title"></h4><table class="ac-list custom-table"></table></div>', // tooltip 的 html 外层模板,可支持类似 jquery 的使用,直接传入 dom id,如 "#c1"
  4. itemTpl: '<tr><td>{index}</td><td style="color:{color}">{name}</td><td>{value}k</td></tr>', // 使用 html 时每一个显示项的模板,默认支持 index, color, name, value 这四个变量。
  5. offset: 50, // 偏移量,设置tooltip 显示位置距离 x 轴方向上的偏移
  6. customFollow: false // 设置 tooltip 是否跟随鼠标移动,默认为 true,跟随。
  7. });

image

在线 demo

image

在线 demo

image

在线 demo

其他配置

1. 显示辅助线

默认只有线图和区域图会显示 tooltip 的辅助线,当用户需要显示辅助线时,可以通过配置 crosshairs 属性设置,crosshairs 支持三种展示形式:

crosshairs: true, // 启用辅助线,默认为竖直方向的辅助线

  1. crosshairs: {
  2. type: 'x' // 启用水平方向的辅助线
  3. }
  1. crosshairs: {
  2. type: 'cross' // 启用十字辅助线,水平和数值方向均有
  3. }

2. 固定位置显示提示信息

通过调用 chart.showTooltip(point) 可以控制在固定的位置显示提示信息,参数 point 为画布上的坐标点,格式如下:

  1. var point = {
  2. x: 23,
  3. y: 30
  4. };

另外还提供了 chart.getPosition({xDim: value, yDim: value}) 方法,用于获取数据对应在画布空间的坐标。

  1. var data = [
  2. {'time': '2016-10-25 00:00:00', 'runCount': 4, 'type': 2, 'runTime': 2},
  3. {'time': '2016-10-25 00:30:00', 'runCount': 2, 'type': 6, 'runTime': 3},
  4. {'time': '2016-10-25 01:00:00', 'runCount': 13, 'type': 2, 'runTime': 5},
  5. {'time': '2016-10-25 01:30:00', 'runCount': 9, 'type': 9, 'runTime': 1},
  6. {'time': '2016-10-25 02:00:00', 'runCount': 5, 'type': 2, 'runTime': 3},
  7. {'time': '2016-10-25 02:30:00', 'runCount': 8, 'type': 2, 'runTime': 1},
  8. {'time': '2016-10-25 03:00:00', 'runCount': 13, 'type': 1, 'runTime': 2},
  9. {'time': '2016-10-25 03:30:00', 'runCount': 4, 'type': 2, 'runTime': 2},
  10. {'time': '2016-10-25 04:00:00', 'runCount': 2, 'type': 6, 'runTime': 3},
  11. {'time': '2016-10-25 04:30:00', 'runCount': 13, 'type': 2, 'runTime': 5},
  12. {'time': '2016-10-25 05:00:00', 'runCount': 9, 'type': 9, 'runTime': 1},
  13. {'time': '2016-10-25 05:30:00', 'runCount': 5, 'type': 2, 'runTime': 3}
  14. ];
  15. var chart = new G2.Chart({
  16. id: 'c3',
  17. forceFit: true,
  18. height: 300,
  19. plotCfg: {margin: [50, 80, 50, 80]},
  20. });
  21. chart.source(data);
  22. chart.axis('time', {
  23. title: null,
  24. });
  25. chart.col('time',{
  26. type: 'timeCat',
  27. mask: 'HH:MM',
  28. tickCount:12,
  29. nice:true,
  30. });
  31. chart.col('runCount', {
  32. alias: '运行数量', // 设置属性的别名
  33. min: 0
  34. });
  35. chart.col('runTime', {
  36. alias: '运行时间(ms)' // 设置属性的别名
  37. });
  38. chart.tooltip(false);
  39. chart.legend(false);// 不显示图例
  40. chart.line().position('time*runTime').color('#5ed470').size(1).shape('smooth'); // 绘制曲线图
  41. chart.point().position('time*runTime').color('#5ed470').size(5).shape('circle'); // 绘制点图
  42. chart.render();
  43. //初始化到最新一个点
  44. var lastPoint = chart.get('plotRange').br;
  45. chart.showTooltip(lastPoint);
  46. //鼠标点击事件
  47. chart.on('plotclick',function(ev){
  48. var point = {
  49. x: ev.x,
  50. y: ev.y
  51. };
  52. chart.showTooltip(point); // 接收的是画布坐标上的点
  53. });
  54. var frontCanvas = chart.get('frontCanvas');
  55. frontCanvas.off('canvas-mousemove').off('canvas-mouseleave');