> [Wiki](Home) ? [[API--中文手冊]] ? [[比例尺]] ? **時間比例尺**
* 本文檔是D3官方文檔中文翻譯,并保持與[最新版](https://github.com/mbostock/d3/wiki/API-Reference)同步。
* 如發現翻譯不當或有其他問題可以通過以下方式聯系譯者:
* 郵箱:zhang_tianxu@sina.com
* QQ群:[D3數據可視化](http://jq.qq.com/?_wv=1027&k=ZGcqYF)205076374,[大數據可視化](http://jq.qq.com/?_wv=1027&k=S8wGMe)436442115
D3的Time scale是d3.scale.linear比例尺的擴展,使用Javascript的Date對象作為其輸入域(domain)。因此,不同于普通的線性比例尺(linear scale),domain的值會被強制轉為時間類型而非數字類型;同樣的,invert函數返回的是一個時間類型。最方便的是,time scale同樣提供了基于time intervals的合適的打點器,解除了為任何基于時間的域生成軸的痛苦。
d3.time.scale返回的是一個比例尺對象,同時也是一個函數。你可以像任何函數一樣引用它,同時它有額外的方法可以改變它的行為。如D3的其它類一樣,scale對象也可以鏈式調用方法,setter方法返回scale對象本身,可以用一個簡潔的聲明中引用多個setters。
# d3.time.scale()
使用默認的域和范圍來構建一個新的時間比例尺;默認以本地時間配置ticks和tick format。
# d3.time.scale.utc()
使用默認的域和范圍來構建一個新的時間比例尺;默認以UTC時間配置ticks和tick format。
# scale(x)
給定輸入域內的時間x,返回相應輸出范圍的值;
# scale.invert(y)
對輸出范圍y內的值,返回相應的輸入域x內的時間對象。這個用于從rang到domain的反向映射。對于輸出域range內的y值,scale(scale.invert(y))==y;同樣,對于輸入域domain內的時間對象x,scale.invert(scale(x))==x。這種反向操作符在交互時非常有用,例如,鼠標移動時,計算出鼠標當前位置相對應的輸入域的時間。
# scale.domain([dates])
如果設置了參數dates ,則把scale的輸入域domain設置為dates數組,該數組必須包含兩個及以上的時間對象。如果數組里的元素不是時間對象,將被強制轉換為時間對象;這個強制轉換在比例尺被引用時發生。如果沒有設置參數dates,則返回scale的當前的輸入域domain。通常來說,時間比例尺雖然在輸入域domain里只有兩個時間對象,但你可以為polylinear 比例尺設置多于兩個的時間對象,這樣的話,必須在輸出范圍中設置相同數量的數值。
# scale.nice([interval[, step]])
# scale.nice([count])
擴展域使得開始和結束于很好的整數值,當由指定的時間間隔和可選參數階數step。作為替代方案,指定一個明確的時間間隔,一個數字count 可以被指定,并且在時間間隔將自動被選擇為與scale.ticks一致。如果未指定計數count ,則默認為10。
這個方法通常擴展比例尺的域,可能只擴展邊界到最接近的整數值。Nicing是有用的,如果域是從數據計算的并可以是不規則的。例如,對于域[2009-07-13T00:02, 2009-07-13T23:48]好域是[2009-07-13, 2009-07-14]。如果域有多于兩個值,nicing將只影響域的第一個和最后一個值。
# scale.range([values])
如果設置了參數values,則把scale的輸出域range設置為values數組,該數組必須包含兩及以上的數值,以匹配輸入域domain。values數組里的元素不需要一定是數字類型,任何支持下面的interpolator的數據類型都可以。但是,invert操作符需要數字類型的輸出域。如果沒有設置參數values,則返回scale的當前輸出域。
# scale.rangeRound([values])
設置scale的輸出域range為指定的values數組,同時設置了scale的interpolator為d3.interpolateRound。如果比例尺輸出的值應該是整數時,這是一個便捷的方法,可以有效地避免平滑處理工件。也可以在引用比例尺應用之后手動四舍五入輸出的值。
# scale.interpolate([factory])
如果設置了參數factory,則將scale的輸出插值器設置為factory。默認的插值器工廠為d3.interpolate,將標準化的[0,1]范圍內的輸入域參數t,映射到相應的輸出域range內的數值。插值器工廠將為輸出范圍內的相鄰的每對數值構造插值器。
# scale.clamp([boolean])
如果設置了參數boolean(布爾值),則相應地開啟或者關閉clamping。默認情況下,clamping是關閉的,如果一個超出了輸入域的值被傳遞給了比例尺,則比例尺將通過線性推斷,可能會返回一個輸出范圍之外的數值。以默認的[0,1]輸入域和輸出域為例,輸入數值2將返回輸出數值2。如果clamping開啟,標準化的輸入域參數t會被限定在輸出域[0,1]內,這樣比例尺返回的值永遠都在輸出域內。如果boolean沒有設置,返回的是比例尺是否限定當前數值到輸出范圍內。
# scale.ticks([interval[, step]])
# scale.ticks([count])
返回比例尺輸入域的代表性時間。返回的打點tick時間,它們有相同間距(模式不標準的時間間隔,比如月份和閏年)、包含可讀性的數值(比如午夜),以及確保在輸入域范圍之內。刻度常被用在顯示參考線、刻度標記,與視覺化的數據一起使用時。
如果參數count是一個數字,將返回大約count數量的刻度。如果未設置參數count,默認設置為10。Count只是一個提示,根據輸入域domain,比例尺可能會返回更多或更少的數值。
如果設置了參數時間間隔 interval ,那么將會引用time interval的range function 函數,同時傳遞可選參數step,以生成刻度。
比如,生成默認的10個刻度
scale.ticks(10);
或者,以15分鐘為間隔生成ticks:
scale.ticks(d3.time.minute, 15);
注意:對于UTC 比例尺,使用相應的UTC輸出范圍方法(比如,d3.time.minute.utc)。:
以下時間間隔被視為自動ticks:
1-, 5-, 15- 和 30-秒.
1-, 5-, 15- 和 30-分.
1-, 3-, 6- 和 12-小時.
1- 和 2-天.
1-星期.
1- 和 3-月.
1-年.
這一組時間間隔是稍微有點隨意的,并且額外的值也會在未來會被加上。
# scale.tickFormat(count)
返回一個可以顯示刻度值的世時間格式化函數。參數count應該和用于生成刻度值的數量一致。你不用必須使用比例尺內建的刻度格式,但它會根據輸入域的時間自動計算相應的結果。
比如以下時間格式:
%Y – 年分界,如"2011".
%B – 月分界,如"February".
%b %d – 星期分界,如"Feb 06".
%a %d – 日期分界,如"Mon 07".
%I %p – 小時分界,如"01 AM".
%I:%M – 分鐘分界,如"01:23".
:%S – 秒分界,如":45".
.%L – 毫秒分界,如".012".
使用多重時間格式,默認的時間格式為每個時間間隔提供局部和全局環境。例如,為顯示[11 PM, Mon 07, 01 AM],刻度格式器可以同時展現小時和日期信息--而非只有小時。如果你喜歡用單一的時間格式器,你可以一直使用你自己定義的 d3.time.format。
# scale.copy()
返回當前time scale的完整副本。所有對當前世家比例尺的改變都不會改變返回的副本,反之亦然。
何凱琳譯 20141124 gulu校 2014-11-29