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?

BoooYaKa
la source
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.

merci: D
la source
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();
}
Jerry
la source
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.

BoooYaKa
la source
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]
        }
    ]
};
Muhammad Mohsin Muneer
la source
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
J'espère que cela t'aides! github.com/FVANCOP/ChartNew.js/wiki/100_080_In_Graph_Data
Muhammad Mohsin Muneer
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]
            }
        ]
    };
Sudharshan
la source
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
}]
Abdul Hameed
la source
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.

legoblocks
la source
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)
    }]
};
Martin Schneider
la source
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

TeNNoX
la source
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;
}
Jean-François Rullier
la source
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]
                }
              ]
Armando Reyna
la source
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);
            }
        });
    }
FannyKaunang
la source
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(); 

}

Damian
la source
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)
        }]
}
Eduardo Luis Santos
la source
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
  }]
};
Feiyu Chen
la source
0

Code basé sur la demande d'extraction suivante :

datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
voho
la source
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)',
    ...
    ],
frostbyyte
la source
-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

Kapil
la source
-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]
            }
        ]
    };
Omar Sedki
la source
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