跳至內容

資料分組

將量化值分組到連續的、不重疊的區間中,就像在直方圖中一樣。(另請參閱 Observable Plot 的 bin 轉換。)

bin()

js
const bin = d3.bin().value((d) => d.culmen_length_mm);

範例 · 來源 · 建構一個具有預設設定的新 bin 產生器。傳回的 bin 產生器支援方法串接,因此此建構函式通常與 bin.value 串接以指定值存取器。傳回的產生器也是一個函式;傳遞資料給它以進行分組。

bin(data)

js
const bins = d3.bin().value((d) => d.culmen_length_mm)(penguins);

將給定的 data 樣本的 iterable 分組。傳回一個 bin 陣列,其中每個 bin 都是一個包含輸入 data 中關聯元素的陣列。因此,bin 的length 是該 bin 中元素的數量。每個 bin 還有兩個額外的屬性

  • x0 - 區間的下界(包含)。
  • x1 - 區間的上界(不包含,最後一個區間除外)。

給定 data 中的任何空值或不可比較值,或在 網域 之外的值,都會被忽略。

bin.value(value)

js
const bin = d3.bin().value((d) => d.culmen_length_mm);

如果指定 value,則將值存取器設定為指定的函式或常數,並傳回此區間產生器。

js
bin.value() // (d) => d.culmen_length_mm

如果未指定 value,則傳回目前的存取器,預設為身分函式。

當區間 產生 時,會針對輸入資料陣列中的每個元素呼叫值存取器,並傳遞元素 d、索引 i 和陣列 data 作為三個引數。預設值存取器假設輸入資料是可以排序的(可比較),例如數字或日期。如果資料不是,則應指定存取器,以傳回給定資料對應的可排序值。

這類似於在呼叫區間產生器之前將資料對應到值,但好處是輸入資料會與傳回的區間保持關聯,因此更容易存取資料的其他欄位。

bin.domain(domain)

js
const bin = d3.bin().domain([0, 1]);

如果指定 domain,則將網域存取器設定為指定的函式或陣列,並傳回此區間產生器。

js
bin.domain() // [0, 1]

如果未指定 domain,則傳回目前的網域存取器,預設為 extent。區間網域定義為陣列 [min, max],其中 min 是可觀察到的最小值,而 max 是可觀察到的最大值;兩個值都包含在內。當區間 產生 時,此網域外的任何值都會被忽略。

例如,若要使用具有 線性比例 x 的區間產生器,可以這樣說

js
const bin = d3.bin().domain(x.domain()).thresholds(x.ticks(20));

然後可以這樣從數字陣列計算區間

js
const bins = bin(numbers);

如果使用預設 extent 網域,且 閾值 指定為計數(而不是明確值),則計算出的網域將會 niced,以使所有區間寬度均勻。

請注意,網域存取器會在具體化陣列的上呼叫,而不是在輸入資料陣列上。

bin.thresholds(thresholds)

js
const bin = d3.bin().thresholds(20);

如果將thresholds指定為數字,則網域將均勻地分成大約這麼多個區間;請參閱刻度

js
const bin = d3.bin().thresholds([0.25, 0.5, 0.75]);

如果將thresholds指定為陣列,則將閾值設定為指定值並傳回此區間產生器。閾值定義為值陣列 [x0, x1, …]。任何小於x0的值都將放入第一個區間;任何大於或等於x0但小於x1的值都將放入第二個區間;依此類推。因此,產生的區間將有thresholds.length + 1 個區間。任何超出網域的閾值都將被忽略。第一個bin.x0 永遠等於最小網域值,最後一個bin.x1 永遠等於最大網域值。

js
const bin = d3.bin().thresholds((values) => [d3.median(values)]);

如果將thresholds指定為函式,則該函式將傳遞三個引數:從資料衍生的輸入陣列,以及表示為minmax網域。然後,函式可以傳回數字閾值的陣列或區間數量;在後一種情況下,網域將均勻地分成大約count 個區間;請參閱刻度。例如,您可能想在對時間序列資料進行分組時使用時間刻度;請參閱範例

js
bin.thresholds() // () => [0, 0.5, 1]

如果未指定thresholds,則傳回目前的閾值產生器,預設實作Sturges 公式。(因此,預設情況下,要分組的值必須是數字!)

thresholdFreedmanDiaconis(values, min, max)

js
const bin = d3.bin().thresholds(d3.thresholdFreedmanDiaconis);

來源 · 傳回根據Freedman–Diaconis 法則計算出的區間數量;輸入必須是數字。

thresholdScott(values, min, max)

js
const bin = d3.bin().thresholds(d3.thresholdScott);

原始碼 · 根據 Scott 的常態參考法則 傳回區間數目;輸入的 必須是數字。

thresholdSturges(, 最小值, 最大值)

js
const bin = d3.bin().thresholds(d3.thresholdSturges);

原始碼 · 根據 Sturges 公式 傳回區間數目;輸入的 必須是數字。