На одной странице есть несколько графиков. Каждая строка графика является общей. Я хочу отобразить легенду, которая является общей для нескольких диаграмм, например, на рисунке. Она отображает и скрывает все линии диаграммы с помощью OnClick, как легенда по умолчанию. ЭТО ИЗОБРАЖЕНИЕ - ЛОЖЬ ЭТО ИЗОБРАЖЕНИЕ ЛОЖНОЕ

Это возможно? как?

Я пытался переключать легенду синхронизации Chart.js на нескольких графиках, Одна легенда, несколько диаграмм, диаграмма 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',
                }
            }]
        }
    }
});
4
prophet5 16 Авг 2019 в 20:14

2 ответа

Лучший ответ

Вы можете создать общую легенду и через API generateLegend, если оба набора данных похожи.

Сначала отключите легенды по умолчанию, хотя параметры

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

5
karthick 16 Авг 2019 в 20:05

Если кто-либо, использующий версию Chartjs для React, особенно response-chartjs-2, я сделал это с помощью React-хуков с response-chartjs-2, см. Песочницу demo

1
ANaemi 10 Фев 2020 в 02:12