152 lines
3.6 KiB
Markdown
152 lines
3.6 KiB
Markdown
![]() |
---
|
|||
|
id: 587d7fa9367417b2b2512bce
|
|||
|
title: 動態設置每個 Bar 的座標
|
|||
|
challengeType: 6
|
|||
|
forumTopicId: 301487
|
|||
|
dashedName: dynamically-set-the-coordinates-for-each-bar
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
上個挑戰在 `svg` 元素中爲 `dataset` 的每一個數據點創建並且添加了一個矩形,其中一個矩形表示一組, 但是它們相互重疊。
|
|||
|
|
|||
|
矩形的位置是由 `x` 和 `y` 屬性決定的。 它們告訴 D3 在 `svg` 區域的哪個位置開始繪製圖形。 上個挑戰將它們都設置爲 0,因此所有條形都在左上角。
|
|||
|
|
|||
|
對於條形圖,所有條形應該處於相同的垂直線上,也就是說所有條形的 `y` 值相同(爲 0), 但是 `x` 值需要隨着增添新的條形而變化。 注意 `x` 值越大,圖形就越靠近右邊。 所以當遍歷 `dataset` 中的數組元素時,`x` 的值應該遞增。
|
|||
|
|
|||
|
D3 的 `attr()` 方法可接收一個回調函數來動態設置屬性。 這個回調函數有兩個參數,一個是數據點本身(通常是 `d`),另一個是該數據點在數組中的下標, 這個參數是可選的。 下面是其格式:
|
|||
|
|
|||
|
```js
|
|||
|
selection.attr("property", (d, i) => {
|
|||
|
|
|||
|
})
|
|||
|
```
|
|||
|
|
|||
|
值得注意的是,你不需要寫 `for` 循環或者用 `forEach()` 迭代數據集中的對象。 `data()` 方法會解析數據集,任何鏈接在 `data()` 後面的方法都會爲數據集中的每個對象運行一次。
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
改變 `x` 屬性的回調函數,讓它返回下標乘以 30 的值。
|
|||
|
|
|||
|
**注意:**每組的寬爲 25,所以每次 `x` 增加 30,可在每組之間留出一些空隙。 在這個例子中任何比 25 大的數也同樣適用。
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
第一個 `rect` 的 `x` 值應該爲 `0`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(0).attr('x') == '0');
|
|||
|
```
|
|||
|
|
|||
|
第二個 `rect` 的 `x` 值應該爲 `30`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(1).attr('x') == '30');
|
|||
|
```
|
|||
|
|
|||
|
第三個 `rect` 的 `x` 值應該爲 `60`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(2).attr('x') == '60');
|
|||
|
```
|
|||
|
|
|||
|
第四個 `rect` 的 `x` 值應該爲 `90`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(3).attr('x') == '90');
|
|||
|
```
|
|||
|
|
|||
|
第五個 `rect` 的 `x` 值應該爲 `120`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(4).attr('x') == '120');
|
|||
|
```
|
|||
|
|
|||
|
第六個 `rect` 的 `x` 值應該爲 `150`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(5).attr('x') == '150');
|
|||
|
```
|
|||
|
|
|||
|
第七個 `rect` 的 `x` 值應該爲 `180`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(6).attr('x') == '180');
|
|||
|
```
|
|||
|
|
|||
|
第八個 `rect` 的 `x` 值應該爲 `210`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(7).attr('x') == '210');
|
|||
|
```
|
|||
|
|
|||
|
第九個 `rect` 的 `x` 值應該爲 `240`。
|
|||
|
|
|||
|
```js
|
|||
|
assert($('rect').eq(8).attr('x') == '240');
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```html
|
|||
|
<body>
|
|||
|
<script>
|
|||
|
const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9];
|
|||
|
|
|||
|
const w = 500;
|
|||
|
const h = 100;
|
|||
|
|
|||
|
const svg = d3.select("body")
|
|||
|
.append("svg")
|
|||
|
.attr("width", w)
|
|||
|
.attr("height", h);
|
|||
|
|
|||
|
svg.selectAll("rect")
|
|||
|
.data(dataset)
|
|||
|
.enter()
|
|||
|
.append("rect")
|
|||
|
.attr("x", (d, i) => {
|
|||
|
// Add your code below this line
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Add your code above this line
|
|||
|
})
|
|||
|
.attr("y", 0)
|
|||
|
.attr("width", 25)
|
|||
|
.attr("height", 100);
|
|||
|
</script>
|
|||
|
</body>
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```html
|
|||
|
<body>
|
|||
|
<script>
|
|||
|
const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9];
|
|||
|
|
|||
|
const w = 500;
|
|||
|
const h = 100;
|
|||
|
|
|||
|
const svg = d3.select("body")
|
|||
|
.append("svg")
|
|||
|
.attr("width", w)
|
|||
|
.attr("height", h);
|
|||
|
|
|||
|
svg.selectAll("rect")
|
|||
|
.data(dataset)
|
|||
|
.enter()
|
|||
|
.append("rect")
|
|||
|
.attr("x", (d, i) => {
|
|||
|
return i * 30
|
|||
|
})
|
|||
|
.attr("y", 0)
|
|||
|
.attr("width", 25)
|
|||
|
.attr("height", 100);
|
|||
|
</script>
|
|||
|
</body>
|
|||
|
```
|