【问题标题】:C3 - How to center text in donut chart?C3 - 如何在圆环图中居中文本?
【发布时间】:2016-04-30 03:02:12
【问题描述】:

我对 C3 圆环图有疑问 - 它不会在图表内居中显示文本: http://jsfiddle.net/aspirisen/q8h39/83/

c3.generate({
  legend: {
    show: false,
    position: 'right'
  },
  data: {
    columns: [
      ['data1', 50],
      ['data2', 50],
    ],
    type: 'donut',
    onclick: function (d, i) { console.log("onclick", d, i); },
    onmouseover: function (d, i) { console.log("onmouseover", d, i); },
    onmouseout: function (d, i) { console.log("onmouseout", d, i); }
  },
  tooltip: {
    show: false
  },
  donut: {
    width: 26,
    label: {
      format: function (value, ratio, id) {
        return (ratio * 100).toFixed(0).toString()
      }
    }
  }
});

如何解决这个问题?

谢谢!

【问题讨论】:

  • 你需要那个尺寸还是只适合小提琴?
  • @Giordano 是的,图表的大小必须是 100x100

标签: d3.js svg c3.js donut-chart


【解决方案1】:

咆哮警告 -- 这就是为什么在d3 之上构建的“帮助”库如此困扰我的原因。直接用d3 创建这个甜甜圈图的代码量大致相同,您可以完全控制这样的事情。

无论如何,您可以通过在 c3 绘制并重新定位文本后重新计算质心来解决此问题(调整半径 r 以移动标签):

// find all the labels
d3.selectAll(".c3-chart-arc>text")
  .attr("transform", function(d,i){
    var r = 30, //<-- adjust this to move the labels
        a = (d.startAngle + d.endAngle) / 2 - (Math.PI / 2);
    // compute the new centroid
    return "translate(" + (Math.cos(a) * r) + "," + (Math.sin(a) * r) + ")";
});

完整代码:

c3.generate({
  legend: {
    show: false,
    position: 'right'
  },
  data: {
    columns: [
      ['data1', 32],
      ['data2', 50],
    ],
    type: 'donut',
    onclick: function (d, i) { console.log("onclick", d, i); },
    onmouseover: function (d, i) { console.log("onmouseover", d, i); },
    onmouseout: function (d, i) { console.log("onmouseout", d, i); }
  },
  tooltip: {
    show: false
  },
  donut: {
    width: 26,
    label: {
      format: function (value, ratio, id) {
        return (ratio * 100).toFixed(0).toString()
      }
    }
  }
});

setTimeout(function(){
d3.selectAll(".c3-chart-arc>text")
	.attr("transform", function(d,i){
  	var r = 30,
        a = (d.startAngle + d.endAngle) / 2 - (Math.PI / 2);
     console.log("translate(" + (Math.cos(a) * r) + "," + (Math.sin(a) * r) + ")")
    return "translate(" + (Math.cos(a) * r) + "," + (Math.sin(a) * r) + ")";
  });
}, 100);
#chart {
  width: 100px;
  height: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.js"></script>
<div id="chart"></div>

【讨论】:

    【解决方案2】:

    你可以尝试几件事。

    1. 调整图表大小和/或字体大小。我认为这是迄今为止最简单的解决方案。

    1. 在图表初始化后手动定位标签(通过setTimeout 或类似的东西)。 (有关更多信息,请参阅 this stackoverflow question。)为此,您需要选择所有 c3-chart-arc text 元素,然后确定要如何放置它们。

      缺点:c3 使用圆弧的质心计算标签位置,我不确定是否有比这更好的定位方法,除非你事先知道你的输出会是什么样子(例如只有 2 条弧线,因此将左侧文本定位在左侧,将右侧文本定位在右侧)。

    【讨论】:

    • 感谢您的回答,但我无法更改图表的大小
    • 你能改变文字的大小吗?
    • 谢谢,我会试试的。不得不说,像 C3 这样强大的库,居然有这么大的缺陷,实在是太奇怪了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多