2010-10-05 3 views
0

Я очень расстроен тем, что пытаюсь обрезать и передать Protovis набор массивов, содержащих только цифры из набора объектов данных, которые выглядят примерно так, как показано ниже, для создания трех отдельных круговые диаграммы (pv.Wedge) для каждого объекта ...Обработка нескольких объектов данных в Protovis (визуализация информации 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}]; 

Из документации я сказал, есть немного перекручивания нужно сделать в Protovis, но я не могу показаться, чтобы получить MyData манипулируют/разобранный правильно, так увы, я прибегал к явным циклам.

Я пробовал много разных типов петель, но лучшее, что я получил, это распечатка чисел под пустым пространством, где мне бы хотелось, чтобы круговые диаграммы отображались. Я был бы признателен, если бы кто-нибудь мог дать мне подсказку о том, что я должен делать, чтобы достичь этого. В настоящее время я застрял на -

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(); 

ответ

1

следующие работы. Я работал с данными, как вы это определили. С ними было бы легче работать, если бы значения клиньев были сами в массиве. Тем не менее, было интересно дразнить данные с объекта. def создает локальную переменную. Я решил использовать это для значений и общего, а не нормализовать, так как впоследствии упростил добавление таблиц позже. Там, возможно, более элегантный способ сделать это, но вы должны иметь возможность увидеть один подход без цикла.

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(); 
Смежные вопросы