D3中的比例尺

2021-07-31 21:08:20 字數 3708 閱讀 1029

比例尺是 d3 中很重要的乙個概念,上一章裡曾經提到過直接用數值的大小來代表畫素不是一種好方法,本章正是要解決此問題。

1

vardataset=[

250,

210,

170,

130,90]

; 繪圖時,直接使用 250 給矩形的寬度賦值,即矩形的寬度就是 250 個畫素。

此方式非常具有侷限性,如果數值過大或過小,例如: 1

2

vardataset_1=[

2.5,

2.1,

1.7,

1.3,

0.9];

vardataset_2=[

2500

,2100

,1700

,1300

,900];

對以上兩個陣列,絕不可能用 2.5 個畫素來代表矩形的寬度,那樣根本看不見;也不可能用 2500 個畫素來代表矩形的寬度,因為畫布沒有那麼長。

於是,我們需要一種計算關係,能夠:

將某一區域的值對映到另一區域,其大小關係不變。

這就是比例尺(scale)。

比例尺,很像數學中的函式。例如,對於乙個一元二次函式,有 x 和 y 兩個未知數,當 x 的值確定時,y 的值也就確定了。

在數學中,x 的範圍被稱為定義域,y 的範圍被稱為值域

d3 中的比例尺,也有定義域和值域,分別被稱為 domain 和 range。開發者需要指定 domain 和 range 的範圍,如此即可得到乙個計算關係。

d3 提供了多種比例尺,下面介紹最常用的兩種。

線性比例尺,能將乙個連續的區間,對映到另一區間。要解決柱形圖寬度的問題,就需要線性比例尺。

假設有以下陣列: 1

vardataset=[

1.2,

2.3,

0.9,

1.5,

3.3];

現有要求如下:

將 dataset 中最小的值,對映成 0;將最大的值,對映成 300。

**如下: 1

2

3

4

5

6

7

8

9

10

varmin=d3.

min(

dataset);

varmax=d3.

max(

dataset);

varlinear=d3

.scale

.linear()

.domain([

min,

max])

.range([

0,300]);

linear

(0.9);

//返回 0

linear

(2.3);

//返回 175

linear

(3.3);

//返回 300

其中,d3.scale.linear()返回乙個線性比例尺。domain() 和 range() 分別設定比例尺的定義域和值域。在這裡還用到了兩個函式,它們經常與比例尺一起出現:

這兩個函式能夠求陣列的最大值和最小值,是 d3 提供的。按照以上**,

比例尺的定義域 domain 為:[0.9, 3.3]

比例尺的值域 range 為:[0, 300]

因此,當輸入 0.9 時,返回 0;當輸入 3.3 時,返回 300。當輸入 2.3 時呢?返回 175,這是按照線性函式的規則計算的。

d3.scale.linear() 的返回值,是可以當做函式來使用的。因此,才有這樣的用法:linear(0.9)。

有時候,定義域和值域不一定是連續的。例如,有兩個陣列: 1

2

varindex=[

0,1,

2,3,

4];

varcolor=[

"red"

,"blue"

,"green"

,"yellow"

,"black"];

我們希望 0 對應顏色 red,1 對應 blue,依次類推。

但是,這些值都是離散的,線性比例尺不適合,需要用到序數比例尺。 1

2

3

4

5

6

7

varordinal=d3

.scale

.ordinal()

.domain

(index)

.range

(color);

ordinal(0

);//返回 red

ordinal(2

);//返回 green

ordinal(4

);//返回 black

用法與線性比例尺是類似的。

在上一章的基礎上,修改一下陣列,再定義乙個線性比例尺。 1

2

3

4

5

vardataset=[

2.5,

2.1,

1.7,

1.3,

0.9];

varlinear=d3

.scale

.linear()

.domain([

0,d3.

max(

dataset)]

) .range([

0,250]);

其後,按照上一章的方法新增矩形,在給矩形設定寬度的時候,應用比例尺。 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

varrectheight=25

;//每個矩形所佔的畫素高度(包括空白)

svg.

selectall

("rect")

.data

(dataset)

.enter()

.("rect"

)//x:表示矩形距離左側的距離

.attr

("x",20

)//y:表示矩形距離頂部的距離,下標index*每個rect高度

.attr

("y"

,function(d

,i))

.attr

("width"

,function(d

)).attr

("height"

,rectheight-2

) .attr

("fill"

,"steelblue");

如此一來,所有的數值,都按照同乙個線性比例尺的關係來計算寬度,因此數值之間的大小關係不變。

d3裡的比例尺

1 d3中的比例尺也有定義域和值域,分別是domain和range,開發者需要指定domain和range的範圍,如此即可以得到乙個計算關係 2 線性比例尺 能將乙個連續的區間對映到另一區間,要解決柱形圖寬度的問題,就需要線性比例尺 3 如 4var dataset 1.2,2.3,0.9,1.5,...

D3中常用的比例尺

d3中有個重要的概念就是比例尺。比例尺就是把一組輸入域對映到輸出域的函式。對映就是兩個資料集之間元素相互對應的關係。比如輸入是1,輸出是100,輸入是5,輸出是10000,那麼這其中的對映關係就是你所定義的比例尺。d3中有各種比例尺函式,有連續性的,有非連續性的,本文對於常用比例尺進行一一介紹。1....

d3的比例尺和座標軸

1.比例尺 比例尺的關鍵概念 定義域和值域,比例尺本質就是乙個函式。常用比例尺有 1.1 線性比例尺 d3.scale.linear 1.2 指數比例尺 d3.scale.pow exponent x x為指數 1.3 對數比例尺 d3.scale.log 1.4 量子比例尺 d3.scale.qu...