2013-03-22 15 views
7

Attualmente ho un grafico che ha valori di barra associati visualizzati sopra ogni barra, ma ho difficoltà a centrare le etichette dei valori, a causa del fatto che non riesco a recuperare la larghezza di ogni elemento di testo.Come ottenere correttamente la larghezza del testo per centrare le etichette sopra le barre del grafico?

Ecco come il mio grafico sta disegnando in questo momento:

enter image description here

Tutto quello che devi fare è sottrarre la metà della larghezza di ciascun elemento di testo, ma io non riesco a farlo con la segue CoffeeScript:

#Drawing value labels 
    svg.selectAll("rect") 
     .data(data) 
     .enter() 
     .append("text") 
     .text((d)-> d.Total) 
     .attr("width", x.rangeBand()) 
     .attr("x", (d)-> 
      textWidth = d3.selectAll("text").attr("width") 

      x(d.Year) + (x.rangeBand()/2) - (textWidth/2) 
     ) 
     .attr("y", (d)-> y(d.Total) - 5) 
     .attr("font-size", "10px") 
     .attr("font-family", "sans-serif") 

    #Drawing bars  
    svg.selectAll("rect") 
     .data(data) 
     .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", (d)-> x(d.Year)) 
     .attr("width", x.rangeBand()) 
     .attr("y", (d)-> y(d.Total)) 
     .attr("height", (d)-> height - y(d.Total)) 

c'è un modo che io possa accedere attributo width di ogni elemento di testo per impostare un valore per compensare?

risposta

4

È possibile ottenere il riquadro di delimitazione del testo e utilizzare tali valori per applicare una trasformazione per centrarlo. Un esempio per ottenere il riquadro di delimitazione è here. Il codice dovrebbe essere simile a

.text(function(d) { return d.Total; }) 
.attr("x", function(d) { 
    return x(d.Year) + (x.rangeBand()/2) - (this.getBBox().width/2); 
} 
... 
+0

funziona perfettamente . Grazie! – SCS

+0

Dovrebbe funzionare lo stesso su tutti gli elementi di testo? Attualmente sto cercando di fare lo stesso con la mia etichetta sull'asse y, ma ottengo sempre una larghezza di 0, anche se sto ricevendo un elemento di testo restituito. Questo è quello che ho finora: http://pastebin.com/VzyT2btq – SCS

+1

Funzionerà allo stesso modo per tutti gli elementi, ma devi chiamare '.getBBox()' per ogni elemento. –

6

Un modo forse più semplice è quello di utilizzare un text-anchor di middle con x insieme al lato sinistro della barra più la metà della larghezza della barra:

svg.selectAll(".bar-label") 
    .data(data) 
.enter().append("text") 
    .text((d)-> d.Total) 
    .attr("class", "bar-label") 
    .attr("text-anchor", "middle") 
    .attr("x", (d)-> x(d.Year) + x.rangeBand()/2) 
    .attr("y", (d)-> y(d.Total) - 5) 
Problemi correlati