Sto cercando di ottenere d3 per disegnare un singolo grafico a barre in pila, in questo modo:d3 come fare tracciare un'unica colonna in pila
<svg width = '500' height= '100'>
<rect x='0' y='0' width='224' height='30' fill='green'/>
<rect x='224' y='0' width='84' height='30' fill='blue'/>
<rect x='308' y='0' width='29' height='30' fill='darkgray'/>
<rect x='337' y='0' width='3' height='30' fill='#606060'/>
</svg>
Come si può vedere, la posizione x inizia da zero, quindi ogni successiva posizione x è uguale alla somma delle larghezze precedenti.
Così sto cercando di ottenere d3 a disegnare qualcosa di simile da un array chiamato datavars:
var datavars = [224, 84, 29, 3];
... e per garantire che d3 assegna la larghezza-valore corretto al corretto valore x , ho creato queste variabili:
var prev_width0 = 0;
var prev_width1 = datavars[0];
var prev_width2 = datavars[0] + datavars[1];
var prev_width3 = datavars[0] + datavars[1] + datavars[2];
... e definire il valore x in questo modo:
//create SVG element
var svg = d3.select('body')
.append('svg')
.attr('width', w)
.attr('height', h);
svg.selectAll('rect')
.data(datavars)
.enter()
.append('rect')
.attr('width', function(d){
return d;})
.attr('x',function(d, i){
return 'prev_width'+i; })
.attr('y',0)
.attr('height', 30);
come si potrebbe aver indovinato, la funzione fortemente indentata (basata sulla somma delle larghezze precedenti e definita nelle variabili prev_width
) restituisce una stringa per ogni iterazione (prev_width0, prev_width1, ecc.) e non i valori che pensavo di definire quando ho creato le variabili prev_width
.
Sto ovviamente definendo le variabili in modo errato. Qualche idea su come posso farlo correttamente?
ah ... questi sono molto carini, grazie mille. Il tuo primo suggerimento è quello a cui stavo lottando, e le prossime sono molto più eleganti. Molto apprezzato – prokaryote