刷新序数数据不起作用

时间:2012-11-02 21:03:45

标签: javascript d3.js graph ordinal

我非常喜欢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介绍代码时,看起来它只是没有得到画笔区域中的线条而是所有(?)......我似乎无法弄明白。 :(

如果有人可以帮忙解决这个问题(尤其是我必须改变的所有地方以及如何改变),我很乐意让这个工作并了解我做错了什么: - \

2 个答案:

答案 0 :(得分:5)

刷过序数轴会返回像素,而刷定数轴会返回域。

https://github.com/mbostock/d3/wiki/SVG-Controls#wiki-brush_x

  

比例通常定义为a   量化规模,在这种情况下,范围是在数据空间中   规模的领域;但是,它可以改为定义为序数   scale,其范围在距离比例范围的像素空间中   程度。

我的猜测是你需要向后工作并将像素转换为域值。我发现了这个问题,因为我正在尝试做同样的事情。如果我明白了,我会告诉你的。

编辑:这是一个很棒的例子,可以帮助您入门。

http://philau.willbowman.com/2012/digitalInnovation/DevelopmentReferences/LIBS/d3JS/examples/brush/brush-ordinal.html

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(","));}