막대 차트의 각 막대에 대해 다른 색상; ChartJS


90

작업중인 프로젝트에서 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]
  }]
};

각 막대를 다르게 칠할 수있는 방법이 있습니까?


3
스크롤을 절약하기 위해이 답변fillColor 은 데이터 세트의를 배열로 설정할 수 있으며 chart.js는 그려진 각 막대에 대해 다음 색상을 선택하는 배열을 반복합니다.
Hartley Brody

답변:


69

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.

Bar Chart Dataset Properties 에 대한 문서에서 :

일부 속성은 배열로 지정할 수 있습니다. 이러한 값이 배열 값으로 설정되면 첫 번째 값은 첫 번째 막대에 적용되고 두 번째 값은 두 번째 막대에 적용되는 식입니다.


66

해결 방법 : 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();
}

1
myObjBar는 window.onload에 정의되어 있지만 기본 스크립트 흐름에서 사용되므로이 코드는 현재 형식에서 작동하지 않습니다. 따라서 myObjBar는 색상을 변경하려고 할 때 정의되지 않습니다. 그러나 하단의 색상 변경 코드를 막대 차트가 생성 된 곳과 동일한 범위로 옮겼는데 이것은 완벽하게 작동합니다! 너무 간단한 작업을 위해 chart.js를 수정하고 싶지 않았기 때문에이 방법에 매우 만족합니다. 편집 : 수정 사항을 적용하기 위해 답변에 대한 편집을 제출했습니다. 승인 될 때까지 기다려야합니다.
Joshua Walsh

불행히도 이것은 Firefox, IE 10 또는 11에서 작동하지 않는 것 같습니다. 여기 JSFiddle : jsfiddle.net/3fefqLko/1 입니다. 브라우저에서 작동하도록 만드는 방법에 대한 의견이 있으십니까?
Sam Fen

수정 : 브라우저에서 작동합니다. fillColor = "#FFFFFF;"Chrome에서 할 수 있지만 마지막 세미콜론이 없어야하며 FF와 IE는이를 허용하지 않습니다.
Sam Fen

5
업데이트 : "._saved.fillColor"뿐만 아니라 ".fillColor"도 할당해야합니다.-_saved 값을 사용하여 마우스 오버 후 복원 (강조 표시)-예를 들어 새 색상을 할당하지 않으면 원래 색상으로 복원됩니다. 그것에

4
업데이트 :이 최신 버전 (2.0 +)와 함께 작업하지만, 1.0.2 작동하지 않습니다
마단 반 다리

51

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

그리고 그것은 각 막대에 대해 다른 색상을 얻습니다.


1
전체 솔루션을 게시 할 수 있습니까 (예 : 데이터 및 데이터 세트 변수 등)? 비슷한 일을하려고하는데 솔루션을 복제 할 수없는 것 같습니다. 감사합니다
caseklim 2014 년

@casey, 이것은 전체 Chart.Bar.js 파일입니다 (교체해야하는 파일). pastebin.com/G2Rf0BBn , Ive는 차이를 만드는 선을 강조 표시했습니다. buttom에는 인덱스 "i"에 따라 배열에서 다른 색상을 반환하는 함수가 있습니다. 데이터 세트는 동일하게 유지됩니다 (질문에있는 것과 동일). 도움이 되었기를 바랍니다.
BoooYaKa 2014 년

확실히 도움이됩니다. 감사합니다! 자신의 코드가 아닌 실제 Chart.js 파일을 수정하고 있다는 사실을 몰랐습니다.
caseklim 2014 년

이것은 훌륭한 솔루션이며 ChartJS에만 국한되지 않습니다.
crooksey

24

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

귀하의 간단한 솔루션이 저에게 효과적이었습니다. 감사합니다. chartNew.js는 저에게 완벽하게 잘 작동합니다.
Pratswinz

chartnew js에서 ingraphdatashow 색상을 어떻게 변경할 수 있습니까 ??
Pratswinz


감사합니다! fillColor가 배열을 허용하는지 몰랐습니다.
Francisco Quintero 2016 년

18

각 막대에 대해 임의의 색상을 생성하는이 함수를 호출 할 수 있습니다.

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
헤이 @Sudharshan 대답에 감사드립니다. 이것은 각 차트에 대해 다른 색상을 생성하지만 막대 차트 내부의 각 단일 막대에 대해서는 그렇지 않습니다. 어떤 아이디어가 있습니까?
BoooYaKa 2014 년

