Estou usando Chartjs para exibir um gráfico de linha e isso funciona bem:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Mas o problema ocorre quando tento alterar os dados do Chart. Eu atualizo o gráfico criando uma nova instância de um Gráfico com os novos pontos de dados e, assim, reinicializando a tela.
Isso funciona bem. No entanto, quando passo o mouse sobre o novo gráfico, se acontecer de eu passar por locais específicos correspondentes a pontos exibidos no gráfico antigo, o foco / rótulo ainda é acionado e de repente o gráfico antigo fica visível. Ele permanece visível enquanto meu mouse está neste local e desaparece quando me movo para fora desse ponto. Não quero que o gráfico antigo seja exibido. Eu quero removê-lo completamente.
Tentei limpar a tela e o gráfico existente antes de carregar o novo. Gostar:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
e
chart.clear();
Mas nada disso funcionou até agora. Alguma ideia de como posso impedir que isso aconteça?
fonte
Respostas:
Eu tive grandes problemas com isso
Primeiro tentei
.clear()
depois tentei.destroy()
e tentei definir minha referência de gráfico como nulaO que finalmente resolveu o problema para mim: excluir o
<canvas>
elemento e, em seguida, reaplicar um novo<canvas>
ao contêiner paiMeu código específico (obviamente, há um milhão de maneiras de fazer isso):
fonte
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
antes donew Chart(document.getElementById("myCanvas")
Eu enfrentei o mesmo problema algumas horas atrás.
O método ".clear ()" realmente limpa a tela, mas (evidentemente) deixa o objeto vivo e reativo.
Lendo com atenção a documentação oficial , na seção "Uso avançado", percebi o método ".destroy ()", descrito a seguir:
Ele realmente faz o que afirma e tem funcionado bem para mim, sugiro que você experimente.
fonte
fonte
Esta é a única coisa que funcionou para mim:
fonte
Eu tive o mesmo problema aqui ... Tentei usar os métodos destroy () e clear (), mas sem sucesso.
Eu resolvi isso da próxima maneira:
HTML:
Javascript:
Funciona perfeitamente para mim ... Espero que ajude.
fonte
Isso funcionou muito bem para mim
Use .destroy para destruir todas as instâncias de gráfico criadas. Isso limpará todas as referências armazenadas no objeto gráfico em Chart.js, junto com quaisquer ouvintes de eventos associados anexados por Chart.js. Deve ser chamado antes que a tela seja reutilizada para um novo gráfico.
fonte
Podemos atualizar os dados do gráfico no Chart.js V2.0 da seguinte maneira:
fonte
Usando o CanvasJS, isso funciona para mim, limpar o gráfico e tudo o mais pode funcionar para você também, garantindo que você configure sua tela / gráfico totalmente antes de cada processamento em outro lugar:
fonte
Eu também não consegui fazer .destroy () funcionar, então é isso que estou fazendo. O div chart_parent é onde eu quero que a tela apareça. Preciso que a tela seja redimensionada a cada vez, portanto, esta resposta é uma extensão da anterior.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
fonte
Quando você cria uma nova tela chart.js, isso gera um novo iframe oculto, é necessário excluir a tela e os iframes antigos.
referência: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
fonte
Isso funcionou para mim. Adicione uma chamada para clearChart, no topo de seu updateChart ()
fonte
Se você estiver usando chart.js em um projeto Angular com Typescript, você pode tentar o seguinte;
fonte
O que fizemos é, antes da inicialização do novo gráfico, remover / destruir a instância do gráfico de visualizações, se já existir, em seguida, criar um novo gráfico, por exemplo
Espero que isto ajude.
fonte
Complementando a resposta de Adam
Com Vanilla JS:
fonte
Edição simples para 2020:
Isso funcionou para mim. Altere o gráfico para global tornando-o proprietário da janela (alterar a declaração de
var myChart
parawindow myChart
)Verifique se a variável do gráfico já está inicializada como Gráfico, em caso afirmativo, destrua-a e crie uma nova, mesmo que você possa criar outra com o mesmo nome. Abaixo está o código:
Espero que funcione!
fonte
Para mim, funcionou:
fonte
Chart.js tem um bug:
Chart.controller(instance)
registra qualquer novo gráfico em uma propriedade globalChart.instances[]
e o exclui desta propriedade em.destroy()
.Mas, na criação do gráfico, Chart.js também escreve
._meta
propriedade na variável do conjunto de dados:e não exclui esta propriedade em
destroy()
.Se você usar seu objeto de conjunto de dados antigo sem remover
._meta property
, Chart.js adicionará novo conjunto de dados a._meta
sem excluir os dados anteriores. Portanto, na reinicialização de cada gráfico, o objeto do conjunto de dados acumula todos os dados anteriores.Para evitar isso, destrua o objeto do conjunto de dados após a chamada
Chart.destroy()
.fonte
Já que destruir meio que destrói "tudo", uma solução simples e barata quando tudo o que você realmente quer é apenas "redefinir os dados". Redefinir seus conjuntos de dados para um array vazio funcionará perfeitamente bem também. Portanto, se você tiver um conjunto de dados com rótulos e um eixo em cada lado:
Depois disso, você pode simplesmente ligar para:
ou, dependendo se você está usando um conjunto de dados 2D:
Será muito mais leve do que destruir completamente seu gráfico / conjunto de dados e reconstruir tudo.
fonte
para quem gosta de mim usa uma função para criar vários gráficos e quer atualizá-los um bloco também, só a função .destroy () funcionou para mim, gostaria de fazer um .update (), que parece mais limpo, mas .. . aqui está um trecho de código que pode ajudar.
fonte