2012-11-05 7 views
5

Mam zestaw danych 4 wartości. [a, b, c, d]. Obecnie są wyświetlane na wykresie słupkowym, dla każdej wartości jeden pasek. Teraz, gdy wartości c i d są wartościami średnimi, chciałbym wyświetlić je jako linię za prętami aib. Czy to możliwe przy pomocy d3? Jak mogę przełączać się między wyświetlaniem słupków lub linii w obrębie tej samej szyny danych?d3.js Jak dodać linie do wykresu słupkowego

Dzięki za pomoc.

Odpowiedz

8

jestem delegowania przykład tutaj ponieważ żadna z odpowiedzi nie dostarcza działającego przykładu w jsbin lub jsfiddle itp. z wykresu słupkowego z linią.
http://jsbin.com/gisinomo/1/edit

Przykład to rozwidlenie prostej wykresu słupkowego na 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

nie widzę "BarChart z linii" w swojej jsbin, tylko mówię ... – mpgn

+0

@Martialp - Linia była w oryginale. Zaktualizowałem skrzypce i kod 'return x2 (d.letter)', aby ponownie go wyświetlić. – mg1075

1

Zrób listę obiektów z dwóch właściwości z twoich danych:

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] }; } 
); 

Następnie można zrobić coś takiego (nie sprawdzone)

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; });