【问题标题】:Using d3.nest to create a pie chart使用 d3.nest 创建饼图
【发布时间】:2020-02-19 11:16:12
【问题描述】:

我有各种各样的数据,我用它来创建一个圆环图。我想使用数据细分制作饼图,我使用 d3.nest 获得了该数据以细分我拥有的数据(它目前分为 3 类:nest 将其分为 129 个)。基本上,我有基于获得奖牌的奥运会数据,我想将有关互动的数据细分为他们在哪些运动中获得。

我只是不确定如何使用嵌套数据来创建饼图,尤其是在键是可变的情况下。我将包括我的圆环图实现。

  var pie = d3.pie();

  // color based on medal awarded
  // order: gold, silver, bronze
  var color = d3.scaleOrdinal()
    .range(['#e5ce0c', '#e5e4e0', '#a4610a']);

  var arcs = d3.select(svg).selectAll("g.arc")
    .data(pie(data))
    .enter()
    .append("g")
    .attr("class", "arc")
    .attr("transform", "translate(" + (w/2) + "," + ((h-25)/2) + ")");

  arcs.append("path")
  .attr("fill", function(d, i) {
    return color(i);
  })
  .attr("d", arc)
  .attr("stroke", "white")
  .style("stroke-width", "0.5px")
  .on('mouseover', function(d) {
    d3.select(this).attr('opacity', .7);

  })
  .on('mouseleave', function(d) {
    d3.select(this).attr('opacity', 1);
  });

  // title
  d3.select(svg).append('text')
    .attr('x', function(d) {
      return ((w/2) - 85);
    })
    .attr('y', '20')
    .text(function(d) {
      return ('Medal breakdown for ' + country);
    })
    .attr('font-size', '16px');

  arcs.append("text")
    .attr("transform", function(d) {
      return "translate(" + arc.centroid(d) + ")";
    })
    .attr("text-anchor", "middle")
    .text(function(d) {
      return d.value;
    });

【问题讨论】:

  • 你能告诉你正在使用的数据集的结构吗?
  • 它基本上只是一个运动列表 -> 价值,也就是该类型的奖牌数量
  • 我添加了一个格式来了解您的确切格式?如果不能,您也可以在您的问题中发布格式。因为它很难像这样理解以及为什么需要使用 d3.nest。

标签: javascript d3.js nested pie-chart


【解决方案1】:

您能否确认这是您拥有的数据格式吗?

请找到下面的代码,如果您有任何疑问,请告诉我。

var w = 400;
var h = 400;
var r = h/2;
var color = d3.scale.category20c();

var data = [
{name:"football", medal:1},
{name:"hockey", medal:2},
{name:"cricket", medal:3},
{name:"tennis", medal:4},
{name:"table tennis", medal:5},
];


var vis = d3.select('#chart').append("svg:svg").data([data]).attr("width", w).attr("height", h).append("svg:g").attr("transform", "translate(" + r + "," + r + ")");
var pie = d3.layout.pie().value(function(d){return d.medal;});

// declare an arc generator function
var arc = d3.svg.arc().outerRadius(r);

// select paths, use arc generator to draw
var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");
arcs.append("svg:path")
    .attr("fill", function(d, i){
        return color(i);
    })
    .attr("d", function (d) {
        // log the result of the arc generator to show how cool it is :)
        return arc(d);
    });

// add the text
arcs.append("svg:text").attr("transform", function(d){
			d.innerRadius = 0;
			d.outerRadius = r;
    return "translate(" + arc.centroid(d) + ")";}).attr("text-anchor", "middle").text( function(d, i) {
    return data[i].name;}
		);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.15/d3.min.js"></script>
<div id="chart"></div>

【讨论】:

  • 是的,基本上就是这个样子!我将它作为参数传递给函数,但我无法弄清楚如何实际使用它。
  • 我已经编辑了我的答案,如果有任何问题请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多