我非常喜欢this graph及其功能,它非常适合我想要/需要的东西。我唯一需要改变的是我需要它来允许y轴上的序数数据,而我似乎无法使其工作(我是初学者)。
当我将y比例从线性更改为有序时:
yscale[k] = d3.scale.linear()
.domain(d3.extent(data, function(d) { return +d[k]; }))
.range([h, 0]));
到
yscale[k] = d3.scale.ordinal().rangePoints([h, 0]),
yscale[k].domain(data.map(function(d) { return d[k]; })))
刷涂仍会显示并自行工作,但不会过滤掉选定的行。没有线条出现,除非我将它移动到轴的顶部,然后全部或大部分都出现。当我用firebug介绍代码时,看起来它只是没有得到画笔区域中的线条而是所有(?)......我似乎无法弄明白。 :(
如果有人可以帮忙解决这个问题(尤其是我必须改变的所有地方以及如何改变),我很乐意让这个工作并了解我做错了什么: - \
答案 0 :(得分:5)
刷过序数轴会返回像素,而刷定数轴会返回域。
https://github.com/mbostock/d3/wiki/SVG-Controls#wiki-brush_x
比例通常定义为a 量化规模,在这种情况下,范围是在数据空间中 规模的领域;但是,它可以改为定义为序数 scale,其范围在距离比例范围的像素空间中 程度。
我的猜测是你需要向后工作并将像素转换为域值。我发现了这个问题,因为我正在尝试做同样的事情。如果我明白了,我会告诉你的。
编辑:这是一个很棒的例子,可以帮助您入门。
function brushmove() {
var s = d3.event.target.extent();
symbol.classed("selected", function(d) { return s[0] <= (d = x(d)) && d <= s[1]; });
}
他抓取选择范围(以像素为单位),然后选择所有系列元素并确定它们是否位于范围内。您可以根据该元素过滤元素,并返回数据键或您要添加到过滤器的内容。
答案 1 :(得分:1)
这里有一个带有刷子的序数刻度的例子:
http://bl.ocks.org/chrisbrich/4173587
基本思想是@gumballhead建议的,你负责将像素值投射回输入域。该示例中的相关代码段为:
brushed = function(){var selected = yScale.domain().filter(function(d){return (brush.extent()[0] <= yScale(d)) && (yScale(d) <= brush.extent()[1])});
d3.select(".selected").text(selected.join(","));}