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

如何在react-chartjs-2中同步控制同标签折线与散点图的显隐

解决react-chartjs-2相同标签散点与折线同步显隐问题

核心思路是重写Chart.js的图例点击事件,让点击标签时自动同步所有同标签数据集的显隐状态,具体实现如下:

步骤1:自定义图例点击回调

在渲染Scatter组件时,通过options配置legend.onClick,替换默认的单数据集切换逻辑:

<Scatter
  data={chart4Data}
  options={{
    legend: {
      onClick: function(e, legendItem) {
        // 获取当前点击的标签文本
        const targetLabel = legendItem.text;
        // 遍历所有数据集,找到同标签的并同步切换显隐
        this.chart.data.datasets.forEach(dataset => {
          if (dataset.label === targetLabel) {
            dataset.hidden = !dataset.hidden;
          }
        });
        // 强制更新图表状态
        this.chart.update();
      }
    }
  }}
/>

步骤2:整合到你的代码中

把上述配置加入到你的图表组件里,完整代码示例如下:

import { Scatter } from 'react-chartjs-2';
import { useState, useEffect } from 'react';

function YourChartComponent() {
  const [chart4Data, setChart4Data] = useState({});

  useEffect(() => {
    createChart4();
  }, []);

  function createChart4() {
    let result = Object.assign([], resultScatter);
    let result2 = Object.assign([], resultData);
    let columns = Object.keys(resultScatter[0]).filter(el => el !== "Y");
    const colors = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#17becf",
                    "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22"];
    let x = [];
    for (let i = 0; i < columns.length; i++) {
      x[i] = result.map((data) => data[columns[i]]);
    }
    let y = result.map((data) => data.Y);
    let scatterData = { datasets: [] };

    for (let i = 0; i < columns.length; i++) {
      let color = colors[i];
      let label = columns[i];
      let lines = result2.filter(el => el.FACTOR_CD === transLangKey(columns[i]))[0];
      let minX = Math.min(...x[i]);
      let maxX = Math.max(...x[i]);

      scatterData.datasets.push(
        {
          label: label,
          data: x[i].map((val, index) => ({ x: val, y: y[index] })),
          backgroundColor: color,
          borderColor: color,
          hidden: i !== 0,
          showLine: false,
        },
        {
          label: label,
          showLine: true,
          data: [
            { x: minX, y: lines.REG_COEF * minX + lines.CONSTANT },
            { x: maxX * 1.05, y: lines.REG_COEF * maxX * 1.05 + lines.CONSTANT },
          ],
          backgroundColor: color,
          borderColor: color,
          hidden: i !== 0,
        }
      );
    }
    setChart4Data(scatterData);
  }

  return (
    <Scatter
      data={chart4Data}
      options={{
        legend: {
          onClick: function(e, legendItem) {
            const targetLabel = legendItem.text;
            this.chart.data.datasets.forEach(ds => {
              if (ds.label === targetLabel) {
                ds.hidden = !ds.hidden;
              }
            });
            this.chart.update();
          }
        }
      }}
    />
  );
}

原理说明

默认的图例点击只会切换单个数据集的显隐状态,我们通过重写legend.onClick方法,遍历所有数据集并匹配标签名,将同标签的散点、折线数据集的hidden状态同步反转,最后调用update()方法触发图表重绘,实现一次点击同步控制两组数据的显隐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:25:57