如何在 Chart.js 面积图中添加条件填充颜色?

How to add conditional fill color in Chart.js area chart?

我正在做的项目需要我设计一个图表,如下图所示:

我正在使用 chart.js 并做出反应以制作分布图。但我无法弄清楚如何在 x 变量的特定值范围之间添加面积图的填充颜色。到目前为止,我能够做到这一点:

我使用以下代码将面积图制作为 React 组件:

const data = {
    labels: {DataLabel},
    datasets: [
        {
            label: 'Blood Sugar Measure',
            data: {Data},
            fill: true,
            backgroundColor: ["#E5E5E5", "#E5E5E5", "#B4EDB3", "#B4EDB3", "#E5E5E5"],
            pointBorderColor: "#8884d8",
            pointBorderWidth: 2,
            pointRadius: 3,
            tension: 0.4
        },
    ],
};

const options = {
    plugins: { legend: { display: false } },
    layout: { padding: { bottom: 0.1 } },
    scales: {
        y: {
            display : false,
            beginAtZero: true,
            grid: {
                display: false
            },
            ticks: {
                color: "#000000",
                font: {
                    size: 18
                }
            }
        },
        x: {
            beginAtZero: true,
            grid: {
                display: false
            },
            ticks: {
                color: "#000000",
                font: {
                    size: 10
                },
                min: 0
            }
        }
    },
};

export const DistChart = () => {


    return (<div className="App">
        <Line data={data} options={options} />
    </div>);
};

我需要一些帮助来应用基于 x 轴变量的条件填充颜色。

您可以将多个数据集与对象数据一起使用,这样您就可以指定起点和终点。在此之后,您可以操纵图例,使其看起来像只有一个数据集:

var options = {
  type: 'line',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
        label: 'Blood Sugar Measure extra',
        data: [{
          x: "Red",
          y: 5
        }, {
          x: "Blue",
          y: 8
        }],
        backgroundColor: 'lightGray',
        fill: true
      },
      {
        label: 'Blood Sugar Measure',
        data: [{
          x: "Blue",
          y: 8
        }, {
          x: "Yellow",
          y: 12
        }, {
          x: "Green",
          y: 10
        }],
        backgroundColor: 'pink',
        fill: true
      },
      {
        label: 'Blood Sugar Measure extra',
        data: [{
          x: "Green",
          y: 10
        }, {
          x: "Purple",
          y: 12
        }, {
          x: "Orange",
          y: 10
        }],
        backgroundColor: 'lightGray',
        fill: true
      }
    ]
  },
  options: {
    plugins: {
      legend: {
        onClick: (e, legendItem, legend) => {
          const ci = legend.chart;
          const currentlyHidden = ci.getDatasetMeta(0).hidden;

          for (let i = 0; i < ci.data.datasets.length; i++) {
            ci.setDatasetVisibility(i, currentlyHidden)
          }

          ci.update();
        },
        labels: {
          filter: (e) => (!e.text.includes('extra'))
        }
      }
    }
  }
}

var ctx = document.getElementById('chartJSContainer').getContext('2d');
new Chart(ctx, options);
<body>
  <canvas id="chartJSContainer" width="600" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.1/chart.js"></script>
</body>

我能够在我想要的设计上取得一些进展,所以想分享我的答案以造福他人。我能够根据 x-axis 数据值进行填充并获得以下图表:

我不得不在数据配置中使用段 属性 来实现这一点,借助于一个函数。这是修改后的代码:

const highlightRegion = (ctx, value) => {

    if (ctx.p0DataIndex > boundary_val1 && ctx.p0DataIndex < boundary_val2) {
        return "#B4EDB3";
    }
    return "#E5E5E5";
};

const bgColor = ctx => highlightRegion(ctx, "#B4EDB3");

const data = {
    labels: x_values,
    datasets: [
        {
            label: 'Count',
            data: [0, 20, 40, 80, 150, 80, 30, 0],
            pointRadius: 0,
            fill: true,
            tension: 0.4,
            segment: {
                backgroundColor: bgColor,
                borderColor: bgColor,
            },
        },
    ],
};

特别感谢这个 youtube 系列,我从中找到了我的答案:https://www.youtube.com/watch?v=st2O-pvhWM4

我会保持这个 post 开放,以防有更好的解决方案,因为我认为我的解决方案不是绝对正确的。