You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决ChartJS刷新页面时图表随机颜色变更的问题

固定ChartJS图表的随机颜色,避免刷新页面后颜色变化

我在使用ChartJS开发时,每次刷新页面都会生成新的随机颜色。希望生成随机颜色后将其固定,确保刷新或重载页面时颜色不再变化。

当前使用的随机颜色生成函数:

getRandomRgb() {
    var num = Math.round(0xffffff * Math.random());
 
    var r = num >> 16;
    var g = (num >> 8) & 255;
    var b = num & 255;
    return "rgb(" + r + ", " + g + ", " + b + ")";
}

使用该函数的代码片段:

this.currentResponseItems.forEach((x) => {
    x.Items.forEach((z) => {
        if (!colorMap[z.Description]) {
            colorMap[z.Description] = this.getRandomColor();
        }
        console.log(z.Description, " : ", colorMap[z.Description]);
        z["phaseId"] = x.Id;
        let zData = [];

        let number = array.indexOf(z.phaseId);
        if (z.Number != 0) {
            zData[number] = z.Number;

            this.barChartData.push({
                data: zData,
                stack: x.Id,
                label: z.Description,
                fill: false,
                grouped: true,
                idStatoAffiliazione: x.Id,
                channelID: z.Id,
                backgroundColor: colorMap[z.Description],
                hoverBackgroundColor: colorMap[z.Description],
                pointBackgroundColor: colorMap[z.Description],
                pointBorderColor:colorMap[z.Description],
                pointHoverBackgroundColor:colorMap[z.Description],
                pointHoverBorderColor: colorMap[z.Description],
            }); 

HTML中的ChartJS代码:

<div class="container-chart cursor-pointer" fxLayout="row" *ngIf="barChartData.length > 0" fxLayoutGap="20px">
    <canvas baseChart fxFlex="100" [chartType]="'horizontalBar'" [datasets]="barChartData" [options]="barChartOptions" [labels]="barChartLabels" [colors]="graphColors" ></canvas>
    <!-- <graph-legend fxFlex="20" [configs]="graphLegendConfig"></graph-legend> -->
</div>

解决方案:基于本地存储固定颜色映射

核心思路是把生成的colorMap存储到浏览器的localStorage中,页面加载时先读取本地存储的颜色映射,没有的话再生成新的随机颜色,这样刷新页面时就能复用之前的颜色。

步骤1:修改颜色映射的初始化逻辑

在生成颜色映射前,先尝试从localStorage读取已有的数据:

// 初始化colorMap,优先从localStorage读取
let colorMap = JSON.parse(localStorage.getItem('chartColorMap')) || {};

this.currentResponseItems.forEach((x) => {
    x.Items.forEach((z) => {
        if (!colorMap[z.Description]) {
            colorMap[z.Description] = this.getRandomRgb(); // 注意原代码函数名不一致,需统一为getRandomRgb
        }
        // ... 原有代码逻辑
    });
});

// 每次生成/更新颜色映射后,保存到localStorage
localStorage.setItem('chartColorMap', JSON.stringify(colorMap));

步骤2:统一函数调用名称

原代码中调用的this.getRandomColor()与定义的函数名getRandomRgb()不一致,需要修改为相同名称,避免报错。

步骤3:可选:添加颜色重置功能

如果需要允许用户重置颜色(比如新增了新的Description或手动刷新颜色),可以添加重置逻辑:

resetChartColors() {
    localStorage.removeItem('chartColorMap');
    // 调用你的图表初始化函数重新生成数据和颜色
    this.initChart();
}

注意事项

  • localStorage存储的是字符串,必须用JSON.stringify和JSON.parse处理对象。
  • 新增的Description会自动生成新颜色并保存,不影响已有项的颜色。
  • 清除浏览器缓存或更换浏览器会丢失本地存储的颜色映射,若需跨设备保持颜色一致,需将颜色映射存储到后端数据库并通过接口读取。

内容的提问来源于stack exchange,提问作者Hamza Marwani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:13