在Protovis(JavaScript的信息可视化)处理多个数据对象
-
27-09-2019 - |
题
我非常与试图修剪和移交到Protovis一组阵列只从一组数据包含数字的受挫对象看起来像下面拟定三个单独的饼图(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();
解决方案
以下工作。我与数据担任你有它定义。这可能是更容易如果楔的值分别为自己在一个阵列工作。这就是说,它很有趣梳理出从对象中的数据。 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();
不隶属于 StackOverflow