highcharts: dynamically define colors in pie chart

35,089

For a pie chart you have to set the slice color inside data.
And you have to use the point name and not serie type, serie type will always be "pie".

For this you can use javascript object notation to store which color each serie will have.
It's fastar than use a switch.

var getColor = {
    'AB': '#C6F9D2',
    'BC': '#CCCCB3',
    'CL': '#CECEFF', 
    'CI': '#FFCAFF', 
    'HB': '#D0CCCD', 
    'ON': '#FFCC99', 
    'PM': '#FFCBB9', 
    'SR': '#EAEC93', 
    'TS': '#D7FBE6', 
    'IS': '#FFCACA', 
    'FREE': '#00FF00'
};

series: [{
    type: 'pie',
    name: 'Current selection',
    data: [
        {
            name: 'AB',
            y: 45.0,
            color: getColor['AB']
        }, {
            name: 'BC',
            y: 26.8,
            color: getColor['BC']
        }, {
            name: 'CL',
            y: 12.8,
            sliced: true,
            selected: true,
            color: getColor['CL']
        }, {
            name: 'CI',
            y: 8.5,
            color: getColor['CI']
        }, {
            name: 'HB',
            y: 6.2,
            color: getColor['HB']
        }, {
            name: 'ON',
            y: 0.7,
            color: getColor['ON']
        }
    ]
}]

You can see it working here.

Share:
35,089
dllhell
Author by

dllhell

Yup, nice and boring, Just the way I like it.

Updated on July 05, 2022

Comments

  • dllhell
    dllhell almost 2 years

    I'm trying to dynamically define color for each seria depending of their type. Below is my code which doesn't work but showing what I'm trying to do. I would like to define colour for certain type eg:

    if type = 'IS' then color =  '#FFCACA'
    

    I cannot expect that ret will have all types so I need to know which types are returned in ret and then asociate color to certain type.

    How to do that?

    this is code since data received:

    success: function (ret) {
    
    
        $(function () {
            var chart;
            $(document).ready(function () {
                chart = new Highcharts.Chart({
                    chart: {
                        renderTo: 'divPie_' + id,
                        plotBackgroundColor: null,
                        plotBorderWidth: null,
                        plotShadow: true,
                        width: 350,
                        height: 350
                    },
                    title: {
                        text: refrigname
                    },
                    tooltip: {
                        pointFormat: '{series.name}: <b>{point.percentage}%</b>',
                        percentageDecimals: 1
                    },
                    plotOptions: {
                        pie: {
                            allowPointSelect: true,
                            cursor: 'pointer',
                            dataLabels: {
                                enabled: false
                            },
                            showInLegend: true
                        }
                    },
                    series: [{
                        type: 'pie',
                        name: 'Current selection',
                        color: (function () {
                                switch (ret.type) {
                                    case 'AB': return '#C6F9D2'; 
                                    case 'BC': return '#CCCCB3'; 
                                    case 'CL': return '#CECEFF'; 
                                    case 'CI': return '#FFCAFF'; 
                                    case 'HB': return '#D0CCCD'; 
                                    case 'ON': return '#FFCC99'; 
                                    case 'PM': return '#FFCBB9'; 
                                    case 'SR': return '#EAEC93'; 
                                    case 'TS': return '#D7FBE6'; 
                                    case 'IS': return '#FFCACA'; 
                                    case 'FREE': return '#00FF00'; 
                                }
                        }),
                        data: (function () {
                            var arr = [];
                            $(ret).each(function () {
                                var labelname = "";
                                switch (this.type) {
                                    case "AB": labelname = "Antibodies"; break;
                                    case "BC": labelname = "Bacteria"; break;
                                    case "CL": labelname = "Cell lines"; break;
                                    case "CI": labelname = "Custom items"; break;
                                    case "HB": labelname = "Hybridoma"; break;
                                    case "ON": labelname = "Oligonucleotides"; break;
                                    case "PM": labelname = "Plasmids"; break;
                                    case "SR": labelname = "siRNA"; break;
                                    case "TS": labelname = "Tissue samples"; break;
                                    case "IS": labelname = "Isolates"; break;
                                    case "FREE": labelname = "Free space"; break;
                                }
                                arr.push([labelname, this.cnt]);
                            })
                            return arr;
                        })()
                    }]
                });
            });
        });
    
    
    }
    
  • dllhell
    dllhell over 11 years
    but I HAVE TO to define specific color for particular ['Name_1', 537]. Now, colors are defined randomly which is inappropriate for my situation.
  • dllhell
    dllhell over 11 years
    Shams I'v also edited questions in order to become more clear, problem is that color property is not iterated as data property. Maybe I'm thinking in wrong way...
  • coolDude
    coolDude about 8 years
    @RicardoAlvaroLohmann .. how can we use this if we are getting data dynamically from mysql in JSON format ? series: [{ type: 'pie', name: 'Execution Summary', data:[] }] }; function getAjaxData(id) { $.getJSON("data/pie.php", {id: id}, function(json) { options.series[0].data = json; chart = new Highcharts.Chart(options); }); }