2010-11-18 5 views
42

Я пытаюсь перезагрузить данные для диаграммы Highcharts через JSON на основе нажатия кнопки в другом месте на странице. Первоначально я хотел бы отображать набор данных по умолчанию (расходы по категориям), но затем загружать новые данные на основе пользовательского ввода (например, расходы за месяц). Самый простой способ, с помощью которого я могу представить JSON с сервера, - передать запрос GET на страницу PHP, например $ .get ('/ dough/includes/live-chart.php? Mode = month', извлечение этого значения из атрибута идентификатора кнопки.Перезагрузите данные диаграммы через JSON с Highcharts

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

$(document).ready(function() { 
      //This is an example of how I would retrieve the value for the button 
      $(".clickMe").click(function() { 
       var clickID = $(this).attr("id"); 
      }); 
      var options = { 
       chart: { 
        renderTo: 'graph-container', 
        margin: [10, 175, 40, 40] 
       }, 
       title: { 
        text: 'Spending by Category' 
       }, 
       plotArea: { 
        shadow: null, 
        borderWidth: null, 
        backgroundColor: null 
       }, 
       tooltip: { 
        formatter: function() { 
         return '<b>'+ this.point.name +'</b>: $'+ this.y; 
        } 
       }, 
       credits: { 
        enabled: false 
       }, 
       plotOptions: { 
        pie: { 
         allowPointSelect: true, 
         cursor: 'pointer', 
         dataLabels: { 
          enabled: true, 
          formatter: function() { 
           if (this.y > 5) return '$' + this.y; 
          }, 
          color: 'white', 
          style: { 
           font: '13px Trebuchet MS, Verdana, sans-serif' 
          } 
         } 
        } 
       }, 
       legend: { 
        layout: 'vertical', 
        style: { 
         left: 'auto', 
         bottom: 'auto', 
         right: '50px', 
         top: '100px' 
        } 
       }, 
       series: [{ 
        type: 'pie', 
        name: 'Spending', 
        data: [] 
       }] 
      }; 
      $.get('/dough/includes/live-chart.php', function(data) { 
      var lines = data.split('\n'); 
      $.each(lines, function(lineNo, line) { 
       var items = line.split(','); 
       var data = {}; 
       $.each(items, function(itemNo, item) { 
        if (itemNo === 0) { 
         data.name = item; 
        } else { 
         data.y = parseFloat(item); 
        } 
       }); 
       options.series[0].data.push(data); 
      }); 
      // Create the chart 
      var chart = new Highcharts.Chart(options); 
     }); 
     }); 

Любая помощь будет принята с благодарностью

EDIT

Это обновленный Javascript благодаря Robodude. Джон, ты меня здесь на правильном пути - спасибо! Я теперь застрял в том, как заменить данные на диаграмме на запрос AJAX. Должен признать, что код, следующий за $ .get(), скорее всего, из примера кода, я не совсем понимаю, что происходит, когда он запускается - возможно, есть лучший способ отформатировать данные?

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

options.series[0].data.push(data); 

Я попытался options.series [0] .setData (данные); но ничего не происходит. С яркой стороны запрос AJAX работает безупречно на основе значения меню выбора и ошибок Javascript нет. Вот код, о котором идет речь, без диаграммы вариантов:

$.get('/dough/includes/live-chart.php?mode=cat', function(data) { 
      var lines = data.split('\n'); 
      $.each(lines, function(lineNo, line) { 
       var items = line.split(','); 
       var data = {}; 
       $.each(items, function(itemNo, item) { 
        if (itemNo === 0) { 
         data.name = item; 
        } else { 
         data.y = parseFloat(item); 
        } 
       }); 
       options.series[0].data.push(data); 
      }); 
      // Create the chart 
      var chart = new Highcharts.Chart(options); 
     }); 
     $("#loadChart").click(function() { 
      var loadChartData = $("#chartCat").val(); 
       $.get('/dough/includes/live-chart.php?mode=' + loadChartData, function(data) { 
       var lines = data.split('\n'); 
       $.each(lines, function(lineNo, line) { 
        var items = line.split(','); 
        var data = {}; 
        $.each(items, function(itemNo, item) { 
         if (itemNo === 0) { 
          data.name = item; 
         } else { 
          data.y = parseFloat(item); 
         } 
        }); 
        options.series[0].data.push(data); 
       }); 
       // Create the chart 
       var chart = new Highcharts.Chart(options); 
      }); 
     }); 
    }); 

EDIT 2 Это формат, что диаграмма вытягивает из - очень простой, категории имени и значения с \ п после каждого.

Coffee, 4.08 
Dining Out, 5.05 
Dining: ODU, 5.97 
Dining: Work, 38.41 
Entertainment, 4.14 
Gas, 79.65 
Groceries, 228.23 
Household, 11.21 
Misc, 12.20 
Snacks, 20.27 

ответ

19

EDIT: ответ ниже, вернее!

https://stackoverflow.com/a/8408466/387285

http://www.highcharts.com/ref/#series-object

HTML:

<SELECT id="list"> 
<OPTION VALUE="A">Data Set A 
<OPTION VALUE="B">Data Set B 
</SELECT> 
<button id="change">Refresh Table</button> 

<div id="container" style="height: 400px"></div> 

Javascript:

var options = { 
    chart: { 
     renderTo: 'container', 
     defaultSeriesType: 'spline' 
    }, 
    series: [] 
}; 

$("#change").click(function() { 
    if ($("#list").val() == "A") { 
     options.series = [{name: 'A', data: [1,2,3,2,1]}] 
     // $.get('/dough/includes/live-chart.php?mode=month' 
    } else { 
     options.series = [{name: 'B', data: [3,2,1,2,3]}] 
     // $.get('/dough/includes/live-chart.php?mode=newmode' 
    } 

    var chart = new Highcharts.Chart(options);  
}); 

