Панель инструментов Google с фильтрами из сгруппированных данных - как составить диаграмму сгруппированных данных

Я хочу создать панель инструментов API диаграмм Google с фильтрацией, но я хотел бы отображать данные на основе сгруппированных данных. Например, я могу создать таблицу данных, например:

salesman  cust_age  cust_sex  quantity
Joe       21        Male      3
Joe       30        Female    10
Suzie     40        Female    2
Dave      15        Female    5
Dave      30        Male      10

Я могу соответствующим образом создать информационную панель, которая создает два элемента управления (для cust_age и cust_sex) и любое количество выходных графиков и таблиц, все из которых извлекаются из внешнего источника данных — это довольно стандартный материал, см. http://code.google.com/apis/chart/interactive/docs/gallery/controls.html

Проблема, с которой я сталкиваюсь, заключается в том, как показать все диаграммы по сгруппированным значениям. Используя в качестве примера круговую диаграмму, без каких-либо фильтров есть 5 кусочков пирога (Джо, Джо, Сьюзи, Дэйв, Дэйв) - я хотел бы видеть только три (Джо, Сьюзи Дэйв). Конечно, при применении элемента управления все должно обновляться.

Другими словами, фильтры должны воздействовать на исходную таблицу данных, а диаграммы должны основываться на сгруппированной таблице данных.

Я предполагаю, что мы могли бы использовать функцию группировки: http://code.google.com/apis/ajax/playground/?type=visualization#group однако я не могу связать фильтры с более крупной таблицей данных, обновить сгруппированную таблицу, а затем нарисовать диаграммы на основе сгруппированной таблицы.

Есть предположения?


person user804651    schedule 18.06.2011    source источник
comment
При удаче? Мне действительно нужно сделать что-то очень похожее на это...   -  person André Morujão    schedule 16.09.2011


Ответы (4)


Я нашел обходной путь, вы должны использовать chartWrapper без панели инструментов, поэтому вы можете передать dataTable в качестве параметра:

var $pieChart  = new google.visualization.ChartWrapper({
  'chartType': 'PieChart',
  'containerId': 'pie_chart',
  'options': {
    'width': 300,
    'height': 300,
  },
  //group the data for the pie chart
  'dataTable' : google.visualization.data.group($dataTable, [0],
  [{'column': 3, 'aggregation': google.visualization.data.sum, 'type': 'number'}])
});  
 $pieChart.draw();
 $tableWrapper =  new google.visualization.ChartWrapper({
  'chartType': 'Table',
  'containerId': 'table_data'
});
var $genderPicker = new google.visualization.ControlWrapper({
  'controlType': 'CategoryFilter',
  'containerId': 'gender_filter',
  'options': {
    'filterColumnIndex': '2',
    'useFormattedValue' : true,
    'ui': {
      'allowTyping': false,
      'allowMultiple': false,
      'labelStacking': 'vertical'
    }
  }      
});
new google.visualization.Dashboard(document.getElementById('table_dashboard')).
   bind([$genderPicker], [ $tableWrapper]).
   draw($dataTable);

Затем вы должны добавить обратный вызов к своим элементам управления, чтобы всякий раз, когда элемент управления изменяется, диаграммы за пределами панели мониторинга обновлялись, как при ручной привязке, давайте предположим, что элементом управления для cust_sex является $genderPicker, а объект таблицы ChartWrapper — $tableWrapper:

