基于C3js在Donut图表上基于数据的条件颜色

时间:2018-08-23 03:21:13

标签: c3.js donut-chart

我想知道如何创建一个甜甜圈图,其中特定切片的颜色取决于数据。我设法在条形图中使用以下方法轻松实现了这一点:

color: function (color, d) {

if (d.value < 25) {
 return "#f00";
}

但是我找不到甜甜圈。

我的意思是

  • 只有两个片(和两个数据组)A和B,每个只有1个值,例如A = 35和B = 65,即只有两列

  • B切片应始终具有恒定的颜色,例如“灰色”,无论其值如何

  • 切片及其颜色应取决于A值,例如如果值> 50,则颜色为红色,如果值> 75,则颜色为橙色,依此类推。

例如:A为45,B为55。切片为红色。 B是灰色的。输入数据更改(即刷新图表)。 A现在是60,B是40。B仍然是灰色(始终是),但是A现在应该是橙色。输入数据更改。 A是90,B是10。B是灰色。 A是绿色,依此类推。

非常感谢您的帮助! \ o /

1 个答案:

答案 0 :(得分:0)

我认为这很简单,但是我无法在颜色函数中获得图表对象的句柄,并且“ this”始终是Window对象或未定义。

这是我所做的,涉及使用外部变量作为缓存:

基本上,颜色是用2个参数调用的,第一个始终是现有颜色,第二个可以是数据的ID,也可以是更大的数据对象,包括该甜甜圈扇区的值。我使用第二种情况将值填入缓存,当遇到第一种情况时会使用该值。

var temp = {};
var chart = c3.generate({
    data: {
        columns: [
            ['data1', 30],
            ['data2', 120],
        ],
        color: function (color, d) {
            console.log (arguments, this, chart);
            if (d.values) {
                var id = d.id;
                var newColour = d.values[0].value > 40 ? "red" : "blue";
                temp[id] = newColour;
            }
            return temp[d] || color;
        },
        type : 'donut',
    },
    donut: {
        title: "Iris Petal Width"
    }
});

将其复制到https://c3js.org/samples/chart_donut.html中以查看其运行情况


答案2

实际上,另一种(未公开的)方法是这样的:

color: {
    pattern: ['red', 'green', 'blue', 'orange', 'turquoise'], // colors for values
    threshold: {
        values: [30, 60, 90, 100, 150]
    }
}

一个扇区以小于它的第一个阈值的索引在图案数组中呈现颜色(例如59小于60,因此该值为绿色)

这确实可以填充某些数据系列的静态颜色,并且如果需要的话,可以采用任何一种连续的色阶进行填充