Màu khác nhau cho mỗi thanh trong biểu đồ thanh; ChartJS


90

Tôi đang sử dụng ChartJS trong một dự án mà tôi đang thực hiện và tôi cần một màu khác nhau cho mỗi thanh trong Biểu đồ thanh.

Dưới đây là một ví dụ về tập dữ liệu biểu đồ thanh:

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]
  }]
};

Có cách nào để sơn mỗi thanh khác nhau không?


3
Để tiết kiệm cho bạn một số thao tác cuộn, câu trả lời này đề cập rằng bạn có thể đặt fillColortập dữ liệu thành một mảng và chart.js sẽ lặp qua mảng và chọn màu tiếp theo cho mỗi thanh được vẽ.
Hartley Brody

Câu trả lời:


69

Kể từ v2, bạn chỉ cần chỉ định một mảng giá trị tương ứng với một màu cho mỗi thanh thông qua thuộc backgroundColortính:

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

Đây cũng là có thể cho borderColor, hoverBackgroundColor, hoverBorderColor.

Từ tài liệu về Thuộc tính tập dữ liệu biểu đồ thanh :

Một số thuộc tính có thể được chỉ định dưới dạng một mảng. Nếu chúng được đặt thành giá trị mảng, giá trị đầu tiên áp dụng cho thanh đầu tiên, giá trị thứ hai cho thanh thứ hai, v.v.


66

Giải pháp: gọi phương thức cập nhật để đặt giá trị mới:

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();
}

1
Mã này sẽ không hoạt động ở dạng hiện tại vì myObjBar được định nghĩa trong window.onload nhưng nó được sử dụng trong luồng kịch bản chính, vì vậy myObjBar sẽ không được xác định vào thời điểm chúng tôi cố gắng thay đổi màu sắc. Tuy nhiên, tôi đã chuyển mã thay đổi màu ở dưới cùng vào cùng phạm vi với nơi biểu đồ thanh của tôi được tạo và điều này hoạt động hoàn hảo! Tôi thực sự không muốn phải sửa đổi chart.js để có một thứ gì đó quá đơn giản để hoạt động, vì vậy tôi rất hài lòng với phương pháp này. CHỈNH SỬA: Tôi đã gửi bản chỉnh sửa cho câu trả lời để áp dụng bản sửa lỗi của mình, chỉ cần đợi nó được chấp thuận.
Joshua Walsh

Thật không may, điều này dường như không hoạt động trong Firefox hoặc IE 10 hoặc 11. Đây là JSFiddle: jsfiddle.net/3fefqLko/1 . Bất kỳ suy nghĩ nào về cách làm cho nó hoạt động trên các trình duyệt?
Sam Fen

Sửa lại: nó hoạt động trên các trình duyệt. Nó chỉ là bạn có thể làm fillColor = "#FFFFFF;"trong Chrome, nhưng dấu chấm phẩy cuối cùng không nên ở đó và FF và IE sẽ không chấp nhận nó.
Sam Fen

5
Cập nhật: bạn sẽ cần gán "._saved.fillColor" cũng như ".fillColor" - nó sử dụng giá trị _saved để khôi phục sau khi di chuột qua (tô sáng) - ví dụ: nó khôi phục màu GỐC nếu bạn không chỉ định màu mới với nó

4
UPDATE: đây không phải là làm việc với phiên bản mới nhất (2.0 +), nhưng làm việc với 1.0.2
Madan Bhandari

51

Sau khi xem xét tệp Chart.Bar.js, tôi đã tìm ra giải pháp. Tôi đã sử dụng hàm này để tạo màu ngẫu nhiên:

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

Tôi đã thêm nó vào cuối tệp và tôi đã gọi hàm này ngay bên trong "fillColor:" dưới

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

vì vậy bây giờ nó trông như thế này:

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);

và nó hoạt động Tôi nhận được màu khác nhau cho mỗi thanh.


1
Bạn có thể đăng giải pháp đầy đủ của mình (ví dụ với các biến dữ liệu và tập dữ liệu, v.v.)? Tôi đang tìm cách làm điều gì đó tương tự và dường như tôi không thể lặp lại giải pháp của bạn. Cảm ơn
caseklim

hey @casey, đây là tệp Chart.Bar.js đầy đủ (tệp bạn cần thay thế). pastebin.com/G2Rf0BBn , Ive đã đánh dấu dòng tạo ra sự khác biệt. lưu ý rằng ở phần mông có một hàm trả về màu khác với mảng theo chỉ số "i". tập dữ liệu vẫn giữ nguyên (giống như tập dữ liệu trong câu hỏi). Tôi hy vọng nó đã giúp bạn.
BoooYaKa