google.visualization.events.addListener($genderPicker, 'statechange',
function(event) {
  // group the data of the filtered table and set the result in the pie chart.
  $pieChart.setDataTable( google.visualization.data.group(
    // get the filtered results
    $tableWrapper.getDataTable(),
    [0],
    [{'column': 3, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
  ));
  // redraw the pie chart to reflect changes
  $pieChart.draw();
});

Результат: всякий раз, когда вы выбираете мужчину, женщину или и то, и другое, круговая диаграмма будет отражать отфильтрованные результаты, сгруппированные по имени. Надеюсь, это поможет кому-то и извините за мой ломаный английский.

person javiertoledos    schedule 02.11.2011
comment
выглядит хорошо, но в моем коде вообще нет доступной переменной google.visualization.events.addListener(orgFilter, 'statechange', function(e) { alert(e); }); дает null. также недоступны переменные, определенные до этого оператора. Любые идеи? - person iRaS; 04.12.2012

другой способ сделать это - использовать событие «готово» объекта панели мониторинга, а затем создать там диаграмму или таблицу на основе группировки, выполненной для основной таблицы панели мониторинга.

eg:

//create datatable, filter elements and chart elements for the the dashboard then:

dash=new google.visualization.Dashboard(document.getElementById(elId));
google.visualization.events.addListener(dash, 'ready', function() {
        //redraw the barchart with grouped data
        //console.log("redraw grouped");
        var dt=mainTable.getDataTable();
        var grouped_dt = google.visualization.data.group(
                          dt, [0],
                          [{'column': 7, 'aggregation': google.visualization.data.sum, 'type': 'number'}]);

        var mainChart = new google.visualization.ChartWrapper({
              'chartType': 'ColumnChart',
              'containerId': 'barChart',
              'options': {
                'height':500,
                'chartArea':{'left':200}
              },
              //view columns from the grouped datatable
              'view': {'columns': [0, 1]},
              'dataTable':grouped_dt
            });
        mainChart2.draw();
    });

dash.bind(
        [lots,of,filter,elements], 
        [lots,of,chart,elements]
    );
dash.draw(data)
person nathfy    schedule 11.10.2012
comment
Этот способ работал чище и проще, чем прослушивание изменений состояния элементов управления, потому что я столкнулся с некоторыми условиями гонки с таблицей, к которой применялись фильтры, прежде чем пытаться обновить диаграммы. Прослушивание готовности на приборной панели устраняет это состояние гонки и работает как шарм. Спасибо - person JCricket; 25.09.2014
comment
Для тех, кто ищет дополнительные примеры, я нашел соответствующее решение с подробностями, которые помогли прояснить использование здесь: stackoverflow.com/a/23836866/4088892< /а> - person timctran; 16.08.2018

После долгих исследований и разработок я нашел решение этой проблемы. Для исправления я использовал два прослушивателя событий, один из которых является событием ready, а другой — событием statechange, например:

google.visualization.events.addListener(subdivPicker, 'ready',
function(event) {
// group the data of the filtered table and set the result in the pie chart.
columnChart1.setDataTable( google.visualization.data.group(
// get the filtered results
 table.getDataTable(),
 [0],
[{'column': 2, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
));    
// redraw the pie chart to reflect changes
columnChart1.draw();
});

google.visualization.events.addListener(subdivPicker, 'statechange',
 function(event) {
 // group the data of the filtered table and set the result in the pie chart.
 columnChart1.setDataTable( google.visualization.data.group(
 // get the filtered results
 table.getDataTable(),
 [0],
 [{'column': 2, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
 ));
 // redraw the pie chart to reflect changes
 columnChart1.draw();
 });

Найдите мой первоначальный (проблемный) образец здесь и исправленный (решенный) пример здесь

person mpsbhat    schedule 27.04.2013

Прочитайте эту тему: Как не отображать таблицу данных (прочитайте хотя бы первые два сообщения — остальные действительно важны, только если вы имеете дело с большими наборами данных).

По сути, вы должны использовать промежуточную диаграмму (таблицы — хороший выбор, потому что они относительно быстро пишутся и визуализируются и требуют меньше памяти, чем большинство диаграмм), которая полностью скрыта от пользователей. Вы привязываете средство выбора категории к этой диаграмме на панели инструментов. Затем вы настраиваете обработчик события «statechange» средства выбора, который принимает данные, группирует их в новую таблицу данных и рисует круговую диаграмму на основе сгруппированных данных.

person Pradeep Shankar    schedule 22.09.2012
comment
Я нашел связанный ответ SO, который иллюстрирует скрытую промежуточную диаграмму, упомянутую в этом ответе. См. stackoverflow.com/a/23836866/4088892. - person timctran; 16.08.2018