【发布时间】:2015-04-16 11:52:42
【问题描述】:
我有一个 D3 Js Sankey 图,其中包含大量数据。数据的最后总是公司。公司节点是一个简单的圆圈。但是在那个圆圈周围,我想要一个带有 2 个值的甜甜圈图。这些值在公司节点内作为 numsms 和 nummid。您还可以在下图中看到。
图表示例:
所以我想在公司圈子里放一个甜甜圈图。但我似乎无法让它工作,我只找到了甜甜圈图的示例作为自己的 svg。
我的圈子代码:
svg.selectAll(".node.circle")
.append("circle")
.attr("r", function(d) {
if(d.node.indexOf("company-") > -1) {
return company_circle_size(d);
} else {
return page_circle_size(d);
}
})
.attr("cy", function(d) { return d.dy/2;})
.attr("cx", function(d) {
var cx = sankey.nodeWidth() - 30;
if(d.node.indexOf("company-") > -1) {
cx = cx + 15;
}
return cx;
})
.style("fill", function (d) {
if(d.node.indexOf("company-") > -1) {
if(d.name.indexOf("No data") > -1) {
return "grey";
}
var color = '';
switch(d.status) {
case 'Approved':
color = 'green';
break;
case 'inactive ':
color = 'red';
break;
case 'initial':
color = 'yellow';
break;
case 'review':
color = 'blue';
break;
default:
color = 'grey';
break;
}
return color;
}
return "grey";
//return d.color = color(d.name.replace(/ .*/, ""));
})
.style("fill-opacity", ".9")
.style("shape-rendering", "auto")
.style("stroke", function (d) {
return d3.rgb(d.color).darker(2);
})
.append("title")
.text(function (d) {
if(d.node.indexOf("company-") > -1) {
if(d.cpId != null) {
return d.name + "\n cpId: " + d.cpId;
}
return d.name;
}
return d.name + "\n" + format(d.value);
});
在 for 循环中,我将类名“node circle”替换为“node company”。
$(selector).attr("class", "node company")
我尝试了一些东西,我认为代码需要放在这里。
svg.selectAll('.company').each(function(companyNode) {
var values = [[companyNode.numsms, companyNode.nummid]];
var total = companyNode.numsms + companyNode.nummid;
if(total > 0) {
// create donut chart
}
});
【问题讨论】:
-
请用您的数据示例更新您的问题。如果无法重新创建一个完整的示例,很难回答这个问题......
-
代码太大,包含对服务器的嵌套项。因此,如果不更改太多代码,我就无法制作 jsfdle。这个问题还有很多不必要的代码。如果您指的是 JSON 字符串中的数据,那么我有这个:jsfiddle.net/Mithek/f5e6L2su 我把它放在一个 jsfiddle 中,因为它是一个相当长的字符串。
标签: javascript svg d3.js sankey-diagram