Warna berbeda untuk setiap batang dalam diagram batang; ChartJS


91

Saya menggunakan ChartJS dalam proyek yang sedang saya kerjakan dan saya membutuhkan warna yang berbeda untuk setiap batang di Bagan Batang.

Berikut contoh kumpulan data diagram batang:

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

Apakah ada cara untuk mengecat setiap batang secara berbeda?


3
Untuk menghemat beberapa pengguliran, jawaban ini menyebutkan bahwa Anda dapat mengatur fillColorkumpulan data menjadi sebuah array, dan chart.js akan melakukan iterasi melalui array dengan memilih warna berikutnya untuk setiap batang yang digambar.
Hartley Brody

Jawaban:


71

Mulai v2, Anda cukup menentukan larik nilai yang sesuai dengan warna untuk setiap batang melalui backgroundColorproperti:

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

Hal ini juga memungkinkan untuk borderColor, hoverBackgroundColor, hoverBorderColor.

Dari dokumentasi di Properti Set Data Diagram Batang :

Beberapa properti dapat ditentukan sebagai larik. Jika ini disetel ke nilai larik, nilai pertama berlaku untuk bilah pertama, nilai kedua ke bilah kedua, dan seterusnya.


66

Solusi: panggil metode pembaruan untuk menetapkan nilai baru:

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
Kode ini tidak akan berfungsi dalam bentuknya saat ini karena myObjBar didefinisikan di window.onload tetapi digunakan dalam alur skrip utama, jadi myObjBar tidak akan ditentukan pada saat kami mencoba mengubah warna. Namun saya memindahkan kode perubahan warna di bagian bawah ke ruang lingkup yang sama seperti di mana bagan batang saya dibuat dan ini berfungsi dengan sempurna! Saya benar-benar tidak ingin memodifikasi chart.js untuk mendapatkan sesuatu yang sangat sederhana untuk dikerjakan, jadi saya sangat senang dengan metode ini. EDIT: Saya telah mengirimkan hasil edit ke jawaban untuk menerapkan perbaikan saya, hanya perlu menunggu sampai disetujui.
Joshua Walsh

Sayangnya, ini sepertinya tidak berfungsi di Firefox, atau IE 10 atau 11. Berikut JSFiddle: jsfiddle.net/3fefqLko/1 . Ada pemikiran tentang cara membuatnya berfungsi di seluruh browser?
Sam Fen

Koreksi: ini berfungsi di semua browser. Hanya saja Anda dapat melakukannya fillColor = "#FFFFFF;"di Chrome, tetapi titik koma terakhir tidak boleh ada di sana dan FF dan IE tidak akan menerimanya.
Sam Fen

5
Perbarui: Anda harus menetapkan "._saved.fillColor" serta ".fillColor" - ini menggunakan nilai _saved untuk memulihkan setelah gerakan mouse (sorotan) - misalnya mengembalikan warna ASLI jika Anda tidak menetapkan yang baru untuk itu

4
PEMBARUAN: ini tidak berfungsi dengan versi terbaru (2.0 +), tetapi bekerja dengan 1.0.2
Madan Bhandari

51

Setelah melihat file Chart.Bar.js, saya berhasil menemukan solusinya. Saya telah menggunakan fungsi ini untuk menghasilkan warna acak:

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

Saya telah menambahkannya ke akhir file dan saya memanggil fungsi ini tepat di dalam "fillColor:" di bawah

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

jadi sekarang terlihat seperti ini:

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

dan berhasil Saya mendapatkan warna berbeda untuk setiap batang.


1
Bisakah Anda memposting solusi lengkap Anda (misalnya dengan variabel data dan kumpulan data, dll.)? Saya ingin melakukan hal serupa, dan sepertinya saya tidak dapat meniru solusi Anda. Terima kasih
caseklim

hai @casey, ini adalah file Chart.Bar.js lengkap (yang perlu Anda ganti). pastebin.com/G2Rf0BBn , saya telah menyoroti garis yang membuat perbedaan tersebut. Perhatikan bahwa di bagian bawah terdapat fungsi yang mengembalikan warna berbeda dari larik sesuai dengan indeks "i". kumpulan data tetap sama (seperti yang ada di pertanyaan). Saya harap ini membantu Anda.
BoooYaKa

Itu pasti membantu, terima kasih! Saya tidak menyadari bahwa Anda memodifikasi file Chart.js yang sebenarnya, bukan kode Anda sendiri.
caseklim

Ini adalah solusi yang bagus dan tidak hanya untuk ChartJS.
crooksey

24

Jika Anda melihat pustaka " ChartNew " yang dibangun di atas Chart.js, Anda dapat melakukan ini dengan meneruskan nilai sebagai larik seperti:

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

solusi sederhana Anda berhasil untuk saya, terima kasih dan chartNew.js bekerja dengan baik untuk saya
Pratswinz

