2015-01-22 13 views
8

Zajmuję się tworzeniem strony korzystającej z chart.js (www.chartjs.org).Chart.js: ukrywanie serii przez kliknięcie na legendę

Muszę sporządzić wykres liniowy, który pokazuje wiele serii danych, które użytkownicy mogą ukryć lub pokazać, klikając odpowiedni symbol legendy (podobny do tego http://js.syncfusion.com/demos/web/#!/azure/chart/linechart).

Czy można to zrobić za pomocą chartjs?

+0

Po prostu przerysować wykres bez tej serii? – Pointy

+0

@Pointy Zastanawiam się, czy był łatwiejszy, samowystarczalny i bardziej automatyczny sposób na zrobienie tego. W ten sposób muszę dołączać wydarzenie do elementów legendy, wykluczać lub dołączać serie i przerysowywać. Z wieloma wykresami idzie to szybko w kierunku chaosu, imo, ale i tak dziękuję. – pomarc

+0

Cóż, o ile mogę powiedzieć, Chart.js w szczególności nie ma wiele wyrafinowania na temat obsługi interakcji. – Pointy

Odpowiedz

0

Nie znalazłem sposobu, aby to zrobić. Łatwo jest wprowadzić pewne zachowanie onclick w szablonie legendy i łatwo można zmienić skok serii i kolory kanału alfa na 0, aby obszar i obrys zniknął, ale nie znalazłem sposobu, aby to zrobić w punktach.

Zdecydowałem się użyć wykresów google dla tego konkretnego wykresu i pliku chart.js, gdy nie potrzebuję tego zachowania, mając nadzieję, że dobrzy twórcy pliku chart.js dodadzą go w przyszłości.

13

Można spróbować to
Tworzenie sklepu ukrytych zbiorów danych

window.chartName = new Chart(... 

window.chartName.store = new Array(); 

Następnie za pomocą tej funkcji można aktualizować wykresu, należy obchodzić się przez kliknięcie na pozycji legendy

function updateDataset(legendLi, chart, label) { 
     var store = chart.store; 
     var exists = false; 
     for (var i = 0; i < store.length; i++) { 
     if (store[i][0] === label) { 
      exists = true; 
      chart.datasets.push(store.splice(i, 1)[0][1]); 
      legendLi.fadeTo("slow", 1); 
     } 
     } 
     if (!exists) { 
     for (var i = 0; i < chart.datasets.length; i++) { 
      if (chart.datasets[i].label === label) { 
      chart.store.push([label, chart.datasets.splice(i, 1)[0]]); 
      legendLi.fadeTo("slow", 0.33); 
      } 
     } 
     } 
     chart.update(); 
    } 

nie zapomnij zaktualizowane szablon legendy w opcjach wykresu:

legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li class=\"legend-item\" onclick=\"updateDataset($(this), window.chartName, '<%=datasets[i].label%>')\"><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>" 

Krótko, dodałem ten moduł obsługi onclick dla elementu li

<li class=\"legend-item\" onclick=\"updateDataset($(this), window.chartName , '<%=datasets[i].label%>')\">< 

Na przykład fiddle

+1

Na przykład przełącz linię na wykresie http://jsfiddle.net/1qjco9Ls/ – Igor

+2

Ta odpowiedź powinna zostać przyjęta i zatwierdzona. – Vico

+0

Nie wiem, dlaczego to nie jest bardziej popularne. Bardzo mi to pomogło, dziękuję! +1 i więcej, gdybym mógł – SirDerpington

-2
onLegendClick: function (e) { 
var series = e.target; 
       series.isVisible() ? series.hide() : series.show(); 
      }, 

dxcharts mieć funkcję o nazwie onLegendClick, kilka innych są onSeriesClick i onPointClick. Mam nadzieję, że to pomoże.

+2

Pierwotne pytanie dotyczy użycia ChartJS, a nie dxCharts, więc nie jest to pomocne. – jschrab

2

To jest teraz dostępny w Charts.js

Z dokumentacji http://www.chartjs.org/docs/#chart-configuration-legend-configuration

Legenda Konfiguracja

Konfiguracja legenda jest przekazywana do nazw options.legend. Globalne opcje legendy wykresu są zdefiniowane w Chart.defaults.global.legend.

onClick function (event, legendItem) {} a zwrotna, która jest wywoływana, gdy 'kliknięcia' zdarzenie jest rejestrowane na szczycie elementu label

onHover funkcyjnego (zdarzeń legendItem) {} a wywołanie zwrotne, które jest wywołane, gdy zdarzenie "mousemove" jest zarejestrowane na etykiecie pozycji

Powiązane problemy