0

以下のようなデータオブジェクトのセットからの数値のみを含む配列のセットを整理してProtovisに渡して、オブジェクトごとに3つの別々の円グラフ(pv.Wedge)を作成しようとすると非常にイライラします...

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

1 に答える 1

1

以下の作品。あなたが定義したように、私はデータを操作しました。ウェッジの値自体が配列にあると、操作が簡単になる可能性があります。とはいえ、オブジェクトからデータを引き出すのは興味深いものでした。def はローカル変数を作成します。後でラベルを追加しやすくするため、正規化するのではなく、値と合計に使用することにしました。これを行うためのより洗練された方法がある可能性がありますが、ループせずに 1 つのアプローチを見ることができるはずです。

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(); 
于 2010-10-05T21:22:46.523 に答える