Это очень простой пример, так как я не имею мои файлы здесь со мной, но основная идея заключается в том, что каждый раз, когда пользователь cts новые параметры для материала, который они хотят видеть, вы замените объект данных .series новой информацией с вашего сервера, а затем заново создадите диаграмму, используя новый Highcharts.Chart() ;.

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

EDIT:

Проверьте это, его от чего-то я работал на в прошлом:

$("table#tblGeneralInfo2 > tbody > tr").each(function (index) { 
    if (index != 0) { 
     var chartnumbervalue = parseInt($(this).find("td:last").text()); 
     var charttextvalue = $(this).find("td:first").text(); 
     chartoptions.series[0].data.push([charttextvalue, chartnumbervalue]); 
    } 
}); 

я имел таблицу с информацией в первом и последнем с.в., что мне нужно для добавления в круговую диаграмму. Я прокручиваю каждый из строк и нажимаю значения. Примечание. Я использую chartoptions.series [0] .data, так как круговые диаграммы имеют только 1 серию.

+0

Я взял код, который я написал и положил его на jsfiddle для вашего удобства: http://jsfiddle.net/EmMxH/ – Robodude

+0

Эй снова NightMICU! Мне жаль, что у меня мало времени, чтобы объяснить, что происходит, но проверьте это: http://jsfiddle.net/w4DKf/ Каков формат возвращаемых данных? Просто помните, что каждое значение для вашей круговой диаграммы является частью массива, который является частью массива данных высоких диаграмм, который является частью массива рядов! – Robodude

+0

Джон, я думаю, что, возможно, здесь речь идет о формате данных диаграммы. Это не JSON, и я предполагаю, что это должно быть? Если я изменил вывод из файла PHP в JSON, как бы включить его в Javascript? – NightMICU

4

Вам нужно очистить старый массив, прежде чем нажать новые данные Есть много способов сделать это, но я использовал этот один:.

options.series[0].data.length = 0; 

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

options.series[0].data.length = 0; 
$.each(lines, function(lineNo, line) { 
        var items = line.split(','); 
        var data = {}; 
        $.each(items, function(itemNo, item) { 
         if (itemNo === 0) { 
          data.name = item; 
         } else { 
          data.y = parseFloat(item); 
         } 
        }); 
        options.series[0].data.push(data); 
       }); 

Теперь, когда нажата кнопка, старые данные очищаются и отображаются только новые данные. Надеюсь, это поможет.

+0

Спустя 2 часа, пытаясь понять, почему мой разброс был уловлен при каждом вызове. Я наконец нашел это исправление. Вы сохранили остаток дня. Это сработало. Спасибо. – crashtestxxx

1

Если вы являются используя толчок, чтобы подтолкнуть данные к option.series динамически .. просто использовать

options.series = []; 

, чтобы очистить его.

options.series = []; 
$("#change").click(function(){ 
} 
2

Правильный ответ:

$.each(lines, function(lineNo, line) { 
        var items = line.split(','); 
        var data = {}; 
        $.each(items, function(itemNo, item) { 
         if (itemNo === 0) { 
          data.name = item; 
         } else { 
          data.y = parseFloat(item); 
         } 
        }); 
        options.series[0].data.push(data); 
        data = {}; 
       }); 

Вам нужно очистить массив 'данные'.

data = {}; 
102

Другие ответы не помогли мне. Я нашел ответ в своей документации:

http://api.highcharts.com/highcharts#Series

Используя этот метод (see JSFiddle example):

var chart = new Highcharts.Chart({ 
    chart: { 
     renderTo: 'container' 
    }, 

    series: [{ 
     data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]   
    }] 
}); 

// the button action 
$('#button').click(function() { 
    chart.series[0].setData([129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4, 29.9, 71.5, 106.4]); 
}); 
+1

Это решение даже с постели, потому что только обновленные значения будут изменены и не более. Пример здесь: http://jsfiddle.net/ebuTs/16/ –

+7

+1 Это правильный подход ... Выбранный ответ предполагает воссоздание объекта Chart каждый раз, когда происходит изменение, и очень неэффективно. –

+1

Для моих целей это вообще не сработало и на самом деле заставил клиента расстраиваться со мной. Данные, которые я пытаюсь отобразить, - это статистика вызовов для местной спасательной команды. Каждый месяц они запускают различное количество вызовов в разных категориях, поэтому каждый месяц они не всегда одинаковы (например, они могут не запускать одну автомобильную аварию в течение одного месяца, 10 - в следующем). Ваш ответ вызвал нечетное поведение, включая отсутствующие категории, и ошибка «a не определена» в коде HighCharts. Выбранный ответ может быть неэффективным в некотором роде, но он работает, и клиент счастлив. – NightMICU

1

Вы всегда можете загрузить JSon данные

здесь я определил диаграмму как пространство имен

$.getJSON('data.json', function(data){ 
       Chart.options.series[0].data = data[0].data; 
       Chart.options.series[1].data = data[1].data; 
       Chart.options.series[2].data = data[2].data; 

       var chart = new Highcharts.Chart(Chart.options); 

      }); 
4

Фактически возможно, вам лучше выбрать функцию update.
Вот документ функции updatehttp://api.highcharts.com/highcharts#Series.update

Вы можете просто ввести код, как показано ниже:

chart.series[0].update({data: [1,2,3,4,5]})

Эти код сольются вариант происхождения, а также обновлять измененные данные.

Смежные вопросы