简介

恰当的文本标注可以提高可视化图表的可读性。除了提供文本标签标注的功能之外,G2 还支持文本的格式化以及自定义 html 文本标签的功能。

image

如何使用

在每个几何标记 geom 上调用 label 方法,指定需要显示的数据维度即可:

// 指定显示文本标签
chart.point().position('x*y').label('x');
// 格式化文本标签的显示内容
chart.interval().position('x*y').label('x', {
  offset: -16, // 文本距离图形的距离
  renderer: function(text, item, index)  {
    // 配合 custom 为 true 使用,格式化文本的函数
  }
});
// 使用回调函数
chart.polygon().position(Stat.treemap('children*value')).label('name*children', function(name, children) { // 仅显示没有子节点的名称
    if (!children) {
      return name;
    }
  }, {
    label: {
      fill: '#fff'
    }
  });

更多配置项请查看 label api。

格式化文本

如果默认提供的 label 显示形式不满足需求时,可以在 label 中设置 renderer 属性,为其定义回调函数即可。

chart.interval().position('x*y').label('x', {
  renderer: function(text, item, index)  {
    // text 为每条记录 x 属性的值
    // item 为映射后的每条数据记录,是一个对象,可以从里面获取你想要的数据信息
    // index 为每条记录的索引
  }
});

完整代码如下:

var data = [
  {name: 'Microsoft Internet Explorer', value: 56.33 },
  {name: 'Chrome', value: 24.03},
  {name: 'Firefox', value: 10.38},
  {name: 'Safari',  value: 4.77},
  {name: 'Opera', value: 0.91},
  {name: 'Proprietary or Undetectable', value: 0.2}
];
var Stat = G2.Stat;
var chart = new G2.Chart({
  id: 'c1',
  width: 800,
  height: 400
});
chart.source(data);
// 重要:绘制饼图时,必须声明 theta 坐标系
chart.coord('theta', {
  radius: 0.8 // 设置饼图的大小
});
chart.legend('name', {
  position: 'bottom'
});
chart.intervalStack()
  .position(Stat.summary.percent('value'))
  .color('name')
  .label('name', {
    renderer: function(text, item, index) {
      var point = item.point; // 每个弧度对应的点
      var percent = point['..percent']; // ..percent 字段由 Stat.summary.percent 统计函数生成
      percent = (percent * 100).toFixed(2) + '%';
      return text + ' ' + percent;
    }
  });
chart.render();

自定义 html 文本

chart.interval().position('x*y').label('x', {
  custom: true,
  renderer: function(text, item, index)  {
    // text 为每条记录 x 属性的值
    // item 为映射后的每条数据记录,是一个对象,可以从里面获取你想要的数据信息
    // index 为每条记录的索引
  }
});

label 除了可以格式化文本的显示,也支持使用 html 自定义显示的样式。只需要将 custom 属性设置为 true, 并定义 renderer 格式化文本的回调函数即可,如下例所示:

完整代码:

// 格式化饼图文本
function formatter(text, item) {
  var point = item.point; // 每个弧度对应的点
  var proportion = point['..proportion']; // ..proportion 字段由Stat.summary.proportion统计函数生成
  proportion = (proportion * 100).toFixed(2) + '%';
  return '<span class="title">' + text + '</span><br><span style="color:' + point.color + '">' + proportion + '</span>'; // 自定义 html 模板
}
$.getJSON('../../../../../static/data/diamond.json',function (data) {
  var Stat = G2.Stat;
  var chart = new G2.Chart({
    id: 'c2',
    width: 800,
    height: 400,
    plotCfg: {
    margin: [20, 90, 60, 80]
    }
  });
  chart.source(data);
  chart.coord('theta',{radius: 0.6});
  // 不同cut(切割工艺)所占的比例
  chart.intervalStack()
    .position(Stat.summary.proportion())
    .color('cut')
    .label('cut', {
      custom: true, // 使用自定义文本
      renderer: formatter, // 格式化文本的函数
      labelLine: false, // 不显示文本的连接线
      offset: 50 // 文本距离图形的距离
    });
  chart.render();
});

使用统计函数

label 方法同样支持统计函数嵌套,比如下图,Y 轴映射的是每个分类的总数,但是你又想标注每个分类的数据占总数据的比例,这个时候就可以直接在 label 中嵌套统计函数。

chart.interval().position('x*y').label(Stat.summary.percent('y')).color('x');

完整代码:

$.getJSON('../../../../../static/data/diamond.json',function (data) {
  var Stat = G2.Stat;
  var chart = new G2.Chart({
    id: 'c3',
    width: 800,
    height: 400,
    plotCfg: {
      margin: [40, 80, 80, 80]
    }
  });
  chart.source(data);
  chart.interval().position(Stat.summary.sum('cut*price')).color('cut')
    .label(Stat.summary.percent('price'));
  chart.render();
});