【问题标题】:Chart.js Multiple charts with one common legendChart.js 具有一个共同图例的多个图表
【发布时间】:2019-12-23 00:25:47
【问题描述】:

一页上有多个图表。 每条图表线都很常见。 我想显示一个图例,该图例对多个图表都很常见。它使用 OnClick 显示和隐藏所有图表线,就像默认图例一样。 这张照片是假的

这可能吗?怎么样?

我尝试过Chart.js sync legend toggle on multiple chartsOne legend, multiple charts Chart JS 等。 但是,这些解决方案只有一个带有图例的图表,而该图例会影响其他图表。

我应该隐藏图表并只显示图例吗? 我应该画一个没有数据的图表吗?

如果你能告诉我,我会毕业的

HTML

<script src="https://rawgit.com/nnnick/Chart.js/v1.0.2/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.0.0-beta/Chart.js"></script>
<div>
    <canvas id="myChartA"></canvas>
</div>

<div>
    <canvas id="myChartB"></canvas>
</div>

JS

var ctxA = document.getElementById("myChartA").getContext("2d");
var ctxB = document.getElementById("myChartB").getContext("2d");

let data_A1 = [{
        x: "2019-01-01 00:01:38",
        y: "13.0"
    },
    {
        x: "2019-01-01 01:01:39",
        y: "11.0"
    },
    {
        x: "2019-01-01 02:01:40",
        y: "16.0"
    },
    {
        x: "2019-01-01 03:01:41",
        y: "15.0"
    },
    {
        x: "2019-01-01 04:01:42",
        y: "14.0"
    }
];

var data_A2 = [{
    x: "2019-01-01 00:01:42",
    y: 14.671
}, {
    x: "2019-01-01 01:01:42",
    y: 13.691
}, {
    x: "2019-01-01 02:01:42",
    y: 16.691
}, {
    x: "2019-01-01 03:01:42",
    y: 17.691
}, {
    x: "2019-01-01 04:01:42",
    y: 18.691
}];

let data_B1 = [{
        x: "2019-01-02 00:01:38",
        y: "12.0"
    },
    {
        x: "2019-01-02 01:01:39",
        y: "11.0"
    },
    {
        x: "2019-01-02 02:01:40",
        y: "13.0"
    },
    {
        x: "2019-01-02 03:01:41",
        y: "14.0"
    },
    {
        x: "2019-01-02 04:01:42",
        y: "16.0"
    }
];

var data_B2 = [{
    x: "2019-01-02 00:00:00",
    y: 14.671
}, {
    x: "2019-01-02 01:01:42",
    y: 13.691
}, {
    x: "2019-01-02 02:01:42",
    y: 16.691
}, {
    x: "2019-01-02 03:01:42",
    y: 15.691
}, {
    x: "2019-01-02 04:01:42",
    y: 14.691
}];


var myChartA = new Chart(ctxA, {
    type: 'line',
    data: {
        datasets: [{
            label: '1st Data',
            data: data_A1,
            borderColor: '#0f0',
            showLine: true
        }, {
            label: '2nd Data',
            data: data_A2,
            borderColor: '#f00',
            showLine: true
        }]
    },
    options: {
        scales: {
            xAxes: [{
                type: 'time',
                time: {
                    displayFormat: 'h:mm',
                }
            }]
        }
    }
});

var myChartB = new Chart(ctxB, {
    type: 'line',
    data: {
        datasets: [{
            label: '1st Data',
            data: data_B1,
            borderColor: '#0f0',
            showLine: true
        }, {
            label: '2nd Data',
            data: data_B2,
            borderColor: '#f00',
            showLine: true
        }]
    },
    options: {
        scales: {
            xAxes: [{
                type: 'time',
                time: {
                    displayFormat: 'h:mm',
                }
            }]
        }
    }
});

【问题讨论】:

  • 您使用测试版有什么原因吗?

标签: javascript html chart.js


【解决方案1】:

如果两个数据集相似,您可以通过 generateLegend api 创建一个通用图例。

首先通过选项禁用默认图例

legend: {
        display: false
      }

然后使用 generateLegend() api 获取数据标签并将其设置为公共元素。

<ul class="legend">

</ul>

然后将事件监听器添加到生成的元素并定位所有图表

document.querySelector('.legend').innerHTML = myChartA.generateLegend();

var legendItems = document.querySelector('.legend').getElementsByTagName('li');
for (var i = 0; i < legendItems.length; i++) {
  legendItems[i].addEventListener("click", legendClickCallback.bind(this,i), false);
}

function legendClickCallback(legendItemIndex){
  document.querySelectorAll('.myChart').forEach((chartItem,index)=>{
    var chart = Chart.instances[index];
    var dataItem = chart.data.datasets[legendItemIndex]    
    if(dataItem.hidden == true || dataItem.hidden == null){
      dataItem.hidden = false;
    } else {
      dataItem.hidden = true;
    }
    chart.update();
  })  
}

这里有一支笔样 https://codepen.io/srajagop/pen/yLBJOOo

注意我使用的是 chartjs 2.8

【讨论】:

  • 有没有办法从chartjs中获取颜色并使用相同的样式?
  • @karthick generateLegend() 函数在 chartjs v3.x 中已被弃用,我们如何在 chartjs v3 中做到这一点?
  • 有没有办法在 chartjs 3.0+ 上做到这一点?
【解决方案2】:

如果有人使用 React 版本的 Chartjs,尤其是 react-chartjs-2,我已经使用 React Hooks 和 react-chartjs-2 完成了它,请参阅沙箱 demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2018-09-24
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多