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?
javascript
chart.js
BoooYaKa
sumber
sumber
fillColor
kumpulan data menjadi sebuah array, dan chart.js akan melakukan iterasi melalui array dengan memilih warna berikutnya untuk setiap batang yang digambar.Jawaban:
Mulai v2, Anda cukup menentukan larik nilai yang sesuai dengan warna untuk setiap batang melalui
backgroundColor
properti: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 :
sumber
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(); }
sumber
fillColor = "#FFFFFF;"
di Chrome, tetapi titik koma terakhir tidak boleh ada di sana dan FF dan IE tidak akan menerimanya.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.
sumber
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] } ] };
sumber
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] } ] };
sumber
backgroundColor: randomColorGenerator,
, bukan hasil dari sebuah fungsibackgroundColor: randomColorGenerator(),
. Fungsi ini dipanggil untuk setiap item, bukan satu kali untuk semua.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 }]
sumber
Mulai Agustus 2019, Chart.js sekarang memiliki fungsionalitas bawaan ini.
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.
sumber
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) }] };
sumber
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)) }]
sumber
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; }
sumber
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:
Untuk yang ini:
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] } ]
sumber
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); } }); }
sumber
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();
}
sumber
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) }] }
sumber
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; }
.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 }] };
sumber
Kode berdasarkan permintaan pull berikut :
datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
sumber
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)', ... ],
sumber
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
sumber
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] } ] };
sumber