Перезагружать данные диаграммы через JSON с помощью Highcharts
Я пытаюсь перезагрузить данные для диаграммы Highcharts через JSON на основе нажатия кнопки в другом месте страницы. Первоначально я хотел бы отображать набор данных по умолчанию (расходы по категориям), но затем загружать новые данные на основе пользовательского ввода (например, расходы за месяц). Самый простой способ, с помощью которого я могу представить JSON с сервера, - передать запрос GET на страницу PHP, например $. Get ('/dough/includes/live-chart.php? Mode = month', извлекая это значение из атрибута ID кнопки.
Вот что я до сих пор извлекал по умолчанию данные (расходы по категориям). Необходимо найти, как загружать совершенно разные данные в круговую диаграмму на основе пользовательского ввода, по запросу:
$(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);
});
});
Любая помощь будет принята с благодарностью
ИЗМЕНИТЬ
Вот обновленный Javascript благодаря Robodude. Джон, ты меня здесь на правильном пути - спасибо! Я теперь застрял в том, как заменить данные на диаграмме на запрос AJAX. Должен признать, что код, следующий за $.get(), скорее всего, из примера кода, я не совсем понимаю, что происходит, когда он запускается - возможно, есть лучший способ отформатировать данные?
Я смог добиться некоторого прогресса в том, что теперь диаграмма загружает новые данные, но добавляется поверх того, что уже существует. Я подозреваю, что виновником является эта строка:
options.series[0].data.push(data);
Я попробовал options.series [0].setData(data); но ничего не происходит. С яркой стороны запрос 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);
});
});
});
РЕДАКТИРОВАТЬ 2
Это формат, из которого тянет диаграмма - очень простое, название категории и значение с \n после каждого.
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
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: ответ ниже правилен!
fooobar.com/questions/126366/...
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);
});
Это очень простой пример, так как у меня нет моих файлов со мной, но основная идея заключается в том, что каждый раз, когда пользователь выбирает новые параметры для материала, который они хотят видеть, вы замените его. с данными нового сервера, а затем воссоздайте диаграмму с помощью нового 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]);
}
});
У меня была таблица с информацией в первом и последнем tds, которые мне нужно было добавить в круговую диаграмму. Я прокручиваю каждый из строк и нажимаю значения. Примечание. Я использую chartoptions.series [0].data, поскольку круговые диаграммы имеют только 1 серию.
Ответ 2
Другие ответы не помогли мне. Я нашел ответ в своей документации:
http://api.highcharts.com/highcharts#Series
Используя этот метод (см. пример JSFiddle):
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] );
});
Ответ 3
Вам нужно очистить старый массив до того, как вы введете новые данные. Существует много способов сделать это, но я использовал это:
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);
});
Теперь, когда нажимается кнопка, старые данные очищаются и появляются только новые данные. Надеюсь, что это поможет.
Ответ 4
На самом деле, возможно, вам лучше выбрать функцию update
.
Здесь документ функции update
http://api.highcharts.com/highcharts#Series.update
Вы можете просто ввести код, как показано ниже:
chart.series[0].update({data: [1,2,3,4,5]})
Этот код объединит исходный параметр и обновит измененные данные.
Ответ 5
Правильный ответ:
$.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 = {};
Ответ 6
Если вы , используя push, чтобы динамически вводить данные в параметр .series.. просто используйте
options.series = [];
чтобы очистить его.
options.series = [];
$("#change").click(function(){
}
Ответ 7
Вы всегда можете загрузить данные 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);
});
Ответ 8
data = [150,300]; // data from ajax or any other way
chart.series[0].setData(data, true);
setData
вызовет метод перерисовывания.
Ссылка: http://api.highcharts.com/highcharts/Series.setData