4.1 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
587d7fa9367417b2b2512bce | Impostare dinamicamente le coordinate per ogni barra | 6 | 301487 | dynamically-set-the-coordinates-for-each-bar |
--description--
L'ultima sfida ha creato e aggiunto un rettangolo all'elemento svg
per rappresentare ogni punto del dataset
con una barra. Sfortunatamente, sono stati tutti impilati l'uno sull'altro.
Il posizionamento di un rettangolo è gestito dagli attributi x
e y
. Essi dicono a D3 dove iniziare a disegnare la forma nell'area svg
. L'ultima sfida li ha impostati tutti a 0, quindi ogni barra è stata posizionata nell'angolo in alto a sinistra.
Per un grafico a barre, tutte le barre dovrebbero posionarsi allo stesso livello verticale, ciò significa che il valore y
rimane lo stesso (a 0) per tutte le barre. Il valore x
, tuttavia, deve cambiare quando si aggiungono nuove barre. Ricorda che valori x
più grandi spingono gli oggetti più a destra. Mentre passi attraverso gli elementi dell'array in dataset
, il valore x
dovrebbe aumentare.
Il metodo attr()
in D3 accetta una funzione di callback per impostare dinamicamente quell'attributo. La funzione di callback richiede due argomenti: uno per il punto dati stesso (solitamente d
) e uno per l'indice del punto dati nell'array. Il secondo argomento per l'indice è opzionale. Ecco il formato:
selection.attr("property", (d, i) => {
})
È importante notare che NON è necessario scrivere un ciclo for
o utilizzare forEach()
per iterare sugli elementi del set di dati. Ricorda che il metodo data()
analizza il set di dati, e qualsiasi metodo che viene concatenato dopo data()
viene eseguito una volta per ciascun elemento del set di dati.
--instructions--
Modifica la funzione di callback dell'attributo x
in modo che restituisca l'indice moltiplicato per 30.
Nota: Ogni barra ha una larghezza di 25, quindi aumentare ogni valore x
di 30 aggiunge dello spazio tra le barre. In questo esempio, qualsiasi valore superiore a 25 può andar bene.
--hints--
Il primo rect
dovrebbe avere un valore x
di 0
.
assert($('rect').eq(0).attr('x') == '0');
Il secondo rect
dovrebbe avere un valore x
di 30
.
assert($('rect').eq(1).attr('x') == '30');
Il terzo rect
dovrebbe avere un valore x
di 60
.
assert($('rect').eq(2).attr('x') == '60');
Il quarto rect
dovrebbe avere un valore x
di 90
.
assert($('rect').eq(3).attr('x') == '90');
Il quinto rect
dovrebbe avere un valore x
di 120
.
assert($('rect').eq(4).attr('x') == '120');
Il sesto rect
dovrebbe avere un valore x
di 150
.
assert($('rect').eq(5).attr('x') == '150');
Il settimo rect
dovrebbe avere un valore x
di 180
.
assert($('rect').eq(6).attr('x') == '180');
L’ottavo rect
dovrebbe avere un valore x
di 210
.
assert($('rect').eq(7).attr('x') == '210');
Il nono rect
dovrebbe avere un valore x
di 240
.
assert($('rect').eq(8).attr('x') == '240');
--seed--
--seed-contents--
<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--
<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>