我有一个d3条形图,按日排序按日期列出数据。这很好用,但现在我需要每天显示两组数据,以分组条形图格式或只是并排显示。
我认为这需要一些重构,但在愚弄它并引用我在网上发现的一堆例子之后,图表使用时间刻度和线性刻度的事实在我的了解这一点。我希望有人可以帮我告诉我这个图表在图表中每天显示2个条形图。
我当前的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个条形 - 每个条形代表每个数据集的值。如何完成显示分组栏?如果数据集合并为一个会更好吗?
答案 0 :(得分:3)
首先,让我们考虑两组数据的两个独立图表。尺度是一样的。它看起来像这样:
行。这一切都很好,但我们如何从那里到堆积图表?
好吧,我们需要确保每个tick都包含两个数据。
然后,在绘制每个刻度时,它应该从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/
祝你好运!只要想想你需要什么,事情就会从那里落实到位!