Перерисовка / масштабирование диаграммы Google при изменении размера окна

83

Как перерисовать / масштабировать линейную диаграмму Google при изменении размера окна?

кодпарадокс
источник
35
это действительно должно быть встроенной функцией API визуализации!
Michiel Cornille

Ответы:

69

Чтобы перерисовывать только после завершения изменения размера окна и избегать множественных триггеров, я думаю, лучше создать событие:

//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);
});
Хемерсон Варела
источник
40

Исходный код Google просто делает это в конце:

var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);

Изменив его с помощью небольшого javascript, вы можете масштабировать его при изменении размера окна:

function resize () {
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    chart.draw(data, options);
}

window.onload = resize;
window.onresize = resize;
Тьяго Кастро
источник
25
Возможно, стоит упомянуть, что когда вы получаете «данные» через ajax, запуск XHTTPRequest на КАЖДОМ шаге изменения размера окна может быть немного напряженным на вашем сервере, я думаю, что было бы лучше каким-то образом кэшировать результаты запроса ajax и повторно используйте эти данные, но ваше решение работает для меня! +1
Michiel Cornille
1
у меня не работало, нужно было удалить старые результаты из div перед повторным рисованием: $ ('# chart_div'). empty ();
Mantas D
3
window.onload = resize();эквивалентноresize(); window.onload = undefined;
Густаво Родригес
Он работает так, как вы это описываете, когда увеличиваете окно, но если вы уменьшите окно, вам нужно сначала очистить div диаграммы, как указал Мантас Д. $ ('# chart_div'). пустой (); Это позволит браузеру сжать div перед перерисовкой диаграммы.
Винсент,
Мне нравится это решение. Мне не нравятся таймеры или рекурсивные функции на стороне клиента, зачем постоянно использовать мощность процессора?
Роберто
8

Поскольку window.resizeсобытие запускается несколько раз для каждого события изменения размера, я считаю, что лучшим решением является использование smartresize.js и использование smartdraw(). Это ограничивает количество перерисовок диаграмм на window.resize.

Используя предоставленный js, вы можете сделать это так просто:

// 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);
});
Фонсини
источник
опечатка "otions" -> "options"
Томаш Майерски
4

Это самый простой способ избавиться от этого, не вызывая излишней нагрузки на браузер:

    var chart1 = "done";

$(window).resize(function() {
if(chart1=="done"){
chart1 = "waiting";
setTimeout(function(){drawChart();chart1 = "done"},1000);
}
});

Все, что он делает, - это ждет 1 секунду перед перезагрузкой графика и не позволяет функции снова вызывать в течение этого периода ожидания. поскольку функции изменения размера окна вызываются несколько раз каждый раз, когда вы изменяете размер окна, это помогает заставить функцию работать только один раз при каждом изменении размера окна, а остальные вызовы останавливаются оператором if.

надеюсь, это поможет

Джейми Дикин
источник
Превосходен своей простотой.
MastaBaba
3

В Google Visualization API нет возможности сделать Google Charts адаптивными.

Но мы можем сделать диаграммы Google адаптивными при изменении размера окна . Чтобы сделать Google Chart отзывчивым, на GitHub доступна библиотека jQuery - jquery-smartresize под лицензией MIT License, которая имеет возможность изменять размер графиков при изменении размера окна.

В этом проекте на GitHub есть два файла сценария: -

jquery.debouncedresize.js: adds a special event that fires once after the window
has been resized.

&

jquery.throttledresize.js: adds a special event that fires at a reduced rate (no 
more double events from Chrome and Safari).

Вот два примера адаптивных диаграмм ...

  1. Адаптивная круговая диаграмма Google
  2. Адаптивная гистограмма Google

Мы можем изменить нижний отступ visualization_wrap, чтобы он соответствовал желаемому соотношению сторон диаграммы.

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%

Мы можем настроить ChartArea вариант Google Chart , чтобы гарантировать , что метки не получают отрезаны от изменения размера .

OO7
источник
2

Перерисуйте / измените масштаб линейной диаграммы Google при изменении размера окна:

$(document).ready(function () {
    $(window).resize(function(){
        drawChart();
    });
});
Срину Басава
источник
Это действительно неэффективно, так как вам просто нужно вызвать chart.draw (data, options); очередной раз. Это позволит получить всю информацию и выполнить повторяющуюся и ненужную работу.
Fonsini 09
как заставить перерисовать пример по щелчку мы заставляем вызывать функцию изменения размера.
MaXi32
1

Я лично предпочитаю следующий подход, если вы можете жить с использованием addEventListener, и не возражаете против отсутствия поддержки IE <9.

var windowResizeTimer;
window.addEventListener('resize', function(e){
    clearTimeout(windowResizeTimer);
    windowResizeTimer = setTimeout(function(){
        chart.draw(data, options);
    }, 750);
});

Обратите внимание , использование setTimeout()и clearTimeout()функции и дополнительные задержки в 750 миллисекунд, что делает это немного менее интенсивным , когда несколько событий изменения размера пожар в быстрой последовательности (что часто бывает для браузеров на рабочем столе , когда изменение размера с помощью мыши).

Bwyan
источник
0

Я несколько дней зацикливался на одном и том же и обнаружил, что добавление события работает лучше всего.

window.addEventListener("resize", drawChart);

Просто добавьте эту строку после объявления вашей функции, и она будет работать нормально.

Замените drawChart именем вашей функции.

Анш Шривастава
источник
-1

Используя ответ Тьяго Кастро , я реализовал линейную диаграмму, чтобы показать демонстрацию.

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">

b0y
источник