在D3.js饼图中指定country列仅列出某些列

时间:2014-07-20 11:34:08

标签: html csv d3.js visualization pie-chart

<!DOCTYPE html>
<meta charset="utf-8">
<style>

body {
  font: 10px sans-serif;
}

.arc path {
  stroke: #fff;
}

</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var color = d3.scale.ordinal()
    .range(['#'+(Math.random()*0xFFFFFF<<0).toString(16),'#'+(Math.random()*0xFFFFFF<<0).toString(16)]);

var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(0);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.deaths; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

d3.csv("Cancer_No_Of_Deaths_per_100000.csv", function(error, data) {

  data.forEach(function(d) {
    d.deaths = +d.deaths;
  });

  var g = svg.selectAll(".arc")
      .data(pie(data))
    .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return color(d.data.country + " " + d.data.gender); })
      .on("mouseover", function() {
                pie.transition()        
                .duration(200)      
                .style("opacity", .9);  
      })
      .on("mouseout", function(d) {       
                pie.transition()        
                .duration(500)      
                .style("opacity", 0);   
      });

  g.append("text")
      .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("dy", ".35em")
      .style("text-anchor", "middle")
      .style("font-size", "20px")
      .text(function(d) { return d.data.country + " " + d.data.gender; });

});

</script>

我希望能够在csv中指定国家/地区列,仅在饼图示例中列出一个国家/地区=&#34;阿富汗&#34;而在我所拥有的csv文件中,该国家的其余部分将被遗漏但不会被删除。我现在的代码显示了csv文件中列出的所有国家/地区,但我希望只从csv文件中检索一个国家/地区。

country year    gender  deaths
Afghanistan 2008    Female  97
Afghanistan 2008    Male    108
Albania 2008    Female  126
Albania 2008    Male    172

这是我的csv文件的一小部分,列如下。

1 个答案:

答案 0 :(得分:0)

您可以在d3.csv回调中的数据阵列上使用Array.prototype.filter。在过滤器回调中,您可以简单地测试国家/地区名称是否是您想要的名称。例如,要获取仅包含阿富汗行的数组,您可以执行以下操作:

d3.csv('Cancer_No_Of_Deaths_per_100000.csv', function(error, data) {

  var filteredData = data.filter(function(d) {
    return d.country === 'Afghanistan';
  });

  // ... create your viz, etc. ...

});

然后,您可以将原始数据集作为变量data访问,并将只有阿富汗数据的集合作为filteredData或您选择调用它的任何内容。


<强> --- --- EDIT

现在您的变量data将如下所示:

[
  { country: 'Afghanistan', year: '2008', gender: 'Female', deaths: '97' },
  { country: 'Afghanistan', year: '2008', gender: 'Male', deaths: '108' },
  { country: 'Albania', year: '2008', gender: 'Female', deaths: '126' },
  { country: 'Albania', year: '2008', gender: 'Male', deaths: '172' },
  // etc... many other countries...
]

您的变量filteredData将如下所示:

[
  { country: 'Afghanistan', year: '2008', gender: 'Female', deaths: '97' },
  { country: 'Afghanistan', year: '2008', gender: 'Male', deaths: '108' }
]

因此,您只需确保在pie()电话中使用过滤后的数据:

var g = svg.selectAll(".arc")
  .data(pie(filteredData))
.enter().append("g")
  .attr("class", "arc");