有没有办法创建一个只考虑域值绝对值的比例?

时间:2014-11-25 00:14:49

标签: javascript d3.js

我需要创建一个会返回有效半径值的比例,并且我试图处理负值。我总是希望绘制半径为2px到40px的圆。但是我有两种方法可以处理否定的问题。

有时我希望最小值(即使它是负的)映射到2px。想象一个半径表示收入,有时它是负面的,有时它是正面的。我是这样做的:

var rScale = scale.linear.range([2, 40]).domain([minValue, maxValue]);

其他时候我希望0始终为最小值,域值始终被视为其绝对值。想象一下Richter的scape价值或任何振荡的东西。

var rScale = scale.linear.range([2, 40]).domain([0, maxAbsoluteValue]);

但是,每次我想要一个缩放值时,我都必须把它作为绝对值。

rScale(Math.abs(dataValue));

有没有办法创建一个始终考虑域值绝对值的比例?有没有办法扩展线性刻度来做到这一点?

我不想将dataValues更改为绝对值,因为我需要保持原始(负)值,以便我可以不同地设置负面圈。

1 个答案:

答案 0 :(得分:0)

似乎没有一种优雅的D3特定解决方案。

一种选择是继续做你正在做的事情,例如

.attr("r", function(d){return rScale(Math.abs(d))})

如果你只需要在一个地方做到这一点,并且你做了你想做的事,那就不那么糟了。

如果您想要更多可重复使用的东西,您可以随时打包缩放:

function absRScale(d){return rScale(Math.abs(d))});
// and later...
.attr("r", absRScale)

如果您在设置之后修改rScale(不是一个好主意,如果您可以提供帮助,除非您正在进行转换),那么absRScale将反映出来那。唯一的问题是您无法在absRScale上使用比例运算符(域,范围等)。