bagaimana kita bisa mengubah warna ingraphdatashow di chartnew js ??
Pratswinz


Terima kasih banyak! Tidak tahu fillColor menerima larik.
Francisco Quintero

18

Anda dapat memanggil fungsi ini yang menghasilkan warna acak untuk setiap batang

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
hai @Sudharshan terima kasih atas jawabannya, ini akan menghasilkan warna yang berbeda untuk setiap bagan tetapi tidak untuk setiap batang di dalam bagan batang, yang merupakan hasil yang saya inginkan. punya ide?
BoooYaKa

1
Terima kasih untuk kode ini. Saya bisa menggunakannya untuk mengubah warna batang itu sendiri. Opsi backgroundColor memungkinkan untuk ini.
spyke01

Di versi 2.8, Anda dapat mengatur backgroundColor dengan sebuah fungsi backgroundColor: randomColorGenerator,, bukan hasil dari sebuah fungsi backgroundColor: randomColorGenerator(),. Fungsi ini dipanggil untuk setiap item, bukan satu kali untuk semua.
negas

13

Di sini, saya memecahkan masalah ini dengan membuat dua fungsi.

1. dynamicColors () untuk menghasilkan warna acak

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 () untuk membuat susunan warna

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

Kalau begitu, lulus saja

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

13

Mulai Agustus 2019, Chart.js sekarang memiliki fungsionalitas bawaan ini.

Bagan batang yang sukses dengan batang berwarna berbeda

Anda hanya perlu menyediakan larik ke backgroundColor.

Contoh diambil dari https://www.chartjs.org/docs/latest/getting-started/

Sebelum:

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

Setelah:

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

Saya baru saja menguji metode ini dan berhasil. Setiap batang memiliki warna yang berbeda.


10

Hasilkan warna acak;

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

dan menyebutnya untuk setiap rekaman;

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

akhirnya mengatur warna;

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

4

Berikut adalah cara untuk menghasilkan warna acak yang konsisten menggunakan color-hash

const colorHash = new ColorHash()

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

masukkan deskripsi gambar di sini


3

berikut adalah cara saya menangani: Saya mendorong array "warna", dengan jumlah entri yang sama dari jumlah data. Untuk ini saya menambahkan fungsi "getRandomColor" di akhir skrip. Semoga membantu ...

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

Jika Anda tidak dapat menggunakan NewChart.js, Anda hanya perlu mengubah cara menyetel warna menggunakan array. Temukan iterasi helper di dalam Chart.js:

Ganti baris ini:

fillColor : dataset.fillColor,

Untuk yang ini:

fillColor : dataset.fillColor[index],

Kode yang dihasilkan:

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

Dan di js Anda:

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

Saya membuat subclass kustom dari kode barchart dan menambahkan kode serupa ke penginisialisasi untuk melakukan ini.
David Reynolds

1

coba ini :

  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

Ini berfungsi untuk saya di versi saat ini 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

Mengambil jawaban lain, berikut adalah perbaikan cepat jika Anda ingin mendapatkan daftar dengan warna acak untuk setiap batang:

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

Sekarang Anda dapat menggunakan fungsi ini di bidang backgroundColor dalam data:

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

1
Jawaban ini perlu diperbaiki. itu menyebabkan masalah bagi saya. Saya harus menulis ulang sebagai 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

Saya baru saja mendapat masalah ini baru-baru ini, dan inilah solusi saya

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

Kode berdasarkan permintaan pull berikut :

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

Ide yang sangat berguna - lebih dari sekedar memilih warna acak. Untuk meningkatkannya lebih jauh, ketika ada banyak batang, Anda juga dapat menyesuaikan nilai saturasi, sehingga alih-alih hanya berputar-putar pada roda warna, Anda dapat memutarnya.
Martin CR

0

Jika Anda mengetahui warna yang diinginkan, Anda dapat menentukan properti warna dalam larik, seperti:

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

-1

apa yang saya lakukan adalah membuat generator warna acak seperti yang disarankan di sini

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

dan kemudian memberi kode ini

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

Perhatikan tidak ada tanda kurung pada pemanggilan fungsi Ini memungkinkan kode untuk memanggil fungsi setiap saat, alih-alih membuat larik Ini juga mencegah kode menggunakan warna yang sama untuk semua batang


-9

Anda dapat menghasilkan dengan mudah dengan grafik
livegap Pilih Mulicolors dari menu Bar


(sumber: livegap.com )

** library grafik yang digunakan adalah chartnew.js versi modifikasi library
chart.js dengan kode chartnew.js akan menjadi seperti ini

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
Mengomentari "tinggalkan perpustakaan Anda dan gunakan yang lain ini" sama sekali tidak tepat.
jlh

chartnew.js adalah versi chart.js yang dimodifikasi. Saat ini multi warna tidak mendukung di chart.js tetapi tersedia di chartnew.js
Omar Sedki
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.