Điều đó chắc chắn hữu ích, cảm ơn bạn! Tôi không nhận ra rằng bạn đang sửa đổi tệp Chart.js thực, chứ không phải mã của riêng bạn.
caseklim

Đây là một giải pháp tuyệt vời và không phải là duy nhất của ChartJS.
crooksey

24

Nếu bạn xem thư viện " ChartNew " được xây dựng dựa trên Chart.js, bạn có thể thực hiện việc này bằng cách chuyển các giá trị vào dưới dạng một mảng như sau:

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]
        }
    ]
};

giải pháp đơn giản của bạn đã làm việc cho tôi, cảm ơn và chartNew.js hoạt động hoàn toàn tốt đối với tôi
Pratswinz

Làm thế nào chúng ta có thể thay đổi màu ingraphdatashow trong chartnew js ??
Pratswinz


Cảm ơn rất nhiều! Không biết fillColor đã chấp nhận một mảng.
Francisco Quintero

18

Bạn có thể gọi hàm này tạo ra màu ngẫu nhiên cho mỗi thanh

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]
            }
        ]
    };

2
hey @Sudharshan, cảm ơn vì câu trả lời, điều này sẽ dẫn đến màu sắc khác nhau cho mỗi biểu đồ nhưng không phải cho mỗi thanh đơn bên trong biểu đồ thanh, đó là kết quả mong muốn của tôi. có ý kiến ​​gì không?
BoooYaKa

1
Cảm ơn vì mã này. Tôi đã có thể sử dụng nó để thay đổi màu sắc của chính các thanh. Tùy chọn backgroundColor cho phép điều này.
spyke 01

Trong phiên bản 2.8, bạn có thể đặt backgroundColor bằng một hàm backgroundColor: randomColorGenerator,, thay vì kết quả của một hàm backgroundColor: randomColorGenerator(),. Hàm được gọi cho từng mục thay vì một lần cho tất cả.
negas 17/07/19

13

Kể từ tháng 8 năm 2019, Chart.js hiện đã tích hợp sẵn chức năng này.

Biểu đồ thanh thành công với các thanh màu khác nhau

Bạn chỉ cần cung cấp một mảng cho backgroundColor.

Ví dụ được lấy từ https://www.chartjs.org/docs/latest/getting-started/

Trước:

  data: {
        labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
        datasets: [{
            label: 'My First dataset',
            backgroundColor: 'rgb(255, 99, 132)',
            borderColor: 'rgb(255, 99, 132)',
            data: [0, 10, 5, 2, 20, 30, 45]
        }]
    },

Sau:

  data: {
        labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
        datasets: [{
            label: 'My First dataset',
            backgroundColor: ['rgb(255, 99, 132)','rgb(0, 255, 0)','rgb(255, 99, 132)','rgb(128, 255, 0)','rgb(0, 255, 255)','rgb(255, 255, 0)','rgb(255, 255, 128)'],
            borderColor: 'rgb(255, 99, 132)',
            data: [0, 10, 5, 2, 20, 30, 45]
        }]
    },

Tôi vừa thử nghiệm phương pháp này và nó hoạt động. Mỗi thanh có một màu khác nhau.


12

Ở đây, tôi đã giải quyết vấn đề này bằng cách tạo hai hàm.

1. dynamicColors () để tạo màu ngẫu nhiên

function dynamicColors() {
    var r = Math.floor(Math.random() * 255);
    var g = Math.floor(Math.random() * 255);
    var b = Math.floor(Math.random() * 255);
    return "rgba(" + r + "," + g + "," + b + ", 0.5)";
}

2. poolColors () để tạo mảng màu

function poolColors(a) {
    var pool = [];
    for(i = 0; i < a; i++) {
        pool.push(dynamicColors());
    }
    return pool;
}

Sau đó, chỉ cần vượt qua nó

datasets: [{
    data: arrData,
    backgroundColor: poolColors(arrData.length),
    borderColor: poolColors(arrData.length),
    borderWidth: 1
}]

10

Tạo màu sắc ngẫu nhiên;

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

và gọi nó cho mỗi bản ghi;

function getRandomColorEachEmployee(count) {
    var data =[];
    for (var i = 0; i < count; i++) {
        data.push(getRandomColor());
    }
    return data;
}

cuối cùng thiết lập màu sắc;

