Pregunta

Estoy muy frustrado por tratar de podar y entregar a Protovis un conjunto de matrices que contienen solamente los números de un conjunto de objetos de datos que se ve algo como a continuación para elaborar tres gráficos circulares separadas (pv.Wedge) para cada objeto. ..

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

A partir de la documentación que me dicen que hay poco bucle uno tiene que hacer en Protovis, sin embargo, me parece que no puede conseguir el myData manipulada / analiza correctamente, por lo que por desgracia he recurrido a un bucle explícito.

He probado muchos tipos diferentes de bucles, pero lo mejor es que he recibido una copia impresa de los números que aparecen en un espacio vacío donde me gustaría que aparezcan los gráficos circulares. Le agradecería si alguien me puede dar una pista sobre lo que debería hacer para lograrlo. Actualmente estoy atascado en -

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();
¿Fue útil?

Solución

A continuación se trabaja. He trabajado con los datos a medida que lo tenía definido. Podría ser más fácil de trabajar, si los valores de las cuñas eran ellos mismos en una matriz. Dicho esto, fue interesante desenredar los datos del objeto. def crea una variable local. Opté por usar que para valores totales y en lugar de normalizar ya que entonces hizo más fácil para añadir lables más adelante. Hay posiblemente una forma más elegante de hacer esto, pero usted debería ser capaz de ver una aproximación sin bucle.

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(); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top