最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Custom Dynamic color for echarts - Stack Overflow

programmeradmin3浏览0评论

I am using echarts for my data visualization.... I got the solution for static data from here.. But in my case I have dynamic data and don't know how to make it work. The data items changes from time to time. It is not always 3 items like below. It could be any number.

var option = {
xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed']
},
yAxis: {
    type: 'value'
},
series: [{
    data: [
        {
            value: 120,
            itemStyle: {color: 'blue'},
        },
        {
            value: 200,
            itemStyle: {color: 'red'},
        },
        {
            value: 150,
            itemStyle: {color: 'green'},
        }
    ],
    type: 'bar'
}],
  graph: {
    color: colorPalette
  }
};

Someone have any idea about this.

Any help is appreciated. Thanks

I am using echarts for my data visualization.... I got the solution for static data from here.. But in my case I have dynamic data and don't know how to make it work. The data items changes from time to time. It is not always 3 items like below. It could be any number.

var option = {
xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed']
},
yAxis: {
    type: 'value'
},
series: [{
    data: [
        {
            value: 120,
            itemStyle: {color: 'blue'},
        },
        {
            value: 200,
            itemStyle: {color: 'red'},
        },
        {
            value: 150,
            itemStyle: {color: 'green'},
        }
    ],
    type: 'bar'
}],
  graph: {
    color: colorPalette
  }
};

Someone have any idea about this.

Any help is appreciated. Thanks

Share Improve this question asked Aug 30, 2018 at 16:02 surazzarussurazzarus 7925 gold badges20 silver badges34 bronze badges 5
  • You want a random color for each bar, is that it? – AmmoPT Commented Aug 30, 2018 at 16:04
  • @AmmoPT not exactly. I want my own custom color for each item. – surazzarus Commented Aug 30, 2018 at 16:05
  • But your items are dynamic, right? Your code does not know exactly how many bars he's gonna have to draw. – AmmoPT Commented Aug 30, 2018 at 16:06
  • 1 @AmmoPT yes you are right but is there a way where I can have 5 different colors and the bars picks from it. For e.g. if, 1 => 'blue', 2 => 'red', 3 => 'yellow', 4 => 'green', 5 => 'orange'. Since I am sure I won't have bars more than 5. Thanks :) – surazzarus Commented Aug 30, 2018 at 16:15
  • how to change or add custom color based on xAxis array data? – Nikhil Gowda Commented Jan 13, 2023 at 14:39
Add a ment  | 

4 Answers 4

Reset to default 8

You can have an array of colors predefined and randomly pop a color from that array, for each bar you have to draw:

var colors = [
  "blue",
  "red",
  "yellow",
  "green",
  "purple"
];

function popRandomColor(){
  var rand = Math.random();
  var color = colors[Math.floor(rand*colors.length)];
  colors.splice(Math.floor(rand*colors.length), 1);
  return color;
}

Then call popRandomColor() everytime you need a color from the color bank.

var option = {
xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed']
},
yAxis: {
    type: 'value'
},
series: [{
    data: [
        {
            value: 120,
            itemStyle: {color: popRandomColor()},
        },
        {
            value: 200,
            itemStyle: {color: popRandomColor()},
        },
        {
            value: 150,
            itemStyle: {color: popRandomColor()},
        }
    ],
    type: 'bar'
}],
  graph: {
    color: colorPalette
  }
};

Is dynamic data with different color you want? check below

// put any color you want in Array colors
var colors = [
    "blue",
    "red",
    "green"
];

// can be any length
var data = [{
    category: 'cate1',
    value: 120
}, {
    category: 'cate2',
    value: 200
}, {
    category: 'cate3',
    value: 150
}, {
    category: 'cate4',
    value: 135
}, {
    category: 'cate5',
    value: 54
}]

let category = [];

let seriesData = data.map((item, index) => {
    category.push(item.category);
    return {
        value: item.value,
        itemStyle: {
            color: colors[index % colors.length]
        }
    }
});

var option = {
    xAxis: {
        type: 'category',
        data: category
    },
    yAxis: {
        type: 'value'
    },
    series: [{
        data: seriesData,
        type: 'bar'
    }]
};

You can use this function to generate any number of colors and use it to assign these dynamic colors to your pie chart:

export const getColorArray = (num) => {
  const result = [];
  for (let i = 0; i < num; i += 1) {
    const letters = '0123456789ABCDEF'.split('');
    let color = '#';
    for (let j = 0; j < 6; j += 1) {
      color += letters[Math.floor(Math.random() * 16)];
    }
    result.push(color);
  }
  return result;
};

You can call this function like:

...
series: [
        {
            name: "Nightingale Chart",
            type: "pie",
            radius: [50, 150],
            center: ["50%", "50%"],
            roseType: "area",
            itemStyle: {
                borderRadius: 8,
            },
            data: [
                { value: 40, name: "rose 1" },
                { value: 38, name: "rose 2" },
                { value: 32, name: "rose 3" },
                { value: 30, name: "rose 4" },
                { value: 28, name: "rose 5" },
                { value: 26, name: "rose 6" },
                { value: 22, name: "rose 7" },
                { value: 18, name: "rose 8" },
            ],
            color: [...getColorArray(6)]
        },
    ],
...

Here is what you can do.

Suppose you have your pie chart data as given below (with the color included along with the data as you mentioned)

const pieChartData = [
        {
            label: 'Label1',
            value: 120,
            itemStyle: {color: 'blue'},
        },
        {
            label: 'Label 2',
            value: 200,
            itemStyle: {color: 'red'},
        },
        {
            label: 'Label 3'
            value: 150,
            itemStyle: {color: 'green'},
        }
];

Now make use of this data inside the chart's "option[series]" as given below.

...series: [
    {
        data: pieChartData.map(pieData => { return {value: pieData.value, name: pieData.label}}),
        color: pieChartData.map(pieData => pieData.itemStyle.color)
    }

]

Hope this helps.

发布评论

评论列表(0)

  1. 暂无评论