var data = {
    labels: jsonData.employees, // your labels
    datasets: [{
        data: jsonData.approvedRatios, // your data
        backgroundColor: getRandomColorEachEmployee(jsonData.employees.length)
    }]
};

4

Đây là một cách để tạo ra các màu ngẫu nhiên nhất quán bằng cách sử dụng hash màu

const colorHash = new ColorHash()

const datasets = [{
  label: 'Balance',
  data: _.values(balances),
  backgroundColor: _.keys(balances).map(name => colorHash.hex(name))
}]

nhập mô tả hình ảnh ở đây


3

đây là cách tôi xử lý: Tôi đã đẩy một mảng "màu sắc", với số mục nhập bằng số lượng dữ liệu. Đối với điều này, tôi đã thêm một hàm "getRandomColor" vào cuối tập lệnh. Hy vọng nó giúp...

for (var i in arr) {
    customers.push(arr[i].customer);
    nb_cases.push(arr[i].nb_cases);
    colors.push(getRandomColor());
}

window.onload = function() {
    var config = {
        type: 'pie',
        data: {
            labels: customers,
            datasets: [{
                label: "Nomber of cases by customers",
                data: nb_cases,
                fill: true,
                backgroundColor: colors 
            }]
        },
        options: {
            responsive: true,
            title: {
                display: true,
                text: "Cases by customers"
            },
        }
    };

    var ctx = document.getElementById("canvas").getContext("2d");
    window.myLine = new Chart(ctx, config);
};

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

2

Nếu bạn không thể sử dụng NewChart.js, bạn chỉ cần thay đổi cách đặt màu bằng mảng. Tìm lần lặp lại trình trợ giúp bên trong Chart.js:

Thay thế dòng này:

fillColor : dataset.fillColor,

Đối với cái này:

fillColor : dataset.fillColor[index],

Mã kết quả:

//Iterate through each of the datasets, and build this into a property of the chart
  helpers.each(data.datasets,function(dataset,datasetIndex){

    var datasetObject = {
      label : dataset.label || null,
      fillColor : dataset.fillColor,
      strokeColor : dataset.strokeColor,
      bars : []
    };

    this.datasets.push(datasetObject);

    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,
        //Replace this -> fillColor : dataset.fillColor,
        // Whith the following:
        fillColor : dataset.fillColor[index],
        highlightFill : dataset.highlightFill || dataset.fillColor,
        highlightStroke : dataset.highlightStroke || dataset.strokeColor
      }));
    },this);

  },this);

Và trong js của bạn:

datasets: [
                {
                  label: "My First dataset",
                  fillColor: ["rgba(205,64,64,0.5)", "rgba(220,220,220,0.5)", "rgba(24,178,235,0.5)", "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: [2000, 1500, 1750, 50]
                }
              ]

Tôi đã tạo một lớp con tùy chỉnh của mã vạch và thêm mã tương tự vào trình khởi tạo để thực hiện việc này.
David Reynolds

1

thử đi :

  function getChartJs() {
        **var dynamicColors = function () {
            var r = Math.floor(Math.random() * 255);
            var g = Math.floor(Math.random() * 255);
            var b = Math.floor(Math.random() * 255);
            return "rgb(" + r + "," + g + "," + b + ")";
        }**

        $.ajax({
            type: "POST",
            url: "ADMIN_DEFAULT.aspx/GetChartByJenisKerusakan",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {
                var labels = r.d[0];
                var series1 = r.d[1];
                var data = {
                    labels: r.d[0],
                    datasets: [
                        {
                            label: "My First dataset",
                            data: series1,
                            strokeColor: "#77a8a8",
                            pointColor: "#eca1a6"
                        }
                    ]
                };

                var ctx = $("#bar_chart").get(0).getContext('2d');
                ctx.canvas.height = 300;
                ctx.canvas.width = 500;
                var lineChart = new Chart(ctx).Bar(data, {
                    bezierCurve: false,
                    title:
                      {
                          display: true,
                          text: "ProductWise Sales Count"
                      },
                    responsive: true,
                    maintainAspectRatio: true
                });

                $.each(r.d, function (key, value) {
                    **lineChart.datasets[0].bars[key].fillColor = dynamicColors();
                    lineChart.datasets[0].bars[key].fillColor = dynamicColors();**
                    lineChart.update();
                });
            },
            failure: function (r) {
                alert(r.d);
            },
            error: function (r) {
                alert(r.d);
            }
        });
    }

1

Điều này phù hợp với tôi trong phiên bản hiện tại 2.7.1:

function colorizePercentageChart(myObjBar) {

var bars = myObjBar.data.datasets[0].data;
console.log(myObjBar.data.datasets[0]);
for (i = 0; i < bars.length; i++) {

    var color = "green";

    if(parseFloat(bars[i])  < 95){
        color = "yellow";
    }
    if(parseFloat(bars[i])  < 50){
         color = "red";
    }

    console.log(color);
    myObjBar.data.datasets[0].backgroundColor[i] = color;

}
myObjBar.update(); 

}


1

Lấy câu trả lời khác, đây là một bản sửa lỗi nhanh nếu bạn muốn nhận danh sách với các màu ngẫu nhiên cho mỗi thanh:

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

Bây giờ bạn có thể sử dụng hàm này trong trường backgroundColor trong dữ liệu:

data: {
        labels: count[0],
        datasets: [{
            label: 'Registros en BDs',
            data: count[1],
            backgroundColor: getRandomColor(count[1].length)
        }]
}

1
Câu trả lời này cần phải làm việc. nó dẫn đến các vấn đề cho tôi. Tôi đã phải viết lại nó như function getRandomColor(n) { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; }.
Sedrick

0

Tôi vừa gặp sự cố này gần đây và đây là giải pháp của tôi

var labels = ["001", "002", "003", "004", "005", "006", "007"];
var data = [20, 59, 80, 81, 56, 55, 40];
for (var i = 0, len = labels.length; i < len; i++) {
   background_colors.push(getRandomColor());// I use @Benjamin method here
}

var barChartData = {
  labels: labels,
  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)",
    backgroundColor: background_colors,
    data: data
  }]
};

