Pergunta

Estou extremamente frustrado em tentar podar e entregar a Protovis um conjunto de matrizes apenas contendo números de um conjunto de objetos de dados que se parecem abaixo para elaborar três gráficos de pizza separados (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 da documentação que me disseram que há pouco loop que é preciso fazer em Protovis, mas não consigo que o mydata manipulado/analisado corretamente, então, infelizmente, eu recorri a loop explícito.

Eu tentei muitos tipos diferentes de loops, mas o melhor que recebi é uma impressão fora dos números sob um espaço vazio, onde gostaria que as paradas de pizza aparecessem. Eu ficaria grato se alguém pudesse me dar uma dica sobre o que eu deveria estar fazendo para conseguir isso. Atualmente estou preso em -

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

Solução

Os seguintes trabalhos. Eu trabalhei com os dados como você o definiu. Pode ser mais fácil trabalhar se os valores para as cunhas estivessem em uma matriz. Dito isto, foi interessante provocar os dados do objeto. def cria uma variável local. Eu escolhi usá -lo para valores e total, em vez de normalizar, pois facilitou a adição de Lables posteriormente. Existe possivelmente uma maneira mais elegante de fazer isso, mas você deve ver uma abordagem sem 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(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top