2014-11-25 86 views
0

我需要創建一個將返回有效半徑值的刻度,並且我正在嘗試處理負值。我總是希望以2px到40px的半徑繪製圓。但有兩種方法我想處理負面情況。有沒有辦法創建一個只考慮域值絕對值的規模?

有時我想要min值(即使是負值)映射到2px。想象一下表示收入的半徑,有時它是負值,有時甚至是正值。我acheiving這就像這樣:

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

其他時候,我想0永遠是最小和域值始終被視爲其絕對值。想象一下里希特的景觀價值或任何可以震撼的東西。

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

然而,每次我想要一個比例值,我必須把它的絕對值。

rScale(Math.abs(dataValue)); 

有沒有一種方法來創建,總會將域值的絕對值的規模有多大?有沒有一種方法可以擴展線性比例尺來做到這一點?

我不想只是將dataValues更改爲它們的絕對值,因爲我需要保持原始(負)值,因此我可以以不同方式設置陰性圓的樣式。

回答

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上使用比例運算符(域,範圍等)。

相關問題