Question

Je suis extrêmement frustré d'essayer d'élaguer et de la main vers Protovis un ensemble de tableaux contenant uniquement des nombres à partir d'un ensemble de données des objets qui ressemble à quelque chose comme ci-dessous pour élaborer trois diagrammes circulaires séparés (pv.Wedge) pour chaque objet. ..

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 boucle dont on a besoin pour faire Protovis, mais je ne peux pas sembler obtenir le myData manipulé / analysé correctement, donc hélas j'ai eu recours à looping explicite.

J'ai essayé beaucoup de différents types de boucles, mais le meilleur que j'ai obtenu est une version imprimée des numéros dans un espace vide où je voudrais que les camemberts apparaissent. Je vous serais reconnaissant si quelqu'un pouvait me donner une idée de 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();
Était-ce utile?

La solution

Ce qui suit fonctionne. J'ai travaillé avec les données que vous l'aviez défini. Il pourrait être plus facile de travailler avec si les valeurs des coins étaient eux-mêmes dans un tableau. Cela dit, il taquinait intéressant les données de l'objet. def crée une variable locale. J'ai choisi d'utiliser pour les valeurs et le total plutôt que Normaliser comme alors il est plus facile d'ajouter lables plus tard. Il y a peut-être une façon plus élégante de le faire, mais vous devriez être en mesure de voir une approche sans boucle.

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(); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top