Unterschiedliche Farbe für jeden Balken in einem Balkendiagramm; ChartJS


88

Ich verwende ChartJS in einem Projekt, an dem ich arbeite, und ich benötige eine andere Farbe für jeden Balken in einem Balkendiagramm.

Hier ist ein Beispiel für den Balkendiagramm-Datensatz:

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

Gibt es eine Möglichkeit, jeden Balken anders zu bemalen?


3
In dieser Antwort wird erwähnt, dass Sie das fillColoreines Datasets als Array festlegen können, und chart.js durchläuft das Array und wählt die nächste Farbe für jeden gezeichneten Balken aus.
Hartley Brody

Antworten:


66

Lösung: Rufen Sie die Aktualisierungsmethode auf, um neue Werte festzulegen:

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
Dieser Code funktioniert in seiner aktuellen Form nicht, da myObjBar in window.onload definiert ist, aber im Hauptskriptfluss verwendet wird, sodass myObjBar nicht definiert wird, wenn wir versuchen, die Farben zu ändern. Ich habe jedoch den Farbänderungscode unten in den gleichen Bereich verschoben, in dem mein Balkendiagramm erstellt wurde, und dies funktioniert einwandfrei! Ich wollte wirklich nicht chart.js ändern müssen, damit etwas so einfach funktioniert, also bin ich mit dieser Methode sehr zufrieden. BEARBEITEN: Ich habe die Antwort bearbeitet, um mein Update anzuwenden. Ich muss nur warten, bis es genehmigt wird.
Joshua Walsh

Leider scheint dies in Firefox oder IE 10 oder 11 nicht zu funktionieren. Hier ist eine JSFiddle: jsfiddle.net/3fefqLko/1 . Irgendwelche Gedanken darüber, wie es in allen Browsern funktioniert?
Sam Fen

Korrektur: Es funktioniert in allen Browsern. Es ist nur so, dass Sie dies fillColor = "#FFFFFF;"in Chrome tun können , aber das letzte Semikolon sollte nicht vorhanden sein und FF und IE akzeptieren es nicht.
Sam Fen

5
Update: Sie müssen "._saved.fillColor" sowie ".fillColor" zuweisen - es verwendet den Wert _saved, um nach dem Mouseover (Hervorheben) wiederherzustellen - z. B. stellt es die ORIGINAL-Farbe wieder her, wenn Sie die neue nicht zuweisen dazu

4
UPDATE: Dies funktioniert nicht mit der neuesten Version (2.0 +), sondern mit 1.0.2
Madan Bhandari

66

Ab Version 2 können Sie einfach über die backgroundColorEigenschaft ein Array von Werten angeben, die einer Farbe für jeden Balken entsprechen :

datasets: [{
  label: "My First dataset",
  data: [20, 59, 80, 81, 56, 55, 40],
  backgroundColor: ["red", "blue", "green", "blue", "red", "blue"], 
}],

Dies ist auch möglich , dass die borderColor, hoverBackgroundColor,hoverBorderColor .

Aus der Dokumentation zu den Eigenschaften des Balkendiagramm-Datensatzes :

Einige Eigenschaften können als Array angegeben werden. Wenn diese auf einen Array-Wert festgelegt sind, gilt der erste Wert für den ersten Balken, der zweite Wert für den zweiten Balken usw.


48

Nachdem ich in die Datei Chart.Bar.js geschaut habe, habe ich es geschafft, die Lösung zu finden. Ich habe diese Funktion verwendet, um eine zufällige Farbe zu erzeugen:

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

Ich habe es am Ende der Datei hinzugefügt und diese Funktion direkt in der "fillColor:" unter aufgerufen

