J'utilise ChartJS dans un projet sur lequel je travaille et j'ai besoin d'une couleur différente pour chaque barre d'un graphique à barres.
Voici un exemple d'ensemble de données de graphique à barres:
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]
}]
};
Existe-t-il un moyen de peindre chaque barre différemment?
javascript
chart.js
BoooYaKa
la source
la source
fillColor
d'un ensemble de données comme un tableau, et chart.js parcourra le tableau en choisissant la couleur suivante pour chaque barre dessinée.Réponses:
Depuis la v2, vous pouvez simplement spécifier un tableau de valeurs pour correspondre à une couleur pour chaque barre via la
backgroundColor
propriété:datasets: [{ label: "My First dataset", data: [20, 59, 80, 81, 56, 55, 40], backgroundColor: ["red", "blue", "green", "blue", "red", "blue"], }],
Ceci est également possible pour le
borderColor
,hoverBackgroundColor
,hoverBorderColor
.À partir de la documentation sur les propriétés du jeu de données du graphique à barres :
la source
Solution: appelez la méthode de mise à jour pour définir de nouvelles valeurs:
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(); }
la source
fillColor = "#FFFFFF;"
dans Chrome, mais le point-virgule final ne devrait pas être là et FF et IE ne l'accepteront pas.Après avoir examiné le fichier Chart.Bar.js, j'ai réussi à trouver la solution. J'ai utilisé cette fonction pour générer une couleur aléatoire:
function getRandomColor() { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++ ) { color += letters[Math.floor(Math.random() * 16)]; } return color; }
Je l'ai ajouté à la fin du fichier et j'ai appelé cette fonction juste à l'intérieur du "fillColor:" sous
helpers.each(dataset.data,function(dataPoint,index){ //Add a new point for each piece of data, passing any required data to draw.
alors maintenant ça ressemble à ceci:
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);
et ça marche, j'obtiens une couleur différente pour chaque barre.
la source
Si vous jetez un œil à la bibliothèque " ChartNew " qui s'appuie sur Chart.js, vous pouvez le faire en passant les valeurs sous forme de tableau comme ceci:
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] } ] };
la source
Vous pouvez appeler cette fonction qui génère des couleurs aléatoires pour chaque barre
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] } ] };
la source
backgroundColor: randomColorGenerator,
, au lieu du résultat d'une fonctionbackgroundColor: randomColorGenerator(),
. La fonction est appelée pour chaque élément au lieu d'une seule fois pour tous.Ici, j'ai résolu ce problème en créant deux fonctions.
1. dynamicColors () pour générer des couleurs aléatoires
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 () pour créer un tableau de couleurs
function poolColors(a) { var pool = []; for(i = 0; i < a; i++) { pool.push(dynamicColors()); } return pool; }
Ensuite, passe-le
datasets: [{ data: arrData, backgroundColor: poolColors(arrData.length), borderColor: poolColors(arrData.length), borderWidth: 1 }]
la source
Depuis août 2019, Chart.js intègre désormais cette fonctionnalité.
Vous devez simplement fournir un tableau à backgroundColor.
Exemple tiré de https://www.chartjs.org/docs/latest/getting-started/
Avant:
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] }] },
Après:
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] }] },
Je viens de tester cette méthode et cela fonctionne. Chaque barre a une couleur différente.
la source
Générez des couleurs aléatoires;
function getRandomColor() { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; }
et appelez-le pour chaque enregistrement;
function getRandomColorEachEmployee(count) { var data =[]; for (var i = 0; i < count; i++) { data.push(getRandomColor()); } return data; }
enfin définir les couleurs;
var data = { labels: jsonData.employees, // your labels datasets: [{ data: jsonData.approvedRatios, // your data backgroundColor: getRandomColorEachEmployee(jsonData.employees.length) }] };
la source
Voici un moyen de générer des couleurs aléatoires cohérentes en utilisant le hachage de couleur
const colorHash = new ColorHash() const datasets = [{ label: 'Balance', data: _.values(balances), backgroundColor: _.keys(balances).map(name => colorHash.hex(name)) }]
la source
voici comment j'ai traité: j'ai poussé un tableau "couleurs", avec le même nombre d'entrées que le nombre de données. Pour cela j'ai ajouté une fonction "getRandomColor" à la fin du script. J'espère que cela aide...
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; }
la source
Si vous ne parvenez pas à utiliser NewChart.js, il vous suffit de changer la façon de définir la couleur à l'aide de array. Trouvez l'itération d'assistance dans Chart.js:
Remplacez cette ligne:
Pour celui-ci:
Le code résultant:
//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);
Et dans votre 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] } ]
la source
essaye ça :
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); } }); }
la source
Cela fonctionne pour moi dans la version actuelle
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();
}
la source
En prenant l'autre réponse, voici une solution rapide si vous souhaitez obtenir une liste avec des couleurs aléatoires pour chaque barre:
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; }
Vous pouvez maintenant utiliser cette fonction dans le champ backgroundColor dans les données:
data: { labels: count[0], datasets: [{ label: 'Registros en BDs', data: count[1], backgroundColor: getRandomColor(count[1].length) }] }
la source
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; }
.Je viens de recevoir ce problème récemment, et voici ma solution
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 }] };
la source
Code basé sur la demande d'extraction suivante :
datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
la source
Si vous savez quelles couleurs vous voulez, vous pouvez spécifier les propriétés de couleur dans un tableau, comme ceci:
backgroundColor: [ 'rgba(75, 192, 192, 1)', ... ], borderColor: [ 'rgba(75, 192, 192, 1)', ... ],
la source
ce que j'ai fait est de créer un générateur de couleurs aléatoires comme beaucoup l'ont suggéré ici
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)"; }
puis codé ceci
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, } });
Notez qu'il n'y a pas de parantheses lors de l'appel de fonction Cela permet au code d'appeler la fonction à chaque fois, au lieu de créer un tableau Cela empêche également le code d'utiliser la même couleur pour toutes les barres
la source
Vous pouvez générer facilement avec des graphiques en
direct Sélectionnez Mulicolors dans le menu Bar
(source: livegap.com )
** bibliothèque graphique utilisée est chartnew.js version modifiée de la bibliothèque de chart.js
avec le code chartnew.js sera quelque chose comme ça
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] } ] };
la source