Domanda

Sono estremamente frustrato con il tentativo di potare e consegnare ad Protovis una serie di array che contiene solo numeri da un insieme di dati oggetti che assomiglia a seguito di elaborare tre grafici a torta separati (pv.Wedge) per ogni oggetto. ..

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}];

Dalla documentazione mi hanno detto c'è poco loop si ha la necessità di fare in Protovis, io invece non riesco a ottenere il myData manipolato / analizzata correttamente, quindi purtroppo ho fatto ricorso al looping esplicito.

Ho provato diversi tipi di cicli, ma il migliore che ho ottenuto è una stampa dei numeri in uno spazio vuoto dove vorrei apparire i grafici a torta. Le sarei grato se qualcuno mi potrebbe dare un suggerimento su ciò che dovrei fare per raggiungere questo obiettivo. Al momento mi sono bloccato a -

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();
È stato utile?

Soluzione

le seguenti opere. Ho lavorato con i dati come se fosse definito. Potrebbe essere più facile lavorare con se i valori per i cunei stessi erano in un array. Detto questo, è stato interessante prendere in giro i dati dall'oggetto. DEF crea una variabile locale. Ho scelto di utilizzare che per valori e totale, piuttosto che normalizzare come si chiamava allora ha reso più facile per aggiungere etichette in seguito. C'è forse un modo più elegante di fare questo, ma si dovrebbe essere in grado di vedere un approccio senza loop.

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(); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top