0

Mã dựa trên yêu cầu kéo sau :

datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';

Ý tưởng rất hữu ích - hơn thế nữa so với việc chỉ chọn màu sắc ngẫu nhiên. Để cải thiện điều này hơn nữa, khi có một số lượng lớn các thanh, bạn cũng có thể điều chỉnh giá trị độ bão hòa, để thay vì chỉ xoay tròn trên bánh xe màu, bạn xoắn ốc vào đó.
Martin CR

0

Nếu bạn biết mình muốn màu nào, bạn có thể chỉ định thuộc tính màu trong một mảng, như sau:

    backgroundColor: [
    'rgba(75, 192, 192, 1)',
    ...
    ],
    borderColor: [
    'rgba(75, 192, 192, 1)',
    ...
    ],

0

những gì tôi đã làm là tạo một trình tạo màu ngẫu nhiên như nhiều người ở đây đã đề xuất

function dynamicColors() {
        var r = Math.floor(Math.random() * 255);
        var g = Math.floor(Math.random() * 255);
        var b = Math.floor(Math.random() * 255);
        return "rgba(" + r + "," + g + "," + b + ", 0.5)";
    }

và sau đó mã hóa cái này

var chartContext = document.getElementById('line-chart');
    let lineChart = new Chart(chartContext, {
        type: 'bar',
        data : {
            labels: <?php echo json_encode($names); ?>,
            datasets: [{
                data : <?php echo json_encode($salaries); ?>,
                borderWidth: 1,
                backgroundColor: dynamicColors,
            }]
        }
        ,
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero: true
                    }
                }]
            },
            responsive: true,
            maintainAspectRatio: false,
        }
    });

Lưu ý rằng không có tham số nào khi gọi hàm Điều này cho phép mã gọi hàm mọi lúc, thay vì tạo một mảng Điều này cũng ngăn mã sử dụng cùng một màu cho tất cả các thanh


-8

Bạn có thể tạo dễ dàng với biểu đồ
livegap Chọn Mulicolors từ menu Bar


(source: livegap.com )

** thư viện biểu đồ được sử dụng là chartnew.js phiên bản sửa đổi của thư viện
chart.js với mã chartnew.js sẽ như thế này

var barChartData = {
        labels: ["001", "002", "003", "004", "005", "006", "007"],
        datasets: [
            {
                label: "My First dataset",
                fillColor: ["rgba(0,10,220,0.5)","rgba(220,0,10,0.5)","rgba(220,0,0,0.5)","rgba(120,250,120,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]
            }
        ]
    };

3
Nhận xét "bỏ thư viện của bạn và sử dụng thư viện này khác" hoàn toàn không đúng ý của câu hỏi.
jlh 14/03/17

chartnew.js là một phiên bản sửa đổi của chart.js. trong thời gian này đa màu sắc không được hỗ trợ trong chart.js nhưng availble trong chartnew.js
Omar Sedki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.