简体   繁体   English

D3.js 数据结构,用于分割框架圆环图

[英]D3.js data structure for split frame donut charts

I am trying to create a series of 10 individual donut charts.我正在尝试创建一系列 10 个单独的甜甜圈图。 Simplified to two below:简化为以下两个:

 var margins = {top:20, bottom:300, left:30, right:150}; var height = 600; var width = 900; var totalWidth = width+margins.left+margins.right; var totalHeight = height+margins.top+margins.bottom; var data = [ {'name':'USA', 'split':[{'security':'equity','value':93.95},{'security':'fi','value':68.8}]}, {'name':'China', 'split':[{'security':'equity','value':40},{'security':'fi','value':60}]}, ]; var colorScale = d3.scaleOrdinal(["#4f81b9","#b8cce4","#4f81b9","#95b3d7","#b8cce4","#e7eef8"]); var svg = d3.select("body").selectAll(null).data(data).enter().append('svg').attr('width', totalWidth).attr('height', 200).style("display", "block"); var radius = 65; var arc = d3.arc().outerRadius(radius*1.06).innerRadius(radius*.8); var pie = d3.pie().sort(null).value(function(d) { console.log([d.split]) return [d.split]; }); var arcG = svg.selectAll(".arc").data(pie(data)).enter().append("g").attr("transform", "translate(" + (160) + "," + (100) + ")").attr("class", "arc"); arcG.append("path").attr("d", arc).attr("fill", function(d) { return colorScale(d.data.security); });
 <script src="https://d3js.org/d3.v5.min.js"></script>

Each donut is supposed to depict the ratio of two categories, as seen in the split array:每个甜甜圈都应该描述两个类别的比率,如split数组所示:

var data = [
  {'name':'USA', 'split':[{'security':'equity','value':93.95},{'security':'fi','value':68.8}]},
  {'name':'China', 'split':[{'security':'equity','value':40},{'security':'fi','value':60}]},
];

No errors were thrown at me, but clearly the data structure and slice mechanism is flawed -- nothing is appended.没有向我抛出任何错误,但显然数据结构和切片机制存在缺陷——没有附加任何内容。

Question问题

What is a viable reconfiguration to the data structure and/or donut slice that allows me to access split iteratively?什么是允许我迭代访问split的数据结构和/或甜甜圈切片的可行重新配置?

The problem is that you're trying to use the pie generator with the outer array, and that won't work (look at the NaN for the value):问题是您正在尝试将饼图生成器与外部数组一起使用,但这不起作用(查看NaN的值):

 var data = [{ 'name': 'USA', 'split': [{ 'security': 'equity', 'value': 93.95 }, { 'security': 'fi', 'value': 68.8 }] }, { 'name': 'China', 'split': [{ 'security': 'equity', 'value': 40 }, { 'security': 'fi', 'value': 60 }] }, ]; var pie = d3.pie().sort(null).value(function(d) { return d.value; }); console.log(pie(data));
 <script src="https://d3js.org/d3.v5.min.js"></script>

Instead of that, use the pie generator with each inner split array, creating an "enter" selection for the paths inside the groups:取而代之的是,将饼图生成器与每个内部split数组一起使用,为组内的路径创建一个“输入”选择:

 var margins = { top: 20, bottom: 300, left: 30, right: 150 }; var height = 600; var width = 900; var totalWidth = width + margins.left + margins.right; var totalHeight = height + margins.top + margins.bottom; var data = [{ 'name': 'USA', 'split': [{ 'security': 'equity', 'value': 93.95 }, { 'security': 'fi', 'value': 68.8 }] }, { 'name': 'China', 'split': [{ 'security': 'equity', 'value': 40 }, { 'security': 'fi', 'value': 60 }] }, ]; var colorScale = d3.scaleOrdinal(["#4f81b9", "#b8cce4", "#4f81b9", "#95b3d7", "#b8cce4", "#e7eef8"]); var svg = d3.select("body").selectAll(null).data(data).enter().append('svg').attr('width', totalWidth).attr('height', 200).style("display", "block"); var radius = 65; var arc = d3.arc().outerRadius(radius * 1.06).innerRadius(radius * 0.8); var pie = d3.pie().sort(null).value(function(d) { return d.value; }); var arcG = svg.selectAll(".arc").data(data).enter().append("g").attr("transform", "translate(" + (160) + "," + (100) + ")").attr("class", "arc"); arcG.selectAll(null).data(function(d) { return pie(d.split) }).enter().append("path").attr("d", arc).attr("fill", function(d) { return colorScale(d.data.security); });
 <script src="https://d3js.org/d3.v5.min.js"></script>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM