Çubuk grafikteki her çubuk için farklı renk; ChartJS


94

Üzerinde çalıştığım bir projede ChartJS kullanıyorum ve Çubuk Grafikteki her çubuk için farklı bir renge ihtiyacım var.

Çubuk grafik veri kümesinin bir örneğini burada bulabilirsiniz:

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

Her çubuğu farklı boyamanın bir yolu var mı?


3
Sizi biraz kaydırmadan kurtarmak için, bu cevapfillColor , bir veri kümesinin bir dizi olmasını ayarlayabileceğinizi belirtir ve chart.js, çizilen her çubuk için bir sonraki rengi seçerek dizi boyunca yinelenir.
Hartley Brody

Yanıtlar:


74

V2'den itibaren, backgroundColorözellik aracılığıyla her çubuk için bir renge karşılık gelen bir değerler dizisi belirtebilirsiniz :

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

Bu aynı zamanda mümkündür borderColor, hoverBackgroundColor, hoverBorderColor.

Çubuk Grafik Veri Kümesi Özellikleri hakkındaki belgelerden :

Bazı özellikler bir dizi olarak belirtilebilir. Bunlar bir dizi değerine ayarlanırsa, ilk değer ilk çubuğa, ikinci değer ikinci çubuğa vb. Uygulanır.


66

Çözüm: Yeni değerleri ayarlamak için güncelleme yöntemini çağırın:

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 içinde tanımlandığı için bu kod mevcut biçiminde çalışmaz, ancak ana komut dosyası akışında kullanılır, bu nedenle myObjBar renkleri değiştirmeye çalıştığımızda tanımlanmayacaktır. Bununla birlikte, alttaki renk değiştirme kodunu, çubuk grafiğimin oluşturulduğu yerle aynı kapsama taşıdım ve bu mükemmel çalışıyor! Çalışması bu kadar basit bir şey elde etmek için chart.js'yi değiştirmek zorunda kalmak istemedim, bu yüzden bu yöntemden çok memnunum. DÜZENLEME: Düzeltmemi uygulamak için yanıta bir düzenleme gönderdim, sadece onaylanmasını beklemem gerekiyor.
Joshua Walsh

Ne yazık ki, bu Firefox'ta veya IE 10 veya 11'de çalışmıyor gibi görünüyor. İşte bir JSFiddle: jsfiddle.net/3fefqLko/1 . Tarayıcılarda nasıl çalıştırılacağına dair herhangi bir fikriniz var mı?
Sam Fen

Düzeltme: tarayıcılar arasında çalışır. Sadece fillColor = "#FFFFFF;"Chrome'da yapabilirsiniz , ancak son noktalı virgül orada olmamalıdır ve FF ve IE bunu kabul etmez.
Sam Fen

5
Güncelleme: "._saved.fillColor" ve ".fillColor" atamalısınız - fareyle üzerine geldikten (vurgulama) sonra geri yüklemek için _saved değeri kullanır - örneğin, yenisini atamazsanız ORİJİNAL rengi geri yükler ona

4
GÜNCELLEME: Bu, en son sürümle (2.0 +) çalışmıyor, ancak 1.0.2 ile çalışıyor
Madan Bhandari

52

Chart.Bar.js dosyasına baktıktan sonra çözümü bulmayı başardım. Bu işlevi rastgele bir renk oluşturmak için kullandım:

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

Dosyanın sonuna ekledim ve bu işlevi doğrudan "fillColor:" altında

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

şimdi şöyle görünüyor:

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

ve çalışıyor Her çubuk için farklı renk alıyorum.


1
Tam çözümünüzü gönderebilir misiniz (örn. Veri ve veri kümesi değişkenleri vb. İle)? Ben de benzer bir şey yapmak istiyorum ve çözümünüzü kopyalayamıyorum. Teşekkürler
caseklim

hey @casey, bu tam Chart.Bar.js dosyasıdır (değiştirmeniz gereken dosya). pastebin.com/G2Rf0BBn , farkı yaratan çizgiyi vurguladım. dipte "i" indeksine göre bir diziden farklı renk döndüren bir işlev olduğunu unutmayın. veri kümesi aynı kalır (sorudaki gibi). Umarım yardımcı olmuştur.
BoooYaKa

Bu kesinlikle yardımcı olur, teşekkürler! Kendi kodunuz yerine gerçek Chart.js dosyasını değiştirdiğinizi fark etmemiştim.
caseklim

Bu harika bir çözümdür ve ChartJS'ye özgü değildir.
crooksey

24

Chart.js üzerine inşa edilen " ChartNew " kitaplığına bakarsanız, bunu, değerleri bir dizi olarak ileterek yapabilirsiniz:

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

basit çözümünüz benim için çalıştı, teşekkürler ve chartNew.js benim için mükemmel çalışıyor
Pratswinz

chartnew js'de ingraphdatashow rengini nasıl değiştirebiliriz ??
Pratswinz


