【发布时间】:2014-01-31 16:41:26
【问题描述】:
我正在尝试让刷牙工作类似于此示例,但使用分组条形图:http://bl.ocks.org/mbostock/1667367
我对刷牙的工作原理不是很了解(我找不到任何好的教程),所以我对出了什么问题有点茫然。我将尝试在下面包含相关的代码。该图表按天跟踪修复损坏的构建的时间,然后按投资组合分组。到目前为止,画笔已创建,用户可以移动和拖动它,但主图表中的条形被奇怪地重新绘制,x 轴根本没有更新。您可以提供的任何帮助将不胜感激。谢谢。
// x0 is the time scale on the X axis
var main_x0 = d3.scale.ordinal().rangeRoundBands([0, main_width-275], 0.2);
var mini_x0 = d3.scale.ordinal().rangeRoundBands([0, main_width-275], 0.2);
// x1 is the portfolio scale on the X axis
var main_x1 = d3.scale.ordinal();
var mini_x1 = d3.scale.ordinal();
// Define the X axis
var main_xAxis = d3.svg.axis()
.scale(main_x0)
.tickFormat(dateFormat)
.orient("bottom");
var mini_xAxis = d3.svg.axis()
.scale(mini_x0)
.tickFormat(dateFormat)
.orient("bottom");
绑定数据后...
// define the axis domains
main_x0.domain(data.result.map( function(d) { return d.date; } )
.sort(d3.ascending));
mini_x0.domain(data.result.map( function(d) { return d.date; } )
.sort(d3.ascending));
main_x1.domain(data.result.map( function(d) { return d.portfolio; } )
.sort(d3.ascending))
.rangeRoundBands([0, main_x0.rangeBand() ], 0);
mini_x1.domain(data.result.map( function(d) { return d.portfolio; } )
.sort(d3.ascending))
.rangeRoundBands([0, main_x0.rangeBand() ], 0);
// Create brush for mini graph
var brush = d3.svg.brush()
.x(mini_x0)
.on("brush", brushed);
添加轴等后
// Create the bars
var bar = main.selectAll(".bars")
.data(nested)
.enter().append("g")
.attr("class", function(d) { return d.key + "-group bar"; })
.attr("fill", function(d) { return color(d.key); } );
bar.selectAll("rect").append("rect")
.data(function(d) { return d.values; })
.enter().append("rect")
.attr("class", function(d) { return d.portfolio; })
.attr("transform", function(d) { return "translate(" + main_x0(d.date) + ",0)"; })
.attr("width", function(d) { return main_x1.rangeBand(); })
.attr("x", function(d) { return main_x1(d.portfolio); })
.attr("y", function(d) { return main_y(d.buildFixTime); })
.attr("height", function(d) { return main_height - main_y(d.buildFixTime); });
这里是画笔功能(尝试几个不同的选项)...
function brushed() {
main_x1.domain(brush.empty() ? mini_x1.domain() : brush.extent());
//main.select("rect")
//.attr("x", function(d) { return d.values; })
//.attr("width", function(d) { return d.values; });
bar.select("rect")
.attr("width", function(d) { return main_x1.rangeBand(); })
.attr("x", function(d) { return main_x1(d.portfolio); });
//.attr("y", function(d) { console.log(d); return main_y(d.buildFixTime); })
//.attr("height", function(d) { return main_height - main_y(d.buildFixTime); });
main.select(".x.axis").call(main_xAxis);
}
【问题讨论】:
-
看起来您在
rect元素中附加了rect元素——您不需要这样做。此外,您可能希望在您的brushed函数中使用bar.selectAll("rect")。看起来您正在更新main_x1的域,然后重绘main_xAxis,它使用了不同的比例。 -
好的,有道理,但是当我将域更改为 main_x0 时,我收到以下错误:Uncaught TypeError: Object 113 has no method 'getDay'
-
你能提供一个完整的例子来说明问题吗?
-
你能把它缩小到一个最小的例子吗?回购中有很多代码,其中大部分与此无关。
-
嗨 Lars,这是一个简化版:github.com/goodspeedj/builds/blob/master/js/test.js 再次感谢。
标签: javascript d3.js brush