1
이 코드에 감사드립니다. 막대 자체의 색상을 변경하는 데 사용할 수있었습니다. backgroundColor 옵션은 이것을 허용합니다.
spyke01

버전 2.8에서는 함수 backgroundColor: randomColorGenerator,의 결과 대신 함수 를 사용하여 backgroundColor를 설정할 수 있습니다 backgroundColor: randomColorGenerator(),. 이 함수는 모두에 대해 한 번이 아니라 각 항목에 대해 호출됩니다.
negas

13

여기서는 두 가지 기능을 만들어이 문제를 해결했습니다.

1. dynamicColors () 임의의 색상 생성

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 ()를 사용하여 색상 배열 생성

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

그럼 그냥 통과 해

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

13

2019 년 8 월부터 Chart.js에는이 기능이 내장되어 있습니다.

다양한 색상의 막대가있는 성공적인 막대 차트

backgroundColor에 배열을 제공하기 만하면됩니다.

https://www.chartjs.org/docs/latest/getting-started/ 에서 가져온 예

전에:

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

후:

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

방금이 방법을 테스트했는데 작동합니다. 막대마다 색상이 다릅니다.


10

임의의 색상 생성;

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

각 레코드에 대해 호출합니다.

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

마지막으로 색상을 설정하십시오.

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

4

색상 해시를 사용하여 일관된 임의의 색상 을 생성하는 방법은 다음과 같습니다.

const colorHash = new ColorHash()

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

여기에 이미지 설명 입력


3

내가 처리 한 방법은 다음과 같습니다. 데이터 수와 동일한 수의 항목을 사용하여 배열 "색상"을 푸시했습니다. 이를 위해 스크립트 끝에 "getRandomColor"함수를 추가했습니다. 도움이 되길 바랍니다 ...

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

NewChart.js를 사용할 수없는 경우 대신 배열을 사용하여 색상을 설정하는 방법을 변경하면됩니다. Chart.js에서 도우미 반복을 찾습니다.

다음 줄을 바꿉니다.

fillColor : dataset.fillColor,

이 경우 :

fillColor : dataset.fillColor[index],

결과 코드 :

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

그리고 당신의 js에서 :

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

바코드 코드의 사용자 지정 하위 클래스를 만들고이를 수행하기 위해 이니셜 라이저에 유사한 코드를 추가했습니다.
David Reynolds

1

이 시도 :

  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

이것은 현재 버전에서 나를 위해 작동합니다 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

다른 대답을 취하면 각 막대에 대해 임의의 색상이있는 목록을 얻으려면 다음과 같은 빠른 수정이 있습니다.

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

이제 데이터의 backgroundColor 필드에서이 함수를 사용할 수 있습니다.

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

1
이 답변은 작업이 필요합니다. 그것은 나에게 문제를 일으킨다. 나는 그것을 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

최근에이 문제가 발생했으며 여기에 내 해결책이 있습니다.

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

다음 pull 요청을 기반으로하는 코드 :

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

매우 유용한 아이디어-임의의 색상을 선택하는 것 이상입니다. 이를 더욱 개선하려면 막대 수가 많을 때 채도 값도 조정할 수 있으므로 색상환에서 둥글게 둥글게 둥글게하는 대신 나선형으로 감을 수 있습니다.
Martin CR

0

원하는 색상을 알고 있으면 다음과 같이 배열에 색상 속성을 지정할 수 있습니다.

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

-1

내가 한 일은 여기에 많은 사람들이 제안한 무작위 색상 생성기를 만드는 것입니다.

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

그리고 이것을 코딩했습니다.

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

함수 호출에 괄호가 없습니다. 이렇게하면 코드가 배열을 만드는 대신 매번 함수를 호출 할 수 있습니다. 또한 코드가 모든 막대에 동일한 색상을 사용하는 것을 방지합니다.


-9

Livegap 차트로 쉽게 생성 할 수 있습니다.
Bar 메뉴에서 Mulicolors를 선택하세요.


(출처 : livegap.com )

** 사용 된 차트 라이브러리는 chartnew.js
입니다. chartnew.js 코드가있는 chart.js 라이브러리의 수정 된 버전은 다음과 같습니다.

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
"라이브러리를 버리고 다른 라이브러리를 사용하라"는 코멘트는 질문의 요점을 완전히 놓친다.
jlh

chartnew.js는 chart.js의 수정 된 버전입니다. 이 시간 멀티 색상은 chart.js에서 지원하지했지만 chartnew.js에서의 availble
오마르 Sedki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.