Używam Chartjs do wyświetlania wykresu liniowego i to działa dobrze:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Ale problem pojawia się, gdy próbuję zmienić dane wykresu. Aktualizuję wykres, tworząc nową instancję wykresu z nowymi punktami danych, a tym samym ponownie inicjując płótno.
To działa dobrze. Jednak gdy najeżdżam kursorem na nowy wykres, jeśli zdarzy mi się przejść przez określone lokalizacje odpowiadające punktom wyświetlanym na starym wykresie, wskaźnik myszy / etykieta jest nadal wyzwalany i nagle stary wykres jest widoczny. Pozostaje widoczny, gdy moja mysz znajduje się w tym miejscu, i znika, gdy odejdzie od tego punktu. Nie chcę, aby wyświetlał się stary wykres. Chcę go całkowicie usunąć.
Próbowałem wyczyścić płótno i istniejący wykres przed załadowaniem nowego. Lubić:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
i
chart.clear();
Ale żadne z nich do tej pory nie zadziałało. Jakieś pomysły, jak mogę temu zapobiec?
źródło
Odpowiedzi:
Miałem z tym ogromne problemy
Najpierw spróbowałem,
.clear()
potem spróbowałem.destroy()
i próbowałem ustawić moje odniesienie wykresu na zeroCo ostatecznie rozwiązało problem: usunięcie
<canvas>
elementu, a następnie ponowne dołączenie nowego<canvas>
do kontenera nadrzędnegoMój konkretny kod (oczywiście jest na to milion sposobów):
źródło
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
przednew Chart(document.getElementById("myCanvas")
Kilka godzin temu miałem ten sam problem.
Metoda „.clear ()” faktycznie czyści kanwę, ale (ewidentnie) pozostawia obiekt żywy i reaktywny.
Czytając uważnie oficjalną dokumentację , w sekcji „Zaawansowane użycie” zauważyłem metodę „.destroy ()”, opisaną w następujący sposób:
W rzeczywistości robi to, co twierdzi i działa dobrze dla mnie, proponuję spróbować.
źródło
źródło
To jedyna rzecz, która zadziałała dla mnie:
źródło
Miałem tutaj ten sam problem ... Próbowałem użyć metody zniszcz () i wyczyść (), ale bez powodzenia.
Rozwiązałem to w następujący sposób:
HTML:
JavaScript:
U mnie działa idealnie ... Mam nadzieję, że to pomaga.
źródło
To działało bardzo dobrze dla mnie
Użyj .destroy this, aby zniszczyć wszelkie utworzone instancje wykresów. Spowoduje to wyczyszczenie wszelkich odniesień przechowywanych do obiektu wykresu w Chart.js, wraz ze wszystkimi powiązanymi detektorami zdarzeń dołączonymi przez Chart.js. Należy to wywołać, zanim płótno zostanie ponownie użyte dla nowego wykresu.
źródło
Możemy zaktualizować dane wykresu w Chart.js V2.0 w następujący sposób:
źródło
Korzystając z CanvasJS, działa to dla mnie, usuwając wykres i wszystko inne, może również działać dla Ciebie, zapewniając pełne ustawienie płótna / wykresu przed każdym przetwarzaniem w innym miejscu:
źródło
Nie mogłem też zmusić .destroy () do działania, więc to właśnie robię. Element div chart_parent jest miejscem, w którym ma się wyświetlać płótno. Za każdym razem potrzebuję zmiany rozmiaru płótna, więc ta odpowiedź jest rozszerzeniem powyższej.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
źródło
Gdy tworzysz nową kanwę chart.js, generuje ona jedną nową ukrytą ramkę iframe, musisz usunąć kanwę i stare elementy iframe.
odniesienie: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
źródło
To zadziałało dla mnie. Dodaj wywołanie do clearChart, na górze twojego updateChart ()
źródło
Jeśli używasz chart.js w projekcie Angular z Typescript, możesz wypróbować następujące rozwiązania;
źródło
To, co zrobiliśmy, to przed inicjalizacją nowego wykresu, usunięcie / zniszczenie podglądu Wystąpienie wykresu, jeśli już istnieje, a następnie utworzenie nowego wykresu, na przykład
Mam nadzieję że to pomoże.
źródło
Uzupełnienie odpowiedzi Adama
Z Vanilla JS:
źródło
Prosta edycja na rok 2020:
To zadziałało dla mnie. Zmień wykres na globalny, ustawiając go jako własność okna (Zmień deklarację z
var myChart
nawindow myChart
)Sprawdź, czy zmienna wykresu jest już zainicjowana jako Wykres, jeśli tak, zniszcz ją i utwórz nową, nawet jeśli możesz utworzyć inną o tej samej nazwie. Poniżej kod:
Mam nadzieję, że to działa!
źródło
U mnie to zadziałało:
źródło
Chart.js ma błąd:
Chart.controller(instance)
rejestruje każdy nowy wykres we właściwości globalnejChart.instances[]
i usuwa go z tej właściwości w dniu.destroy()
.Ale przy tworzeniu wykresu Chart.js zapisuje również
._meta
właściwość do zmiennej zestawu danych:i nie usuwa tej właściwości w dniu
destroy()
.Jeśli użyjesz starego obiektu zestawu danych bez usuwania
._meta property
, Chart.js doda nowy zestaw danych._meta
bez usuwania poprzednich danych. W ten sposób przy ponownej inicjalizacji każdego wykresu obiekt zestawu danych gromadzi wszystkie poprzednie dane.Aby tego uniknąć, po wywołaniu należy zniszczyć obiekt zestawu danych
Chart.destroy()
.źródło
Ponieważ niszczenie niszczy „wszystko”, tanim i prostym rozwiązaniem jest tylko „zresetowanie danych”. Zresetowanie zestawów danych do pustej tablicy również będzie działać idealnie. Jeśli więc masz zbiór danych z etykietami i osiami po każdej stronie:
Następnie możesz po prostu zadzwonić:
lub, w zależności od tego, czy korzystasz z zestawu danych 2D:
Będzie to o wiele lżejsze niż całkowite zniszczenie całego wykresu / zbioru danych i odbudowanie wszystkiego.
źródło
dla tych, którzy tak jak ja używają funkcji do tworzenia kilku grafik i chcą je również zaktualizować blok, tylko funkcja .destroy () działała dla mnie, chciałbym zrobić .update (), który wydaje się czystszy, ale ... . oto fragment kodu, który może pomóc.
źródło