2015-04-21 27 views
24
var xScale = d3.scale.ordinal().domain([0, d3.max(data)]).rangeRoundBands([0, w], .1); 
var yScale = d3.scale.linear().domain([0, data.length]).range([h, 0]); 

我感到困惑時,在D3使用線性規模。D3差秤

下面就是我從API文檔發現,還是有點失落......如果有人能幫助,這將是大加讚賞。

序(X)

鑑於該輸入域中的值x,返回輸出範圍對應的值。

如果範圍是明確指定的(如範圍,但不包括rangeBands,rangeRoundBands或rangePoints),並且給定值x不在比例域中,則x隱式添加到域中;隨後的給定相同值x的調用的調用將從範圍中返回相同的值y。

d3.scale.linear()

構造具有默認域[0,1]和默認範圍[0,1]新的線性刻度。因此,默認線性標尺等同於數字的標識函數;例如線性(0.5)返回0.5。

+1

線性標尺將輸入值之間進行內插,而順序規模不會。 –

+0

@LarsKotthoff你能提供一些例子嗎? – Bruce

+0

在文檔「線性(0.5)」中實際上有一個例子。 –

回答

44

至於Ordinal Scales

序尺度有離散域,比如一組名稱或類別。

順序量表的值必須強制轉換爲字符串,並且域值的字符串化版本唯一地標識相應的範圍值。

所以,作爲一個例子,順序量表的域名可以包含姓名,就像這樣:

var ordinalScale = d3.scale.ordinal() 
     .domain(['Alice', 'Bob']) 
     .range([0, 100]); 

ordinalScale('Alice'); // 0 
ordinalScale('Bob'); // 100 

通知所有值如何都是字符串。它們不能被插值。 'Alice'和'Bob'之間是什麼?我不知道。 D3也沒有。現在

,作爲用於Quantitative Scales(例如線性刻度):

定量秤具有連續域,如實數集,或日期。

舉個例子,你可以構造以下規模:

var linearScale = d3.scale.linear() 
     .domain([0, 10]) 
     .range([0, 100]); 

linearScale(0); // 0 
linearScale(5); // 50 
linearScale(10); // 100 

通知D3是如何能夠插值5,即使我們沒有在域中明確指定。

查看this jsfiddle以查看上述代碼。

+2

Omg ...您應該編寫d3 API文檔,精彩,完全合理。謝謝堆積:) – Bruce

+0

如果您的域中有超過2個項目,即'['Alice','Bob','Carl']',那麼您可能需要使用'rangePoint'而不是'range'。 –

2

在D3.js尺度變換從域到範圍內的數。對於線性尺度,域將是一個連續變量,具有無限範圍的值,然後可以將其轉換爲連續範圍。對於有序量表,將會有一個離散的域,例如一年中的幾個月,其中可能被限定的可能值的範圍有限,但不是連續的。該API docs on Github大概可以解釋這一差別比我更好

0

OK,我們就可以開始使用都使用相同的數據看到差異(我使用D3 V4)學習它,想象一下我們下面的數據利用ordinallinear尺度:

const data = [1, 2, 3, 4, 5]; 

const scaleLinear = d3.scaleLinear() 
    .domain([0, Math.max(...data)]).range([1, 100]); 

const scaleOrdinal = d3.scaleOrdinal() 
    .domain(data).range(['one', 'two', 'three', 'four', 'five']); 

現在我們開始稱他們看到的結果:

scaleLinear(1); //20 
scaleOrdinal(1); //one 

scaleLinear(2); //40 
scaleOrdinal(2); //two 

scaleLinear(5); //100 
scaleOrdinal(5); //five 

看看這個功能,我們可以得到,因爲你在序一個我們的數據映射到我們的產品範圍看,而在線性的,我們拉長的結果範圍,所以在這些情況下,例如scaleLinear(1)將返回20 ...我們的域max爲100和100除以5等於20,所以scaleLinear(1)是和scaleLinear(2)是 .. 。

但正如你看到的,scaleOrdinal(1)是映射到該範圍內的陣列,所以它等於一個scaleOrdinal(2)它等於 ...

所以這就是你如何使用這些秤,scaleLinear是許多事情,包括當前頁面上規模有用,但scaleOrdinal在爲了獲得數據更加有用,那就是它的文檔中解釋說:

#d3.scaleLinear()<>

構造一個新的連續的尺度與單位域[0,1]時, 單元範圍[0,1],默認內插器和夾緊禁用。 對於連續定量數據,線性標尺是一個很好的默認選擇,因爲它們保留了比例差異。每個範圍值 y可以表示爲域值x的函數:y = mx + b。


d3.scaleOrdinal([範圍])<>

構造一個新的順序量表具有空域和指定 範圍。如果未指定範圍,則默認爲空數組;一個 序號總是返回undefined,直到定義一個非空範圍 。

另外,這是從在深度D3同時使用這兩種序和線性刻度一個很好的例子:

var myData = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
 

 
var linearScale = d3.scaleLinear() 
 
    .domain([0, 11]) 
 
    .range([0, 600]); 
 

 
var ordinalScale = d3.scaleOrdinal() 
 
    .domain(myData) 
 
    .range(['black', '#ccc', '#ccc']); 
 

 
d3.select('#wrapper') 
 
    .selectAll('text') 
 
    .data(myData) 
 
    .enter() 
 
    .append('text') 
 
    .attr('x', function(d, i) { 
 
    return linearScale(i); 
 
    }) 
 
    .text(function(d) { 
 
    return d; 
 
    }) 
 
    .style('fill', function(d) { 
 
    return ordinalScale(d); 
 
    });
body { 
 
    font-family: "Helvetica Neue", Helvetica, sans-serif; 
 
    font-size: 14px; 
 
    color: #333; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script> 
 

 
<svg width="800" height="60"> 
 
    \t <g id="wrapper" transform="translate(100, 40)"> 
 
    \t </g> 
 
</svg>