helpers.each(dataset.data,function(dataPoint,index){
                    //Add a new point for each piece of data, passing any required data to draw.

so sieht es jetzt aus:

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

und es funktioniert, ich bekomme unterschiedliche Farben für jeden Balken.


Könnten Sie Ihre vollständige Lösung veröffentlichen (z. B. mit Daten und Datensatzvariablen usw.)? Ich möchte etwas Ähnliches tun, und ich kann Ihre Lösung scheinbar nicht replizieren. Danke
Caseklim

hey @casey, dies ist die vollständige Datei Chart.Bar.js (die, die Sie ersetzen müssen). pastebin.com/G2Rf0BBn , ich habe die Linie hervorgehoben, die den Unterschied macht. Beachten Sie, dass am unteren Rand eine Funktion vorhanden ist, die eine andere Farbe von einem Array gemäß dem Index "i" zurückgibt. Der Datensatz bleibt derselbe (wie der in der Frage). Ich hoffe es hat dir geholfen.
BoooYaKa

Das hilft auf jeden Fall, danke! Ich wusste nicht, dass Sie die eigentliche Datei Chart.js und nicht Ihren eigenen Code ändern.
Caseklim

Dies ist eine großartige Lösung und nicht nur für ChartJS.
Crooksey

24

Wenn Sie sich die Bibliothek " ChartNew " ansehen, die auf Chart.js aufbaut, können Sie dies tun, indem Sie die Werte wie folgt als Array übergeben:

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

Ihre einfache Lösung hat für mich funktioniert, danke und chartNew.js funktioniert einwandfrei für mich
Pratswinz

Wie können wir ingraphdatashow Farbe in chartnew js ändern?
Pratswinz


Vielen Dank! Wusste nicht, dass fillColor ein Array akzeptiert.
Francisco Quintero

18

Sie können diese Funktion aufrufen, die für jeden Balken zufällige Farben generiert

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
hey @Sudharshan, danke für die Antwort. Dies führt zu einer anderen Farbe für jedes Diagramm, aber nicht für jeden einzelnen Balken im Balkendiagramm. Dies ist mein gewünschtes Ergebnis. Hast du eine Idee?
BoooYaKa

1
Danke für diesen Code. Ich konnte damit die Farbe der Balken selbst ändern. Die Option backgroundColor ermöglicht dies.
spyke01

In Version 2.8 können Sie backgroundColor mit einer Funktion backgroundColor: randomColorGenerator,anstelle des Ergebnisses einer Funktion festlegen backgroundColor: randomColorGenerator(),. Die Funktion wird für jedes Element anstatt einmal für alle aufgerufen.
Negas

12

Ab August 2019 ist in Chart.js diese Funktionalität integriert.

Erfolgreiches Balkendiagramm mit verschiedenfarbigen Balken

Sie müssen backgroundColor lediglich ein Array bereitstellen.

Beispiel aus https://www.chartjs.org/docs/latest/getting-started/

Vor:

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

Nach dem:

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

Ich habe diese Methode gerade getestet und sie funktioniert. Jeder Balken hat eine andere Farbe.


11

Hier habe ich dieses Problem gelöst, indem ich zwei Funktionen erstellt habe.

1. dynamicColors (), um zufällige Farben zu erzeugen

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 (), um ein Array von Farben zu erstellen

function poolColors(a) {
    var pool = [];
    for(i = 0; i < a; i++) {
        pool.push(dynamicColors());
    }
    return pool;
}

Dann einfach weitergeben

datasets: [{
    data: arrData,
    backgroundColor: poolColors(arrData.length),
    borderColor: poolColors(arrData.length),
    borderWidth: 1
}]

10

Generieren Sie zufällige Farben.

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

und nenne es für jeden Datensatz;

function getRandomColorEachEmployee(count) {
    var data =[];
    for (var i = 0; i < count; i++) {
        data.push(getRandomColor());
    }
    return data;
}

endlich Farben setzen;

var data = {
    labels: jsonData.employees, // your labels
    datasets: [{
        data: jsonData.approvedRatios, // your data
        backgroundColor: getRandomColorEachEmployee(jsonData.employees.length)
    }]
};

4

Hier ist eine Möglichkeit, konsistente Zufallsfarben mithilfe von Farb-Hash zu generieren

const colorHash = new ColorHash()

const datasets = [{
  label: 'Balance',
  data: _.values(balances),
  backgroundColor: _.keys(balances).map(name => colorHash.hex(name))
}]

Geben Sie hier die Bildbeschreibung ein


3

So ging ich vor: Ich habe ein Array "Farben" mit der gleichen Anzahl von Einträgen wie die Anzahl von Daten gepusht. Dazu habe ich am Ende des Skripts eine Funktion "getRandomColor" hinzugefügt. Ich hoffe es hilft...

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

Wenn Sie NewChart.js nicht verwenden können, müssen Sie nur die Art und Weise ändern, wie die Farbe stattdessen mithilfe des Arrays festgelegt wird. Suchen Sie die Hilfsiteration in Chart.js:

Ersetzen Sie diese Zeile:

fillColor : dataset.fillColor,

Für dieses:

fillColor : dataset.fillColor[index],

Der resultierende Code:

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

Und in deinem 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]
                }
              ]

Ich habe eine benutzerdefinierte Unterklasse des Barchart-Codes erstellt und dem Initialisierer einen ähnlichen Code hinzugefügt, um dies zu tun.
David Reynolds

1

Versuche dies :

  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

Dies funktioniert bei mir in der aktuellen Version 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

Mit der anderen Antwort finden Sie hier eine schnelle Lösung, wenn Sie eine Liste mit zufälligen Farben für jeden Balken erhalten möchten:

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

Jetzt können Sie diese Funktion im Feld backgroundColor in Daten verwenden:

data: {
        labels: count[0],
        datasets: [{
            label: 'Registros en BDs',
            data: count[1],
            backgroundColor: getRandomColor(count[1].length)
        }]
}

1
Diese Antwort braucht Arbeit. es führt zu Problemen für mich. Ich musste es umschreiben als 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

Ich habe dieses Problem erst kürzlich erhalten und hier ist meine Lösung

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 basierend auf der folgenden Pull-Anfrage :

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

Sehr nützliche Idee - viel mehr als nur zufällige Farben zu wählen. Um dies weiter zu verbessern, können Sie bei einer großen Anzahl von Balken auch den Sättigungswert anpassen, sodass Sie sich nicht nur auf dem Farbkreis drehen, sondern auch darauf drehen.
Martin CR

0

Wenn Sie wissen, welche Farben Sie möchten, können Sie die Farbeigenschaften in einem Array wie folgt angeben:

    backgroundColor: [
    'rgba(75, 192, 192, 1)',
    ...
    ],
    borderColor: [
    'rgba(75, 192, 192, 1)',
    ...
    ],

-8

Sie können einfach mit Livegap-Diagrammen generieren.
Wählen Sie Mulicolors aus dem Balkenmenü


(Quelle: livegap.com )

** Die verwendete Diagrammbibliothek ist chartnew.js modifizierte Version der chart.js-Bibliothek
mit chartnew.js-Code

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
Der Kommentar "Graben Sie Ihre Bibliothek aus und verwenden Sie diese andere" verfehlt den Punkt der Frage völlig.
14.

chartnew.js ist eine modifizierte Version von chart.js. In dieser Zeit wurde Multi Color in chart.js nicht unterstützt, war aber in chartnew.js verfügbar
Omar Sedki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.