Различные цвета для каждого бара в гистограмме; ChartJS
Я использую 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]
}]
};
есть ли способ покрасить каждый бар по-разному?
14 ответов:
решение: вызовите метод 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(); }
после просмотра диаграммы.Бар.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);и это работает, я получаю различные цвета для каждого бара.
Если вы посмотрите на библиотеку"ChartNew", которая строится на графике.js вы можете сделать это, передав значения в виде массива следующим образом:
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] } ] };
начиная с версии 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.из документации на Свойства Набора Данных Гистограммы:
некоторые свойства могут быть заданы в виде массива. Если они установлены в значение массива, первое значение применяется к первому бару, второе значение к второй бар, и так далее.
вы можете вызвать эту функцию, которая генерирует случайные цвета для каждого бара
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] } ] };
генерировать случайные цвета;
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) } ] };
если вы не можете использовать NewChart.js вам просто нужно изменить способ установки цвета с помощью массива вместо этого. Найдите вспомогательную итерацию внутри диаграммы.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] } ]
здесь я решил эту проблему, сделав две функции. 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)";}
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 }]
попробуйте это :
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); } }); }
Я только что получил эту проблему в последнее время, и вот мое решение
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 }] };
код, основанный на следующее pull-запрос:
datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
это работает для меня в текущей версии
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();}
вот как я хотел: Я нажал массив "цвета", с таким же количеством записей, чем количество данных. Для этого я добавил функцию "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; }
вы можете легко создать с графики livegap
Выберите Mulicolors из менюhttp://charts.livegap.com/Gallery/images/Chart-14.png
** используется библиотека диаграмм chartnew.js модифицированный вариант диаграммы.библиотека js
с чартнью.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] } ] };
Comments