2012-11-05 19 views
5

Ho un set di dati di 4 valori. [A, b, c, d]. Attualmente sono visualizzati in un grafico a barre, per ogni valore di una barra. Ora, dato che i valori c e d sono valori medi, vorrei mostrarli come linea dietro le barre di aeb. È possibile con d3? Come posso passare dalla visualizzazione della barra o della linea nello stesso dataarray?d3.js Come aggiungere linee a un grafico a barre

Grazie per il vostro aiuto.

risposta

8

sto postando un esempio qui perché nessuna delle risposte fornisce un esempio funzionante in jsbin o jsfiddle, ecc. di un diagramma a barre con una linea.
http://jsbin.com/gisinomo/1/edit

L'esempio è un fork del semplice grafico a barre sul wiki d3.
http://bl.ocks.org/mbostock/3885304

CSS

body { 
    font: 10px sans-serif; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: #000; 
    shape-rendering: crispEdges; 
} 

.bar { 
    fill: steelblue; 
} 

.x.axis path { 
    display: none; 
} 

.line { 
    fill: none; 
    stroke: #444; 
    stroke-width: 1.5px; 
} 

JavaScript

var data = [{ "letter": "A", "frequency": .08167}, 
{ "letter": "B", "frequency": .01492}, 
{ "letter": "C", "frequency": .02780}, 
{ "letter": "D", "frequency": .04253}, 
{ "letter": "E", "frequency": .12702}, 
{ "letter": "F", "frequency": .02288}, 
{ "letter": "G", "frequency": .02022}, 
{ "letter": "H", "frequency": .06094}, 
{ "letter": "I", "frequency": .06973}, 
{ "letter": "J", "frequency": .00153}, 
{ "letter": "K", "frequency": .00747}, 
{ "letter": "L", "frequency": .04025}, 
{ "letter": "M", "frequency": .02517}, 
{ "letter": "N", "frequency": .06749}, 
{ "letter": "O", "frequency": .07507}, 
{ "letter": "P", "frequency": .01929}, 
{ "letter": "Q", "frequency": .00098}, 
{ "letter": "R", "frequency": .05987}, 
{ "letter": "S", "frequency": .06333}, 
{ "letter": "T", "frequency": .09056}, 
{ "letter": "U", "frequency": .02758}, 
{ "letter": "V", "frequency": .01037}, 
{ "letter": "W", "frequency": .02465}, 
{ "letter": "X", "frequency": .00150}, 
{ "letter": "Y", "frequency": .01971}, 
{ "letter": "Z", "frequency": .00074}]; 

var margin = {top: 20, right: 20, bottom: 30, left: 40}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom; 

var formatPercent = d3.format(".0%"); 

var x = d3.scale.ordinal() 
    .rangeRoundBands([0, width], .1); 

var x2 = d3.scale.ordinal() 
    .rangeBands([0, width], 0); 

var y = d3.scale.linear() 
    .range([height, 0]); 

var xAxis = d3.svg.axis() 
    .scale(x) 
    .orient("bottom"); 

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .tickFormat(formatPercent); 

var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 


    data.forEach(function(d) { 
    d.frequency = +d.frequency; 
    }); 

    x.domain(data.map(function(d) { return d.letter; })); 
    x2.domain(data.map(function(d) { return d.letter; })); 
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]); 

    svg.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + height + ")") 
     .call(xAxis); 

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Frequency"); 

    svg.selectAll(".bar") 
     .data(data) 
    .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", function(d) { return x(d.letter); }) 
     .attr("width", x.rangeBand()) 
     .attr("y", function(d) { return y(d.frequency); }) 
     .attr("height", function(d) { return height - y(d.frequency); }); 

var dataSum = d3.sum(data, function(d) { return d.frequency; }); 

var line = d3.svg.line() 
    .x(function(d, i) { 
     return x2(d.letter) + i; }) 
    .y(function(d, i) { return y(dataSum/data.length); }); 

    svg.append("path") 
     .datum(data) 
     .attr("class", "line") 
     .attr("d", line); 
+0

non vedo "barchart con una linea" nella vostra jsbin, solo dicendo ... – mpgn

+0

@Martialp - La linea era nell'originale. Ho aggiornato il violino e il codice 'return x2 (d.letter)' per farlo visualizzare di nuovo. – mg1075

1

Fate una lista di oggetti con due proprietà fuori dei suoi dati:

var data = [1,2,3,4]; 
var objects = data.slice(0, data.length/2).map(
    function(d,i) { return { value:d, average:data[i+data.length/2] }; } 
); 

Poi si può fare qualcosa di simile (non testato):

var bars = chart.selectAll("g.bar") 
    .data(objects) 
    .enter().append("g") 
    .attr("class", "bar") 
    .attr("transform", function(d,i) { return "translate("+(i*10)+",0)"; }); 


bars.append("rect") 
    .attr("x", 0) 
    .attr("y", function(d,i) { return height - d.value; }) 
    .attr("width", 10) 
    .attr("height", function(d,i) { return d.value; }); 

bars.append("line") 
    .attr("x1", 0) 
    .attr("y1", function(d,i) { return height - d.average; }) 
    .attr("x2", 10) 
    .attr("y2", function(d,i) { return height - d.average; }); 
Problemi correlati