Recharger graphique des données via JSON avec Highcharts
Je suis en train de recharger les données pour un Highcharts graphique via JSON basé sur un bouton, cliquez ailleurs dans la page. D'abord, je voudrais afficher un ensemble par défaut de données (les dépenses par catégorie), mais ensuite charger de nouvelles données de base sur la saisie de l'utilisateur (les dépenses par mois, par exemple). La meilleure façon que je peux penser à la sortie du JSON à partir du serveur est en passant d'une requête GET à la page PHP, par exemple $.get('/pâte/includes/live-graphique.le php?mode=mois", la récupération de cette valeur à partir du bouton d'attribut ID de la.
Voici ce que j'ai jusqu'à présent pour récupérer les données par défaut (les dépenses par catégorie). Besoin de trouver comment charger complètement différentes données dans le graphique, basée sur la saisie de l'utilisateur, sur demande:
$(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);
});
});
Toute aide serait grandement appréciée
MODIFIER
Voici la mise à jour du Javascript grâce à Robodude. Jean, vous m'avez sur la bonne voie ici - merci! Je suis maintenant coincé avec la façon de remplacer les données sur le graphique à partir de la requête AJAX. Je dois avouer que le code qui suit l' $.get() est le plus probable à partir de l'exemple de code, je ne suis pas entièrement comprendre ce qui se passe quand il est run - peut-être il ya une meilleure façon de mettre en forme les données?
J'ai été en mesure de réaliser des progrès en ce que le graphique se charge désormais de nouvelles données, mais il est ajouté au-dessus de ce qui existe déjà. Je soupçonne que le coupable est cette ligne:
options.series[0].data.push(data);
J'ai essayé les options.série[0].setData(données); mais rien ne se passe. Sur le côté positif, la requête AJAX fonctionne parfaitement basé sur la valeur de l'sélectionnez menu et il n'y a pas des erreurs Javascript. Voici le code en question, sans options du graphique:
$.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
C'est le format que la carte est tire de très simple, nom de la catégorie et de la valeur avec \n après chaque.
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
Vous devez vous connecter pour publier un commentaire.
EDIT: La réponse en bas est plus correct!
https://stackoverflow.com/a/8408466/387285
http://www.highcharts.com/ref/#series-object
HTML:
Javascript:
C'est un exemple très simple puisque je n'ai pas mes fichiers ici avec moi, mais l'idée de base est que chaque fois que l'utilisateur sélectionne de nouvelles options pour les choses qu'ils veulent voir, vous allez devoir remplacer la .la série de données de l'objet avec les nouvelles informations à partir de votre serveur, puis de les recréer le tableau en utilisant les nouvelles Highcharts.Tableau();.
Espérons que cette aide!
Jean
EDIT:
Check this out, c'est à partir de quelque chose que j'ai travaillé dans le passé:
J'avais un tableau avec les informations dans la première et la dernière tds que j'ai besoin d'ajouter à la graphique. Je boucle sur chacune des lignes et de la pousser dans les valeurs. Remarque: j'utilise chartoptions.série[0].des données depuis les camemberts seulement 1 de la série.
Les autres réponses ne fonctionne pas pour moi. J'ai trouvé la réponse dans leur documentation:
http://api.highcharts.com/highcharts#Series
À l'aide de cette méthode (voir JSFiddle exemple):
Vous devez effacer l'ancien tableau avant de pousser les nouvelles données. Il existe de nombreuses façons d'accomplir cela, mais j'ai utilisé celui-ci:
De sorte que votre code devrait ressembler à ceci:
Maintenant, quand le bouton est cliqué, les anciennes données sont purgées et uniquement les nouvelles données devrait s'afficher. Espérons que cela aide.
En fait peut-être que vous devriez choisir la fonction
update
est mieux.Voici le document de la fonction
update
http://api.highcharts.com/highcharts#Series.updateVous pouvez simplement taper le code comme ci-dessous:
chart.series[0].update({data: [1,2,3,4,5]})
Ces code de la fusion de l'origine de l'option, et de mettre à jour les données modifiées.
Bonne réponse est:
Vous devez rincer les 'données' tableau.
Si vous sont à l'aide de pousser pour pousser les données de l'option.série dynamiquement .. juste utiliser
pour la désactiver.
Vous pouvez toujours charger une des données json
ici, je le Graphique défini comme espace de noms
data = [150,300]; //data from ajax or any other way
chart.series[0].setData(data, true);
La
setData
appellera redessiner méthode.Référence: http://api.highcharts.com/highcharts/Series.setData