Çok teşekkürler! FillColor'un bir diziyi kabul ettiğini bilmiyordum.
Francisco Quintero

18

Her çubuk için rastgele renkler oluşturan bu işlevi çağırabilirsiniz.

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 Cevabınız için teşekkürler, bu her grafik için farklı bir renkle sonuçlanacak, ancak çubuk grafiğin içindeki her bir çubuk için değil, bu benim istediğim sonuç. herhangi bir fikrin var mı?
BoooYaKa

1
Bu kod için teşekkürler. Bunu çubukların rengini değiştirmek için kullanabildim. BackgroundColor seçeneği buna izin verir.
spyke01

2.8 sürümünde, backgroundColor'ı bir işlevin backgroundColor: randomColorGenerator,sonucu yerine bir işlevle ayarlayabilirsiniz backgroundColor: randomColorGenerator(),. İşlev, tümü için bir kez yerine her öğe için çağrılır.
negas

14

Ağustos 2019 itibariyle, Chart.js artık bu işlevselliğe sahiptir.

Farklı renkli çubuklarla başarılı çubuk grafik

Sadece backgroundColor'a bir dizi sağlamanız gerekir.

Https://www.chartjs.org/docs/latest/getting-started/ adresinden alınan örnek

Önce:

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

Sonra:

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

Bu yöntemi henüz test ettim ve işe yarıyor. Her çubuğun farklı bir rengi vardır.


13

Burada iki işlev yaparak bu sorunu çözdüm.

1. dynamicColors () rastgele renk oluşturmak için

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 () renk dizisi oluşturmak için

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

Öyleyse geç

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

10

Rastgele renkler oluşturun;

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

ve her kayıt için çağırın;

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

sonunda renkleri ayarlayın;

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

4

İşte renk karması kullanarak tutarlı rastgele renkler oluşturmanın bir yolu

const colorHash = new ColorHash()

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

görüntü açıklamasını buraya girin


3

işte böyle başa çıktım: Veri sayısıyla aynı sayıda girdiye sahip "renkler" dizisi ittim. Bunun için betiğin sonuna bir "getRandomColor" işlevi ekledim. Umarım yardımcı olur...

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'yi kullanamıyorsanız, bunun yerine dizi kullanarak rengi ayarlamanın yolunu değiştirmeniz yeterlidir. Chart.js içindeki yardımcı yinelemeyi bulun:

Bu satırı değiştirin:

fillColor : dataset.fillColor,

Bunun için:

fillColor : dataset.fillColor[index],

Ortaya çıkan kod:

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

Ve js'nizde:

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

Barchart kodunun özel bir alt sınıfını oluşturdum ve bunu yapmak için başlatıcıya benzer bir kod ekledim.
David Reynolds

1

bunu dene :

  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

Bu benim için geçerli sürümde çalışıyor 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

Diğer yanıtı ele alırsak, her çubuk için rastgele renkler içeren bir liste almak istiyorsanız işte hızlı bir düzeltme:

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

Artık bu işlevi verilerdeki backgroundColor alanında kullanabilirsiniz:

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

1
Bu yanıtın üzerinde çalışılması gerekiyor. benim için sorunlara yol açar. Olarak yeniden yazmak zorunda kaldım 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

Bu sorunu yeni aldım ve işte çözümüm

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

Aşağıdaki çekme talebine dayalı kod :

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

Çok faydalı bir fikir - rastgele renkler seçmekten çok daha fazlası. Bunu daha da iyileştirmek için, çok sayıda çubuk olduğunda doygunluk değerini de ayarlayabilirsiniz, böylece renk tekerleğinde sadece daire çizmek yerine, onu sarmal hale getirirsiniz.
Martin CR

0

Hangi renkleri istediğinizi biliyorsanız, bir dizide renk özelliklerini belirtebilirsiniz, örneğin:

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

-1

Yaptığım şey, burada birçok kişinin önerdiği gibi rastgele bir renk oluşturucu

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

ve sonra bunu kodladı

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

İşlev çağrısında parantez olmadığına dikkat edin Bu, kodun bir dizi oluşturmak yerine işlevi her seferinde çağırmasını sağlar Bu ayrıca kodun tüm çubuklar için aynı rengi kullanmasını engeller


-9

Canlı aralık grafikleri ile kolayca üretebilirsiniz
Bar menüsünden Mulicolors seçin


(kaynak: livegap.com )

** kullanılan grafik kitaplığı, chartnew.js ile değiştirilmiş chart.js kitaplığı sürümüdür ve
chartnew.js koduyla böyle bir şey olacaktır

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
"Kitaplığınızdan kurtulun ve diğerini kullanın" şeklinde yorum yapmak, sorunun ana fikrini tamamen kaçırır.
jlh

chartnew.js, chart.js'nin değiştirilmiş bir sürümüdür. Bu süre içinde çok renkli chart.js desteklemeyen ama chartnew.js içinde availble
Ömer Sedki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.