Ok, sto iniziando a familiarizzare un po 'con D3, ma sono ancora un po' confuso su alcune cose. Ora sto provando a disegnare le linee della griglia, ma mi sto rendendo conto che potrei star tagliando o farlo correttamente. Ho provato ad aggiungere alcune linee della griglia, usando un tutorial, ma ho finito con un sacco di codice che mi sembra di essere jimmy rigging al fine di farlo allineare correttamente. Mi chiedevo se qualcuno potesse indicarmi un modo migliore di scrivere questo ...Modo corretto per tracciare linee di griglia
Il codice originale è questo.
<script type="text/javascript">
//Width and height
var w = 800;
var h = 400;
var padding = 20;
var border=1;
var bordercolor='black';
var dataset = [
[5, 20], [480, 90], [250, 50], [100, 33], [330, 95],[-50,-100],[50,-45],
[410, 12], [475, 44], [25, 67], [85, 21], [220, 88],[-480, -467], [3,-90],[468,481]
];
// create scale functions
var xScale = d3.scale.linear()
.domain([d3.min(dataset, function(d) { return d[0]; }), d3.max(dataset, function(d) { return d[0]; })])
.range([padding, w - padding * 2]);
var yScale = d3.scale.linear()
.domain([d3.min(dataset, function(d) { return d[0]; }), d3.max(dataset, function(d) { return d[1]; })])
.range([h - padding, padding]);
var rScale = d3.scale.linear()
.domain( [-100, d3.max(dataset, function(d) { return d[1]; })] )
.range([2,5]);
//Create SVG element
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h)
.attr("border",border)
;
//define X axis this is rly a function, remember, variables can hold functions in JS
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(1)
.tickSize(-h, 0, 0)
; //Set rough # of ticks
//Define Y axis
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(1)
.tickSize(-w, 0, 0)
;
//create the circles
svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("cx", function(d) {
return xScale(d[0]);
})
.attr("cy", function(d) {
return yScale(d[1]);
})
.attr("r", 3);
// draw axes here
svg.append("g")
.attr("class", "axis") //assign "axis" class
.attr("transform", "translate(0," + (h - padding) +")")
.call(xAxis);
svg.append("g")
.attr("class", "axis") //assign "axis" class
.attr("transform", "translate(" + padding + ",0)" )
.call(yAxis);
// end draw axes here
</script>
e il codice ho aggiunto nel secondo collegamento è qui
var vis = svg.append("svg:g")
.attr("transform", "translate(20,0)")
var rules = vis.append("svg:g").classed("rules", true)
rules.append("svg:g").classed("grid x_grid", true)
.attr("transform", "translate(-20,"+h+")")
.call(d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(4)
.tickSize(-h,0,0)
.tickFormat("")
)
rules.append("svg:g").classed("grid y_grid", true)
.call(d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5)
.tickSize(-w,0,0)
.tickFormat("")
)
rules.append("svg:g").classed("labels x_labels", true)
.attr("transform", "translate(-20,"+ h +")")
.call(d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(4)
.tickSize(0)
.tickFormat("")
// .tickFormat(d3.time.format("%Y/%m"))
)
rules.append("svg:g").classed("labels y_labels", true)
.call(d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5)
.tickSubdivide(1)
.tickSize(0, 0, 0)
.tickFormat("")
)
Anche in questo caso, davvero apprezzare alcun aiuto
Sono d'accordo con Lars e ho trovato utile usare anche le zecche per le griglie. Vedi qui per una variante http://www.d3noob.org/2013/01/adding-grid-lines-to-d3js-graph.html – d3noob
Questo era il link che ho usato per creare questa versione del mio grafico: http://goo.gl/OmX52 ma alla fine ho dovuto fare un pasticcio manuale con la "trasformazione" per far coincidere le righe e non era ancora perfettamente in linea. Lars, ho copiato il tuo codice nel mio
Supponendo che sia stato definito lo standard Mike Bostock'smargins e che sia stata definita una scala lineare per l'asse y, il codice seguente creerà linee di griglia orizzontali senza utilizzare
tickSize()
.fonte
2013-07-26 00:32:13 arete
Grazie! Non sapevo che possiamo dichiarare molti attr insieme – muyueh
Assolutamente! Questo singolo oggetto attributo può anche essere usato con .style ({...}) – arete
Ti dispiacerebbe spiegare la tua motivazione dietro non usare Ticksize e perché la tua soluzione potrebbe essere considerata una pratica migliore? – Seanny123
Vorrei suggerire di usare d3.svg.axis(). Scala() per legare la griglia per le coordinate. Ho disegnato un quick example in base al codice: http://jsfiddle.net/temirov/Rt65L/1/
Il succo è quello di utilizzare l'esistente scale, X e Y, e di utilizzare le zecche come griglia. Poiché yAxis e xAxis sono già definiti, possiamo semplicemente riutilizzarli. Ecco il codice rilevante:
fonte
2014-03-26 04:33:52
+1 Questo è il modo migliore per farlo, poiché significa che se si modifica la proprietà .ticks() sul proprio asse , quindi si rifletterà nelle linee della griglia. – ninjaPixel
seguito @ idea di Arete, è possibile utilizzare il seguente per evitare di ri-disegno inutilmente la griglia:
e definire quanto segue nel file CSS
fonte
2014-07-23 22:59:31 mfroese
Si potrebbe utilizzare innerTickSize, invece di tickSize:
fonte
2015-11-12 03:10:58 Neptunemo
Nel progetto d3fc abbiamo creato uno gridlines component che esegue il rendering esattamente allo stesso modo dell'asse D3 (v4).
Ecco un esempio di utilizzo:
che rende come segue:
La spaziatura delle griglie è determinata dalle zecche forniti dagli assi associati.
Disclosure: sono un collaboratore principale del progetto d3fc!
fonte
2016-03-18 06:09:05 ColinE