<i id='mdOBL'><tr id='mdOBL'><dt id='mdOBL'><q id='mdOBL'><span id='mdOBL'><b id='mdOBL'><form id='mdOBL'><ins id='mdOBL'></ins><ul id='mdOBL'></ul><sub id='mdOBL'></sub></form><legend id='mdOBL'></legend><bdo id='mdOBL'><pre id='mdOBL'><center id='mdOBL'></center></pre></bdo></b><th id='mdOBL'></th></span></q></dt></tr></i><div id='mdOBL'><tfoot id='mdOBL'></tfoot><dl id='mdOBL'><fieldset id='mdOBL'></fieldset></dl></div>
      <tfoot id='mdOBL'></tfoot>

      1. <small id='mdOBL'></small><noframes id='mdOBL'>

          <bdo id='mdOBL'></bdo><ul id='mdOBL'></ul>
        <legend id='mdOBL'><style id='mdOBL'><dir id='mdOBL'><q id='mdOBL'></q></dir></style></legend>

      2. ChartJS 版本 3 - 多个折线图的常用图例

        时间:2023-11-02
        <tfoot id='MtNFo'></tfoot>

            <tbody id='MtNFo'></tbody>
          • <legend id='MtNFo'><style id='MtNFo'><dir id='MtNFo'><q id='MtNFo'></q></dir></style></legend>

            • <bdo id='MtNFo'></bdo><ul id='MtNFo'></ul>
                • <small id='MtNFo'></small><noframes id='MtNFo'>

                • <i id='MtNFo'><tr id='MtNFo'><dt id='MtNFo'><q id='MtNFo'><span id='MtNFo'><b id='MtNFo'><form id='MtNFo'><ins id='MtNFo'></ins><ul id='MtNFo'></ul><sub id='MtNFo'></sub></form><legend id='MtNFo'></legend><bdo id='MtNFo'><pre id='MtNFo'><center id='MtNFo'></center></pre></bdo></b><th id='MtNFo'></th></span></q></dt></tr></i><div id='MtNFo'><tfoot id='MtNFo'></tfoot><dl id='MtNFo'><fieldset id='MtNFo'></fieldset></dl></div>
                  本文介绍了ChartJS 版本 3 - 多个折线图的常用图例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我想为多个图表有一个共同的图例,我遇到了这篇文章 Chart.js 具有一个共同图例的多个图表,它可能适用于低于 3 的 ChartJS 版本,但是我没有尝试过,因为我使用的是 ChartJS 版本 3.

                  I want to have one common legend for multiple charts, I came across this post Chart.js Multiple charts with one common legend which may work with ChartJS version less than 3, however I did not try it as I am using ChartJS version 3.

                  给定的解决方案不适用于 ChartJS 版本 >3 因为很少有 API 函数在版本 3 中被弃用 - Chart.prototype.generateLegend

                  The given solution doesn't work with ChartJS Version > 3 as few of the API functions are deprecated in version 3 - Chart.prototype.generateLegend

                  有人可以帮助如何使用 ChartJS 版本 3(最新版本)实现这一目标.这是我正在寻找的非常重要的功能之一.

                  Can someone help how to achieve this with ChartJS version 3(latest version). This is one of the very important feature which I am looking for.

                  推荐答案

                  您可以使用自定义插件生成图例并将点击处理程序绑定到所有图表,在我当前的实现中,您必须将所有图表放入一个数组让它工作:

                  You can use a custom plugin to generate a legend and bind the click handler to all your charts, in my current implementation you will have to put all your charts in a single array for it to work:

                  const getOrCreateLegendList = (chart, id) => {
                    const legendContainer = document.getElementById(id);
                    let listContainer = legendContainer.querySelector('ul');
                  
                    if (!listContainer) {
                      listContainer = document.createElement('ul');
                      listContainer.style.display = 'flex';
                      listContainer.style.flexDirection = 'row';
                      listContainer.style.margin = 0;
                      listContainer.style.padding = 0;
                  
                      legendContainer.appendChild(listContainer);
                    }
                  
                    return listContainer;
                  };
                  
                  const htmlLegendPlugin = {
                    id: 'htmlLegend',
                    afterUpdate(chart, args, options) {
                      const ul = getOrCreateLegendList(chart, options.containerID);
                  
                      // Remove old legend items
                      while (ul.firstChild) {
                        ul.firstChild.remove();
                      }
                  
                      // Reuse the built-in legendItems generator
                      const items = chart.options.plugins.legend.labels.generateLabels(chart);
                  
                      items.forEach(item => {
                        const li = document.createElement('li');
                        li.style.alignItems = 'center';
                        li.style.cursor = 'pointer';
                        li.style.display = 'flex';
                        li.style.flexDirection = 'row';
                        li.style.marginLeft = '10px';
                  
                        li.onclick = () => {
                          const {
                            type
                          } = chart.config;
                          if (type === 'pie' || type === 'doughnut') {
                            // Pie and doughnut charts only have a single dataset and visibility is per item
                            charts.forEach((chartItem) => {
                              chartItem.toggleDataVisibility(item.index);
                              chartItem.update();
                            })
                          } else {
                            charts.forEach((chartItem) => {
                              chartItem.setDatasetVisibility(item.datasetIndex, !chartItem.isDatasetVisible(item.datasetIndex));
                              chartItem.update();
                            })
                          }
                        };
                  
                        // Color box
                        const boxSpan = document.createElement('span');
                        boxSpan.style.background = item.fillStyle;
                        boxSpan.style.borderColor = item.strokeStyle;
                        boxSpan.style.borderWidth = item.lineWidth + 'px';
                        boxSpan.style.display = 'inline-block';
                        boxSpan.style.height = '20px';
                        boxSpan.style.marginRight = '10px';
                        boxSpan.style.width = '20px';
                  
                        // Text
                        const textContainer = document.createElement('p');
                        textContainer.style.color = item.fontColor;
                        textContainer.style.margin = 0;
                        textContainer.style.padding = 0;
                        textContainer.style.textDecoration = item.hidden ? 'line-through' : '';
                  
                        const text = document.createTextNode(item.text);
                        textContainer.appendChild(text);
                  
                        li.appendChild(boxSpan);
                        li.appendChild(textContainer);
                        ul.appendChild(li);
                      });
                    }
                  };
                  
                  const options = {
                    type: 'line',
                    data: {
                      labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
                      datasets: [{
                          label: '# of Votes',
                          data: [12, 19, 3, 5, 2, 3],
                          borderColor: 'pink',
                          backgroundColor: 'pink',
                        },
                        {
                          label: '# of Points',
                          data: [7, 11, 5, 8, 3, 7],
                          borderColor: 'yellow',
                          backgroundColor: 'yellow',
                        }
                      ]
                    },
                    options: {
                      plugins: {
                        legend: {
                          display: false,
                        },
                        htmlLegend: {
                          // ID of the container to put the legend in
                          containerID: 'chartLegend',
                        }
                      }
                    },
                    plugins: [htmlLegendPlugin]
                  }
                  
                  const options2 = {
                    type: 'line',
                    data: {
                      labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
                      datasets: [{
                          label: '# of Votes',
                          data: [4, 9, 13, 15, 12, 6],
                          borderColor: 'pink',
                          backgroundColor: 'pink',
                        },
                        {
                          label: '# of Points',
                          data: [17, 1, 15, 18, 9, 3],
                          borderColor: 'yellow',
                          backgroundColor: 'yellow',
                        }
                      ]
                    },
                    options: {
                      plugins: {
                        legend: {
                          display: false
                        }
                      }
                    }
                  }
                  
                  const ctx = document.getElementById('chartJSContainer').getContext('2d');
                  const ctx2 = document.getElementById('chartJSContainer2').getContext('2d');
                  
                  const chart = new Chart(ctx, options);
                  const chart2 = new Chart(ctx2, options2);
                  
                  const charts = [chart, chart2];

                  <body>
                    <div id="chartLegend">
                  
                    </div>
                    <canvas id="chartJSContainer" width="600" height="400"></canvas>
                    <canvas id="chartJSContainer2" width="600" height="400"></canvas>
                    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.0/chart.js"></script>
                  </body>

                  这篇关于ChartJS 版本 3 - 多个折线图的常用图例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:Charts.js 缩放 yaxes 刻度 min max 不起作用 下一篇:没有了

                  相关文章

                • <legend id='QioHY'><style id='QioHY'><dir id='QioHY'><q id='QioHY'></q></dir></style></legend>
                    <bdo id='QioHY'></bdo><ul id='QioHY'></ul>

                • <i id='QioHY'><tr id='QioHY'><dt id='QioHY'><q id='QioHY'><span id='QioHY'><b id='QioHY'><form id='QioHY'><ins id='QioHY'></ins><ul id='QioHY'></ul><sub id='QioHY'></sub></form><legend id='QioHY'></legend><bdo id='QioHY'><pre id='QioHY'><center id='QioHY'></center></pre></bdo></b><th id='QioHY'></th></span></q></dt></tr></i><div id='QioHY'><tfoot id='QioHY'></tfoot><dl id='QioHY'><fieldset id='QioHY'></fieldset></dl></div>

                    <tfoot id='QioHY'></tfoot>

                    <small id='QioHY'></small><noframes id='QioHY'>