第六章 比例尺的使用

2021-09-25 10:46:14 字數 2673 閱讀 4868

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

var dataset = [ 250 , 210 , 170 , 130 , 90 ];
繪圖時,直接使用 250 給矩形的寬度賦值,即矩形的寬度就是 250 個畫素。

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

var dataset_1 = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];

var dataset_2 = [ 2500, 2100, 1700, 1300, 900 ];

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

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

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

這就是比例尺(scale)。

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

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

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

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

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

假設有以下陣列:

var dataset = [1.2, 2.3, 0.9, 1.5, 3.3];
現有要求如下:

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

**如下:

var min = d3.min(dataset);

var max = d3.max(dataset);

var linear = 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)。

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

var index = [0, 1, 2, 3, 4];

var color = ["red", "blue", "green", "yellow", "black"];

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

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

var ordinal = d3.scale.ordinal()

.domain(index)

.range(color);

ordinal(0); //返回 red

ordinal(2); //返回 green

ordinal(4); //返回 black

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

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

var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];

var linear = d3.scale.linear()

.domain([0, d3.max(dataset)])

.range([0, 250]);

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

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

svg.selectall("rect")

.data(dataset)

.enter()

.attr("x",20)

.attr("y",function(d,i))

.attr("width",function(d))

.attr("height",rectheight-2)

.attr("fill","steelblue");

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

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...

第六章總結

6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...