2010-10-05 12 views
0

Je suis extrêmement frustré d'essayer d'élaguer et de remettre à Protovis un ensemble de matrices contenant uniquement des nombres d'un ensemble d'objets de données qui ressemble à quelque chose comme ci-dessous pour établir trois camemberts (pv.Wedge) pour chaque objet ...Gestion de plusieurs objets de données dans Protovis (visualisation d'informations javascript)

myData = [{dept:"Accounting",sal:90000,equ:10000,trvl:267,extra:5000}, 
       {dept:"Sales",sal:20000,equ:10000,trvl:3049,extra:7000}, 
       {dept:"Consulting",sal:90000,equ:58000,trvl:983,extra:17000}]; 

de la documentation on me dit qu'il ya peu de looping il faut faire Protovis, mais je ne peux pas sembler obtenir le myData manipulé/analysables correctement, hélas j'ai recouru à la boucle explicite. J'ai essayé plusieurs types de boucles, mais le meilleur que j'ai obtenu est une impression des nombres sous un espace vide où je voudrais que les camemberts apparaissent. Je serais reconnaissant si quelqu'un pourrait me donner un indice quant à ce que je devrais faire pour y parvenir. À l'heure actuelle, je suis coincé à -

function getData(dept) { 
    var getvals = new Array(); 
    for(idx in dept) { 
     for(i in idx) { 
      if(idx[i]=="^[0-9]+$") { 
      getme.push(idx[i]); 
     } 
    }  
} 
    return getvals; 

}

// myData = myData.map(function(d) { 
// var valonly = new Array(); 
// for(key in d) { 
//  if(isNaN(d[key])==false) { 
//   valonly.push(d[key]); 
//  } 
// } 
// return valonly; 
// }); 


var vis = new pv.Panel() 
    .width(w) 
    .height(h) 
    .data(getData(myData)) 
vis.add(pv.Wedge) 
    //.data(pv.normalize(getData(myData))) 
    .left(100) 
    .bottom(100) 
    .outerRadius(r) 
    .angle(function(d) d * 2 * Math.PI) 
vis.add(pv.Label) 
    .bottom(0) 
    .left(100) 
    .textAlign("center") 
    //.text(data.dept + " - " + "total: " + hrsum); 


vis.render(); 

Répondre

1

Les travaux suivants. J'ai travaillé avec les données telles que vous les aviez définies. Il pourrait être plus facile de travailler avec si les valeurs pour les coins étaient eux-mêmes dans un tableau. Cela dit, il était intéressant de taquiner les données de l'objet. def crée une variable locale. J'ai choisi d'utiliser cela pour les valeurs et le total plutôt que de normaliser, car cela rendait plus facile l'ajout de listes plus tard. Il y a peut-être une façon plus élégante de faire cela, mais vous devriez être capable de voir une approche sans bouclage.

var myData = [{dept:"Accounting",sal:90000,equ:10000,trvl:267,extra:5000}, 
    {dept:"Sales",sal:20000,equ:10000,trvl:3049,extra:7000}, 
    {dept:"Consulting",sal:90000,equ:58000,trvl:983,extra:17000}]; 

var vis = new pv.Panel() 
    .width(200) 
    .height(200) 
    .data(myData); 

vis.add(pv.Wedge) 
    .def("values", function(d) pv.entries(d).filter(function(e) !isNaN(e.value))) 
    .def("total", function(d) pv.sum(this.values(), function(e) e.value)) 
    .data(function(d) this.values()) 
    .left(100) 
    .bottom(100) 
    .outerRadius(90) 
    .angle(function(d) (d.value/this.total()) * 2 * Math.PI) 
.anchor("center").add(pv.Label) 
    .text(function(d) d.key); 

vis.add(pv.Label) 
    .bottom(0) 
    .left(50) 
    .textAlign("center") 
    .text(function(d) d.dept); 

vis.render();