我需要创建一个会返回有效半径值的比例,并且我试图处理负值。我总是希望绘制半径为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更改为绝对值,因为我需要保持原始(负)值,以便我可以不同地设置负面圈。
答案 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
上使用比例运算符(域,范围等)。