比例尺是 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 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...