Couleur différente pour chaque barre dans un graphique à barres; GraphiqueJS


91

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?


3
Pour vous éviter un peu de défilement, cette réponse mentionne que vous pouvez définir le fillColord'un ensemble de données comme un tableau, et chart.js parcourra le tableau en choisissant la couleur suivante pour chaque barre dessinée.
Hartley Brody

Réponses:


70

Depuis la v2, vous pouvez simplement spécifier un tableau de valeurs pour correspondre à une couleur pour chaque barre via la backgroundColorproprié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 :

Certaines propriétés peuvent être spécifiées sous forme de tableau. Si ceux-ci sont définis sur une valeur de tableau, la première valeur s'applique à la première barre, la deuxième valeur à la deuxième barre, et ainsi de suite.


66

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

1
Ce code ne fonctionnera pas dans sa forme actuelle car myObjBar est défini dans window.onload mais il est utilisé dans le flux de script principal, donc myObjBar ne sera pas défini au moment où nous essayons de changer les couleurs. Cependant, j'ai déplacé le code de changement de couleur en bas dans la même portée que l'endroit où mon graphique à barres est généré et cela fonctionne parfaitement! Je ne voulais vraiment pas avoir à modifier chart.js pour obtenir quelque chose d'aussi simple à travailler, donc je suis très satisfait de cette méthode. MODIFIER: J'ai soumis une modification à la réponse pour appliquer mon correctif, il suffit d'attendre qu'il soit approuvé.
Joshua Walsh

Malheureusement, cela ne semble pas fonctionner dans Firefox, ou IE 10 ou 11. Voici un JSFiddle: jsfiddle.net/3fefqLko/1 . Des idées sur la façon de le faire fonctionner sur tous les navigateurs?
Sam Fen

Correction: cela fonctionne sur tous les navigateurs. C'est juste que vous pouvez le faire fillColor = "#FFFFFF;"dans Chrome, mais le point-virgule final ne devrait pas être là et FF et IE ne l'accepteront pas.
Sam Fen du

5
Mise à jour: vous devrez attribuer "._saved.fillColor" ainsi que ".fillColor" - il utilise la valeur _saved pour restaurer après le survol de la souris (surlignage) - par exemple, il restaure la couleur ORIGINALE si vous n'attribuez pas la nouvelle à elle

4
MISE À JOUR: cela ne fonctionne pas avec la dernière version (2.0 +), mais fonctionne avec 1.0.2
Madan Bhandari

51

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.


1
Pourriez-vous publier votre solution complète (par exemple avec des données et des variables d'ensemble de données, etc.)? Je cherche à faire quelque chose de similaire et je n'arrive pas à reproduire votre solution. Merci
caseklim

hey @casey, c'est le fichier Chart.Bar.js complet (celui que vous devez remplacer). pastebin.com/G2Rf0BBn , j'ai mis en évidence la ligne qui fait la différence. notez qu'en bas il y a une fonction qui renvoie une couleur différente d'un tableau selon l'index "i". l'ensemble de données reste le même (comme celui de la question). J'espère que cela vous a aidé.
BoooYaKa

Cela aide vraiment, merci! Je ne savais pas que vous modifiiez le fichier Chart.js, plutôt que votre propre code.
caseklim

C'est une excellente solution et pas unique à ChartJS.
crooksey

24

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

votre solution simple a fonctionné pour moi, merci et chartNew.js fonctionne parfaitement bien pour moi
Pratswinz

comment pouvons-nous changer la couleur du graphique dans chartnew js ??
Pratswinz


Merci beaucoup! Je ne savais pas que fillColor avait accepté un tableau.
Francisco Quintero

18

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

2
hé @Sudharshan merci pour la réponse, cela entraînera une couleur différente pour chaque graphique mais pas pour chaque barre à l'intérieur du graphique à barres, ce qui est le résultat souhaité. avez une idée?
BoooYaKa

1
Merci pour ce code. J'ai pu l'utiliser pour changer la couleur des barres elles-mêmes. L'option backgroundColor le permet.
spyke01

Dans la version 2.8, vous pouvez définir backgroundColor avec une fonction backgroundColor: randomColorGenerator,, au lieu du résultat d'une fonction backgroundColor: randomColorGenerator(),. La fonction est appelée pour chaque élément au lieu d'une seule fois pour tous.
negas

13

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

13

Depuis août 2019, Chart.js intègre désormais cette fonctionnalité.

Diagramme à barres réussi avec différentes barres colorées

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.


10

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

4

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

entrez la description de l'image ici


3

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

2

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:

fillColor : dataset.fillColor,

Pour celui-ci:

fillColor : dataset.fillColor[index],

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

J'ai créé une sous-classe personnalisée du code de graphique à barres et ajouté un code similaire à l'initialiseur pour ce faire.
David Reynolds

1

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

1

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

}


1

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

1
Cette réponse a besoin de travail. cela me pose des problèmes. J'ai dû le réécrire comme 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

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

0

Code basé sur la demande d'extraction suivante :

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

Idée très utile - bien plus que simplement choisir des couleurs aléatoires. Pour améliorer encore cela, lorsqu'il y a un grand nombre de barres, vous pouvez également ajuster la valeur de saturation, de sorte qu'au lieu de simplement tourner autour de la roue chromatique, vous vous en mettez en spirale.
Martin CR

0

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)',
    ...
    ],

-1

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


-9

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

3
Commenter "abandonnez votre bibliothèque et utilisez cette autre" manque complètement le point de la question.
jlh

chartnew.js est une version modifiée de chart.js. à cette époque, la couleur multiple n'était pas prise en charge dans chart.js mais disponible dans chartnew.js
Omar Sedki
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.