条形图中每个条形的不同颜色;图表JS

IT技术 javascript chart.js
2021-03-12 02:30:38

我在我正在处理的项目中使用 ChartJS,我需要为条形图中的每个条使用不同的颜色。

以下是条形图数据集的示例:

var barChartData = {
  labels: ["001", "002", "003", "004", "005", "006", "007"],
  datasets: [{
    label: "My First dataset",
    fillColor: "rgba(220,220,220,0.5)", 
    strokeColor: "rgba(220,220,220,0.8)", 
    highlightFill: "rgba(220,220,220,0.75)",
    highlightStroke: "rgba(220,220,220,1)",
    data: [20, 59, 80, 81, 56, 55, 40]
  }]
};

有没有办法把每个条都涂成不同的颜色?

6个回答

从 v2 开始,您可以通过backgroundColor属性简单地指定一组值以对应于每个条的颜色

datasets: [{
  label: "My First dataset",
  data: [20, 59, 80, 81, 56, 55, 40],
  backgroundColor: ["red", "blue", "green", "blue", "red", "blue"], 
}],

这对于borderColor, hoverBackgroundColor,也是可能的hoverBorderColor

条形图数据集属性的文档中

某些属性可以指定为数组。如果这些设置为数组值,则第一个值适用于第一个柱线,第二个值适用于第二个柱线,依此类推。

解决方法:调用update方法设置新值:

var barChartData = {
    labels: ["January", "February", "March"],
    datasets: [
        {
            label: "My First dataset",
            fillColor: "rgba(220,220,220,0.5)", 
            strokeColor: "rgba(220,220,220,0.8)", 
            highlightFill: "rgba(220,220,220,0.75)",
            highlightStroke: "rgba(220,220,220,1)",
            data: [20, 59, 80]
        }
    ]
};

window.onload = function(){
    var ctx = document.getElementById("mycanvas").getContext("2d");
    window.myObjBar = new Chart(ctx).Bar(barChartData, {
          responsive : true
    });

    //nuevos colores
    myObjBar.datasets[0].bars[0].fillColor = "green"; //bar 1
    myObjBar.datasets[0].bars[1].fillColor = "orange"; //bar 2
    myObjBar.datasets[0].bars[2].fillColor = "red"; //bar 3
    myObjBar.update();
}
由于 myObjBar 是在 window.onload 中定义的,因此该代码在当前形式下不起作用,但它在主脚本流中使用,因此在我们尝试更改颜色时不会定义 myObjBar。但是,我将底部的颜色更改代码移动到与生成条形图的范围相同的范围内,这非常有效!我真的不想修改 chart.js 来获得如此简单的工作,所以我对这种方法很满意。编辑:我已经提交了对答案的编辑以应用我的修复,只需要等待它被批准。
2021-04-19 02:30:38
更新:这不适用于最新版本(2.0 +),但适用于 1.0.2
2021-04-21 02:30:38
更新:您需要分配“._saved.fillColor”以及“.fillColor” - 它使用 _saved 值在鼠标悬停(突出显示)后恢复 - 例如,如果您不分配新颜色,它会恢复原始颜色给它
2021-04-23 02:30:38
更正:它确实可以跨浏览器工作。只是你可以fillColor = "#FFFFFF;"在 Chrome 中,但最后的分号不应该在那里,FF 和 IE 不会接受它。
2021-04-25 02:30:38
不幸的是,这在 Firefox、IE 10 或 11 中似乎不起作用。这是一个 JSFiddle:jsfiddle.net/3fefqLko/1关于如何使其跨浏览器工作的任何想法?
2021-05-10 02:30:38

在查看 Chart.Bar.js 文件后,我设法找到了解决方案。我使用这个函数来生成随机颜色:

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

我已经将它添加到文件的末尾,我在“fillColor:”下调用了这个函数

helpers.each(dataset.data,function(dataPoint,index){
                    //Add a new point for each piece of data, passing any required data to draw.

所以现在看起来像这样:

helpers.each(dataset.data,function(dataPoint,index){
                    //Add a new point for each piece of data, passing any required data to draw.

                    datasetObject.bars.push(new this.BarClass({
                        value : dataPoint,
                        label : data.labels[index],
                        datasetLabel: dataset.label,
                        strokeColor : dataset.strokeColor,
                        fillColor : getRandomColor(),
                        highlightFill : dataset.highlightFill || dataset.fillColor,
                        highlightStroke : dataset.highlightStroke || dataset.strokeColor
                    }));
                },this);

它的工作原理我为每个条形获得不同的颜色。

您能否发布完整的解决方案(例如,使用数据和数据集变量等)?我正在做类似的事情,但我似乎无法复制您的解决方案。谢谢
2021-04-19 02:30:38
这绝对有帮助,谢谢!我没有意识到您正在修改实际的 Chart.js 文件,而不是您自己的代码。
2021-04-29 02:30:38
这是一个很好的解决方案,并不是 ChartJS 独有的。
2021-05-13 02:30:38
嘿@casey,这是完整的 Chart.Bar.js 文件(您需要替换的文件)。pastebin.com/G2Rf0BBn,我突出显示了造成差异的那条线。请注意,在底部有一个函数,该函数根据索引“i”从数组中返回不同的颜色。数据集保持不变(就像问题中的那个)。我希望它对你有帮助。
2021-05-17 02:30:38

如果您查看基于 Chart.js的库“ ChartNew ”,您可以通过将值作为数组传递来实现这一点,如下所示:

var data = {
    labels: ["Batman", "Iron Man", "Captain America", "Robin"],
    datasets: [
        {
            label: "My First dataset",
            fillColor: ["rgba(220,220,220,0.5)", "navy", "red", "orange"],
            strokeColor: "rgba(220,220,220,0.8)",
            highlightFill: "rgba(220,220,220,0.75)",
            highlightStroke: "rgba(220,220,220,1)",
            data: [2000, 1500, 1750, 50]
        }
    ]
};
非常感谢!不知道 fillColor 接受了一个数组。
2021-04-17 02:30:38
你的简单解决方案对我有用,谢谢,chartNew.js 对我来说非常好
2021-04-22 02:30:38
我们如何在 chartnew js 中更改 ingraphdatashow 颜色?
2021-04-30 02:30:38
2021-05-01 02:30:38

您可以调用此函数为每个条形生成随机颜色

var randomColorGenerator = function () { 
    return '#' + (Math.random().toString(16) + '0000000').slice(2, 8); 
};

var barChartData = {
        labels: ["001", "002", "003", "004", "005", "006", "007"],
        datasets: [
            {
                label: "My First dataset",
                fillColor: randomColorGenerator(), 
                strokeColor: randomColorGenerator(), 
                highlightFill: randomColorGenerator(),
                highlightStroke: randomColorGenerator(),
                data: [20, 59, 80, 81, 56, 55, 40]
            }
        ]
    };
感谢您提供此代码。我能够用它来改变条形本身的颜色。backgroundColor 选项允许这样做。
2021-04-24 02:30:38
嘿@Sudharshan 感谢您的回答,这将导致每个图表的颜色不同,但不会导致条形图中的每个条形,这是我想要的结果。有什么想法吗?
2021-05-03 02:30:38
在 2.8 版本中,您可以使用 function 设置 backgroundColor backgroundColor: randomColorGenerator,,而不是function的结果backgroundColor: randomColorGenerator(),该函数为每个项目调用,而不是为所有项目调用一次。
2021-05-15 02:30:38