Estoy usando Chartjs para mostrar un gráfico de líneas y esto funciona bien:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Pero el problema ocurre cuando trato de cambiar los datos del gráfico. Actualizo el gráfico creando una nueva instancia de un gráfico con los nuevos puntos de datos y, por lo tanto, reinicializo el lienzo.
Esto funciona bien. Sin embargo, cuando coloco el cursor sobre el nuevo gráfico, si paso por encima de ubicaciones específicas correspondientes a los puntos que se muestran en el gráfico anterior, el cursor / etiqueta todavía se activa y, de repente, el gráfico anterior es visible. Permanece visible mientras mi mouse está en esta ubicación y desaparece cuando me muevo de ese punto. No quiero que se muestre el gráfico antiguo. Quiero eliminarlo por completo.
Intenté borrar tanto el lienzo como el gráfico existente antes de cargar el nuevo. Me gusta:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
y
chart.clear();
Pero ninguno de estos ha funcionado hasta ahora. ¿Alguna idea sobre cómo puedo evitar que esto suceda?
fuente
Respuestas:
Tuve grandes problemas con esto
Primero lo intenté,
.clear()
luego lo intenté.destroy()
e intenté establecer la referencia de mi gráfico en nuloLo que finalmente solucionó el problema para mí: eliminar el
<canvas>
elemento y luego volver a agregar uno nuevo<canvas>
al contenedor principalMi código específico (obviamente hay un millón de formas de hacer esto):
fuente
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
antes delnew Chart(document.getElementById("myCanvas")
Me he enfrentado al mismo problema hace unas horas.
El método ".clear ()" en realidad borra el lienzo, pero (evidentemente) deja el objeto vivo y reactivo.
Leyendo detenidamente la documentación oficial , en la sección "Uso avanzado", he notado el método ".destroy ()", descrito a continuación:
De hecho, hace lo que dice y me ha funcionado bien, te sugiero que lo pruebes.
fuente
fuente
Esto es lo único que funcionó para mí:
fuente
Tuve el mismo problema aquí ... Traté de usar el método destroy () y clear (), pero sin éxito.
Lo resolví de la siguiente manera:
HTML:
Javascript:
Funciona perfecto para mí ... Espero que ayude.
fuente
Esto funcionó muy bien para mi
Use .destroy this para destruir cualquier instancia de gráfico que se cree. Esto limpiará cualquier referencia almacenada al objeto de gráfico dentro de Chart.js, junto con cualquier detector de eventos asociado adjunto por Chart.js. Esto se debe llamar antes de que el lienzo se reutilice para un nuevo gráfico.
fuente
Podemos actualizar los datos del gráfico en Chart.js V2.0 de la siguiente manera:
fuente
Al usar CanvasJS, esto me funciona al borrar el gráfico y todo lo demás, también podría funcionar para usted, ya que le permite configurar su lienzo / gráfico completamente antes de cada procesamiento en otro lugar:
fuente
Tampoco pude hacer que .destroy () funcione, así que esto es lo que estoy haciendo. El div chart_parent es donde quiero que aparezca el lienzo. Necesito que el lienzo cambie de tamaño cada vez, por lo que esta respuesta es una extensión de la anterior.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
fuente
Cuando crea un nuevo lienzo de chart.js, esto genera un nuevo iframe oculto, necesita eliminar el lienzo y los viejos iframes.
referencia: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
fuente
Esto funcionó para mí. Agregue una llamada a clearChart, en la parte superior de su updateChart ()
fuente
Si está utilizando chart.js en un proyecto Angular con Typescript, puede probar lo siguiente;
fuente
Lo que hicimos fue, antes de la inicialización de un nuevo gráfico, eliminar / destruir las vistas previas de la instancia del Gráfico, si ya existe, luego crear un nuevo gráfico, por ejemplo
Espero que esto ayude.
fuente
Complementando la respuesta de Adam
Con Vanilla JS:
fuente
Edición simple para 2020:
Esto funcionó para mí. Cambie el gráfico a global haciéndolo propiedad de la ventana (cambie la declaración de
var myChart
awindow myChart
)Compruebe si la variable del gráfico ya está inicializada como Gráfico, de ser así, destrúyala y cree una nueva, incluso puede crear otra con el mismo nombre. A continuación se muestra el código:
¡Espero que funcione!
fuente
Para mí esto funcionó:
fuente
Chart.js tiene un error:
Chart.controller(instance)
registra cualquier gráfico nuevo en una propiedad globalChart.instances[]
y lo elimina de esta propiedad en.destroy()
.Pero en la creación del gráfico, Chart.js también escribe la
._meta
propiedad en la variable del conjunto de datos:y no elimina esta propiedad en
destroy()
.Si usa su antiguo objeto de conjunto de datos sin eliminarlo
._meta property
, Chart.js agregará un nuevo conjunto de datos._meta
sin eliminar los datos anteriores. Por lo tanto, en la reinicialización de cada gráfico, su objeto de conjunto de datos acumula todos los datos anteriores.Para evitar esto, destruya el objeto del conjunto de datos después de llamar
Chart.destroy()
.fuente
Dado que destruir destruye "todo", una solución barata y simple cuando todo lo que realmente quieres es simplemente "restablecer los datos". Restablecer sus conjuntos de datos a una matriz vacía también funcionará perfectamente. Entonces, si tiene un conjunto de datos con etiquetas y un eje en cada lado:
Después de esto, simplemente puede llamar:
o, dependiendo de si está utilizando un conjunto de datos 2d:
Será mucho más liviano que destruir completamente todo su gráfico / conjunto de datos y reconstruir todo.
fuente
para aquellos que como yo usan una función para crear varios gráficos y quieren actualizarlos también en un bloque, solo la función .destroy () funcionó para mí, me hubiera gustado hacer un .update (), que parece más limpio pero .. .Aquí hay un fragmento de código que puede ayudar.
fuente