Saya menggunakan Chartjs untuk menampilkan Diagram Garis dan ini berfungsi dengan baik:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Tetapi masalah terjadi ketika saya mencoba mengubah data untuk Bagan. Saya memperbarui grafik dengan membuat contoh baru dari Bagan dengan titik data baru, dan dengan demikian menginisialisasi ulang kanvas.
Ini bekerja dengan baik. Namun, ketika saya mengarahkan kursor ke grafik baru, jika saya kebetulan pergi ke lokasi tertentu yang sesuai dengan poin yang ditampilkan pada grafik lama, hover / label masih terpicu dan tiba-tiba grafik lama terlihat. Itu tetap terlihat saat mouse saya berada di lokasi ini dan menghilang saat berpindah dari titik itu. Saya tidak ingin grafik lama ditampilkan. Saya ingin menghapusnya sepenuhnya.
Saya sudah mencoba untuk menghapus kanvas dan bagan yang ada sebelum memuat yang baru. Suka:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
dan
chart.clear();
Tapi sejauh ini tidak ada yang berhasil. Ada ide tentang bagaimana saya bisa menghentikan hal ini terjadi?
sumber
Jawaban:
Saya punya masalah besar dengan ini
Pertama saya mencoba
.clear()
kemudian saya mencoba.destroy()
dan saya mencoba mengatur referensi grafik saya ke nullApa yang akhirnya memperbaiki masalah saya: menghapus
<canvas>
elemen lalu menambahkan kembali yang baru<canvas>
ke penampung indukKode spesifik saya (jelas ada jutaan cara untuk melakukan ini):
sumber
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
sebelumnew Chart(document.getElementById("myCanvas")
Saya telah menghadapi masalah yang sama beberapa jam yang lalu.
Metode ".clear ()" sebenarnya membersihkan kanvas, tetapi (ternyata) membiarkan objek hidup dan reaktif.
Membaca dengan cermat dokumentasi resmi , di bagian "Penggunaan lanjutan", saya telah memperhatikan metode ".destroy ()", yang dijelaskan sebagai berikut:
Ini benar-benar melakukan apa yang diklaimnya dan berfungsi dengan baik untuk saya, saya sarankan Anda untuk mencobanya.
sumber
sumber
Ini adalah satu-satunya hal yang berhasil untuk saya:
sumber
Saya memiliki masalah yang sama di sini ... Saya mencoba menggunakan metode destroy () dan clear (), tetapi tidak berhasil.
Saya menyelesaikannya dengan cara berikutnya:
HTML:
Javascript:
Ini bekerja sempurna untuk saya ... Saya harap Itu membantu.
sumber
Ini bekerja dengan sangat baik untuk saya
Gunakan .destroy this untuk menghancurkan semua instance grafik yang dibuat. Ini akan membersihkan semua referensi yang disimpan ke objek grafik dalam Chart.js, bersama dengan event listener terkait yang dilampirkan oleh Chart.js. Ini harus dipanggil sebelum kanvas digunakan kembali untuk grafik baru.
sumber
Kami dapat memperbarui data grafik di Chart.js V2.0 sebagai berikut:
sumber
Menggunakan CanvasJS, ini berfungsi untuk saya membersihkan bagan dan yang lainnya, mungkin bekerja untuk Anda juga, memungkinkan Anda mengatur kanvas / bagan Anda sepenuhnya sebelum setiap pemrosesan di tempat lain:
sumber
Saya juga tidak bisa membuat .destroy () berfungsi jadi inilah yang saya lakukan. Div chart_parent adalah tempat saya ingin kanvas muncul. Saya perlu kanvas untuk mengubah ukuran setiap kali, jadi jawaban ini merupakan perpanjangan dari yang di atas.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
sumber
Saat Anda membuat satu kanvas chart.js baru, ini menghasilkan satu iframe baru yang disembunyikan, Anda perlu menghapus kanvas dan iframe lama.
referensi: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
sumber
Ini berhasil untuk saya. Tambahkan panggilan ke clearChart, di bagian atas updateChart Anda ()
sumber
Jika Anda menggunakan chart.js dalam proyek Angular dengan Typecript, Anda dapat mencoba yang berikut;
sumber
Yang kita lakukan adalah, sebelum inisialisasi chart baru, hapus / hancurkan instance Chart preview, jika sudah ada, lalu buat chart baru, misalnya
Semoga ini membantu.
sumber
Melengkapi Jawaban Adam
Dengan Vanilla JS:
sumber
Pengeditan sederhana untuk tahun 2020:
Ini berhasil untuk saya. Ubah grafik menjadi global dengan menjadikannya milik jendela (Ubah deklarasi dari
var myChart
menjadiwindow myChart
)Periksa apakah variabel grafik sudah diinisialisasi sebagai Chart, jika demikian, hancurkan dan buat yang baru, bahkan Anda dapat membuat yang lain dengan nama yang sama. Berikut kodenya:
Semoga berhasil!
sumber
Bagi saya ini berhasil:
sumber
Chart.js memiliki bug:
Chart.controller(instance)
mendaftarkan bagan baru di properti globalChart.instances[]
dan menghapusnya dari properti ini pada.destroy()
.Tetapi pada pembuatan grafik, Chart.js juga menulis
._meta
properti ke variabel set data:dan tidak menghapus properti ini di
destroy()
.Jika Anda menggunakan objek dataset lama Anda tanpa menghapus
._meta property
, Chart.js akan menambahkan dataset baru ke._meta
tanpa menghapus data sebelumnya. Jadi, pada setiap inisialisasi ulang diagram, objek set data Anda mengakumulasikan semua data sebelumnya.Untuk menghindarinya, hancurkan objek set data setelah dipanggil
Chart.destroy()
.sumber
Karena jenis menghancurkan menghancurkan "segalanya", solusi yang murah dan sederhana ketika semua yang Anda inginkan hanyalah "mengatur ulang data". Mengatur ulang kumpulan data Anda ke array kosong juga akan berfungsi dengan baik. Jadi, jika Anda memiliki kumpulan data dengan label, dan sumbu di setiap sisinya:
Setelah ini, Anda cukup menelepon:
atau, tergantung apakah Anda menggunakan kumpulan data 2d:
Ini akan jauh lebih ringan daripada menghancurkan seluruh grafik / dataset Anda, dan membangun kembali semuanya.
sumber
bagi mereka yang menyukai saya menggunakan fungsi untuk membuat beberapa grafik dan ingin memperbaruinya juga, hanya fungsi .destroy () yang berfungsi untuk saya, saya ingin membuat .update (), yang terlihat lebih bersih tetapi .. Berikut adalah potongan kode yang mungkin membantu.
sumber