将d3条形图转换为分组条形图

3
我有一个d3条形图,根据日期按天顺序列出数据。这很好用,但现在我需要以分组条形图格式或并排条形图的方式每天显示两组数据。
我认为这需要一些重构,但在研究了一堆在网上找到的示例之后,图表使用时间比例尺和线性比例尺使我对此的理解产生了困扰。我希望有人能帮我进入正确的方向,让这个图表在每天显示两个条形图。
我的当前X轴设置:
var xTimeScale = d3.time.scale().
domain([new Date(data[0].date), d3.time.day.offset(new Date(data[data.length - 1].date), 1)])
.range([0, width]);

var xScale = d3.scale.linear()
.domain([0, data.length])
.range([0, width]);

我的示例: http://jsfiddle.net/MmEjF/45/

所以,从两个不同的数据集中,我需要每天有2个条形图 - 每个条形图表示来自每个数据集的一个值。如何实现显示分组条形图?如果将数据集合并为一个,是否更好?

1个回答

3
首先,让我们考虑两组数据的两个单独的图表。比例尺相同。它看起来像这样: http://jsfiddle.net/MmEjF/50/ 好的。这很好,但是我们如何从那里得到一个堆叠图呢?
嗯,我们需要确保每个刻度都有两个数据。
然后,在绘制每个刻度时,应该将第一部分数据绘制为0,第二部分数据不应该从零开始绘制,而是应该根据第一部分数据的数量进行偏移。
考虑到这一点,其他部分就落在了位子上:y轴必须从0到两个数据的总和的最大值。
var data = [{"year":2013,"month":3,"day":5,"count1":18, "count2":3},
            {"year":2013,"month":3,"day":6,"count1":3, "count2":11},
            {"year":2013,"month":3,"day":7,"count1":10,"count2": 8}, 
            {"year":2013,"month":3,"day":8,"count1":18, "count2": 4}];

var maxValue = d3.max(data, function (d) {
  return d.count1 + d.count2;
});

var yScale = d3.scale.linear()
  .domain([0, maxValue])
  .range([0, height]);

现在,将每组条形图视为一组,并将其添加到该组中变得更加容易:
   var bars = svg.selectAll(".bar")
      .data(data).enter()
      .append("g")
      .attr("class","bar")
      .attr("transform", function(d){
        return "translate("+xTimeScale(d.date)+",0)"
      });

    var count1Bars = bars.append("rect")
      .attr("class", "count1")
      .attr("height", function(d){return yScale(d.count1)})
      .attr("y", function(d){return height - yScale(d.count1)})
      .attr("width", barWidth);

    var count2Bars = bars.append("rect")
      .attr("class", "count2")
      .attr("height", function(d){return yScale(d.count2)})
      .attr("y", function(d){return height - yScale(d.count1) -yScale(d.count2)})
      .attr("width", barWidth);

    var count1text = bars.append("text")
      .text(function(d){return d.count1})
      .attr("y", function(d){return height})
      .attr("x", barWidth / 2);

    var count2text = bars.append("text")
      .text(function(d){return d.count2})
      .attr("y", function(d){return height - yScale(d.count1)})
      .attr("x", barWidth / 2);

现在,这只是一个简单的例子,让你了解一下:http://jsfiddle.net/MmEjF/49/。祝你好运!只要想清楚需要什么,事情就会自然而然地进展!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接