¿Cómo redibujo / cambio la escala de un gráfico de líneas de Google al cambiar el tamaño de la ventana?
javascript
jquery
resize
google-visualization
thecodeparadox
fuente
fuente
Respuestas:
Para volver a dibujar solo cuando se completa el cambio de tamaño de la ventana y evitar múltiples disparadores, creo que es mejor crear un evento:
//create trigger to resizeEnd event $(window).resize(function() { if(this.resizeTO) clearTimeout(this.resizeTO); this.resizeTO = setTimeout(function() { $(this).trigger('resizeEnd'); }, 500); }); //redraw graph when window resize is completed $(window).on('resizeEnd', function() { drawChart(data); });
fuente
El código original de Google simplemente hace esto al final:
var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, options);
Cambiándolo con un poco de javascript, puede escalarlo cuando la ventana cambia de tamaño:
function resize () { var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, options); } window.onload = resize; window.onresize = resize;
fuente
window.onload = resize();
es equivalente aresize(); window.onload = undefined;
Dado que el
window.resize
evento se activa varias veces en cada evento de cambio de tamaño, creo que la mejor solución es usar smartresize.js y usarsmartdraw()
. Esto limita el número de redibujados de gráficos porwindow.resize
.Al usar los js proporcionados, puede hacerlo de la siguiente manera:
// Instantiate and draw our user charts, passing in some options (as you probably were doing it) var chart = new google.visualization.LineChart(document.getElementById('div_chart')); chart.draw(data, options); // And then: $(window).smartresize(function () { chart.draw(data, options); });
fuente
Esta es la forma más sencilla en la que puedo solucionarlo sin causar demasiado estrés al navegador:
var chart1 = "done"; $(window).resize(function() { if(chart1=="done"){ chart1 = "waiting"; setTimeout(function(){drawChart();chart1 = "done"},1000); } });
Todo lo que hace es esperar 1 segundo antes de que se recargue el gráfico y no permite que la función vuelva a llamar en este período de espera. Como las funciones de cambio de tamaño de la ventana se llaman varias veces cada vez que cambia el tamaño de la ventana, esto ayuda a que la función solo funcione una vez cada vez que cambia el tamaño de la ventana, el resto de las llamadas se detienen con la instrucción if.
espero que esto ayude
fuente
No hay ninguna opción en la API de visualización de Google para hacer que los gráficos de Google sean receptivos.
Pero podemos hacer que los gráficos de Google respondan a los cambios de tamaño de las ventanas . Para que Google Chart responda, hay una biblioteca jQuery disponible en GitHub: jquery-smartresize con licencia MIT License, que tiene la capacidad de cambiar el tamaño de los gráficos en el evento de cambio de tamaño de la ventana.
Este proyecto en GitHub tiene dos archivos de script: -
jquery.debouncedresize.js: adds a special event that fires once after the window has been resized.
Y
jquery.throttledresize.js: adds a special event that fires at a reduced rate (no more double events from Chrome and Safari).
Aquí hay dos ejemplos de gráficos receptivos ...
Podemos cambiar el relleno inferior de visualization_wrap para que coincida con la relación de aspecto deseada del gráfico.
Calculate as Height / Width x 100 For a 16x9 display it would be 9/16 = 0.5625 x 100 = 56.25% For a square it'd be 100%
Podemos personalizar ChartArea opción de gráficos de Google para asegurarse de que las etiquetas no queden cortados al redimensionar .
fuente
Redibujar / cambiar la escala de un gráfico de líneas de Google al cambiar el tamaño de la ventana:
$(document).ready(function () { $(window).resize(function(){ drawChart(); }); });
fuente
Personalmente, prefiero el siguiente enfoque, si puede vivir con el uso de addEventListener y no le importa la falta de soporte para IE <9.
var windowResizeTimer; window.addEventListener('resize', function(e){ clearTimeout(windowResizeTimer); windowResizeTimer = setTimeout(function(){ chart.draw(data, options); }, 750); });
Observe el uso de la
setTimeout()
yclearTimeout()
las funciones y el retraso añadido de 750 milisegundos, lo que hace que este un poco menos intensa cuando hay varios eventos de cambio de tamaño fuego en rápida sucesión (que es a menudo el caso de los navegadores de escritorio al cambiar el tamaño usando un ratón).fuente
He estado estancado en lo mismo durante días y descubrí que agregar un evento funciona mejor.
window.addEventListener("resize", drawChart);
Simplemente agregue esta línea después de declarar su función y funcionará bien.
Reemplace drawChart con el nombre de su función.
fuente
Usando la respuesta de Tiago Castro , he implementado un gráfico de líneas para mostrar la demostración.
google.load('visualization', '1', { packages: ['corechart', 'line'] }); google.setOnLoadCallback(drawBackgroundColor); function drawBackgroundColor() { var data = new google.visualization.DataTable(); data.addColumn('number', 'X'); data.addColumn('number', 'Compute Time'); data.addColumn('number', 'Compute Times'); console.log("--"); data.addRows([ [0, 0, 0], [10, 10, 15], [20, 20, 65] ]); console.log(data); var options = { height: 350, legend: { position: 'bottom' }, hAxis: { title: 'Nb Curves' }, vAxis: { title: 'Time (ms)' }, backgroundColor: '#f1f8e9' }; function resize() { var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, options); } window.onload = resize(); window.onresize = resize; }
<script src='https://www.google.com/jsapi'></script> <div id="chart_div">
fuente