2012-04-15 25 views
4

我的數據是這樣的......是否可以在動態域的有序範圍上使用rangeBand()?

var data = [{name:'a', value : 97}, 
      {name:'b', value : 24}, 
      {name:'c', value : 10}]; 

我有這樣創造了一個有序的規模......

var y = d3.scale.ordinal().rangeBands([0, 30 * data.length]); 

,我用它來創建這樣一個基本的圖...

chart.selectAll("rect") 
     .data(data) 
     .enter().append("svg:rect") 
     .attr("y", function(d,i){ return y(d.name);}) 
     .attr("width", function(d,i){ return x(d.value);}) 
     .attr("height", y.rangeBand()); 

按照D3文檔(here)你沒有指定域的順序量表,它會得到填充,當你試圖使用它。然而,在我的情況下,y(d.name)總是返回0,而y.rangeBand()會引發異常,即使當我查看域數組已被填充到scale對象中時。

所以,我解決這個通過預先定義我的域名的工作......

.domain(data.map(function (d){ return d.name;})) 

,但我希望能夠動態地添加到該域和現在如果我這樣做,這不是」 t擴展超出創建時設置的原始值。這甚至有可能嗎?

我對d3很新,所以我可能會在這裏丟失重要的東西。

回答

12

隨着rangeBandsrangePoints,你必須按順序訪問範圍定義域。該域會告訴序號級別您要顯示多少個波段或點。不過,你可以以後更改域(通過調用scale.domain(newDomain)),範圍將更新。通過將以前看不見的值傳遞給量表,你無法隱式地做到這一點。無論如何,定義具有序數標度的域通常是一個好主意,這樣你總能得到確定性的行爲。

+0

我正在那樣做,但我忽略了將使用舊範圍值的現有元素轉換爲新範圍值。 – 2012-04-17 18:00:21

+0

是否可以使用沿軸的rangeRoundBands和rangeBands設置最大數量的波段或點?例如,如果我動態更新沿軸的帶數,我希望能夠設置帶的數量,而不是用數據點數填充整個空間。因此,一週顯示7個樂隊,一個月顯示4個一年12個,而不是隻顯示沿軸的所有點? @mbostock – 2016-07-18 10:05:04

2

強制爲字符串時,域中的元素必須是唯一的,所以如果將對象數組傳遞給域,可能會有意外的結果。例如,如果每個對象的字符串表示形式看起來像「[object Object]」,則d3可能將所有對象視爲相同。我以前碰到的這個問題,我已經圍繞它的工作方式是像做

d3.scale.ordinal(d3.range(0,myData.length)).rangeBands([0,myRangeBound]) 

其中每個數據元素映射到唯一的數組索引。請記住,在設置比例之前,必須對數據進行必要的排序,並且只要數據發生變化就必須重置域。定義渲染方法或類似方法通常很好,可以在新數據進入時重置比例和重繪所有內容,並可以在任何時候顯式設置域。

相關問題