2016-04-28 6 views
0

Ich versuche einen Weg zu finden, 2 Balken zu gruppieren und dann einen Abstand zwischen ihnen zu lassen. Gibt es eine Möglichkeit, dies in D3 zu tun? Das Beispiel, dem ich folge, ist http://codepen.io/mbostock/pen/Jaemg.D3 Gruppierungsbalken

var data = [4, 8, 15, 16, 23, 42]; 

var x = d3.scale.linear() 
    .domain([0, d3.max(data)]) 
    .range([0, 420]); 

d3.select(".chart") 
    .selectAll("div") 
    .data(data) 
    .enter().append("div") 
    .style("width", function(d) { return x(d) + "px"; }) 
    .text(function(d) { return d; }); 

Vielen Dank im Voraus.

+0

Was meinen Sie mit Abstand? Können Sie einen Screenshot des gewünschten Effekts bereitstellen? – Aziz

+0

Meinst du "bar 4, bar 8, raum, bar 15, bar 16, platz, bar 23, bar 42"? –

+0

Yh, ich meine "Bar 4, Bar 8, Raum, Bar 15, Bar 16, Raum, Bar 23, Bar 42". – user3837019

Antwort

2

Hier ist das Ergebnis: https://jsfiddle.net/umeqw2f8/3/

ich Ihre Style-Funktion ein wenig verändert haben, dies zu erreichen:

.style("width", function(d,i) { 
    if(i % 2 == 0 && i != 0){ 
    d3.select(this).style("margin-top", 5+"px") 
    }else if(i == 0){} 

    return x(d) + "px"; }) 

Sie können für verschiedene Größen der Gruppierung der Modulo-Faktor ändern. Zum Beispiel für Gruppe der Nummer 3: if(i % 3 == 0 && i != 0){

+1

Ich wette 10RPs, dass dies nicht das ist, was das OP bedeutet, obwohl ich deine Antwort wirklich mochte! –

+1

@GerardoFurtado Haha, gut, die Frage ist ein wenig vage, wie Sie es begrüßen würden. Also machte ich die erste Antwort, die mir in den Sinn kam und dachte, dass wir mit OP-Kommentaren weitermachen können. – echonax

+0

Vielen Dank für Ihre Zeit und Mühe. Entschuldige die vage Frage. Was ich meinte ist "Bar 4, Bar 8, Platz, Bar 15, Bar 16, Platz, Bar 23, Bar 42". – user3837019

2

Die Idee ist, die Balken in DIV zu gruppieren und die Gruppen-Divs mit einem gewissen Abstand oder Padding zu trennen.

var data = [4, 8, 15, 16, 23, 42]; 

var gData=[]; 
for(var i=0;i<data.length/2;i++){ 
    gData[i]={ 
    "before":data[i*2], 
    "after":data[i*2+1] 
    }; 
} 
console.log(gData); 
var x = d3.scale.linear() 
    .domain([0, d3.max(data)]) 
    .range([0, 420]); 

myBarsEnter=d3.select(".chart") 
    .selectAll("div.bars") 
    .data(gData).enter().append('div').attr('class','bargroup'); 
    myBarsEnter.append('div') 
      .style("width", function(d) { return x(d.before) + "px"; }) 
      .text(function(d) { return d.before; }); 
myBarsEnter.append('div') 
      .style("width", function(d) { return x(d.after) + "px"; }) 
      .text(function(d) { return d.after; }); 

und aktualisiert CSS ist

.chart .bargroup{ 
margin-bottom:10px; 
} 
.chart .bargroup div { 
    font: 10px sans-serif; 
    background-color: steelblue; 
    text-align: right; 
    padding: 3px; 
    margin: 1px; 
    color: white; 
} 

Sie aktualisiert Code auf folgenden Link zu finden.

http://codepen.io/anon/pen/YqJpzK

+0

Vielen Dank für die Antwort. Denken Sie daran, mir zu sagen, wie Sie die Anzahl der zu gruppierenden Balken ändern. Zum Beispiel sagen, wenn ich 3 Balken oder sogar 4 gruppieren möchte. – user3837019

+1

SAM83045 erstellt ein Array mit 3 Objekten, jedes mit zwei Schlüssel/Wert-Paaren. Wenn Sie 3 Balken mit Ihren Daten gruppieren möchten, können Sie für Instante ein Array mit zwei Objekten erstellen, jedes mit 3 Paaren Schlüssel/Wert. Übrigens, bitte akzeptiere seine Antwort. –

+0

@ user3837019: Es ist besser, unsere Daten zu gruppieren, bevor sie an D3 gesendet werden, und basierend auf diesen Daten können Sie Balken so einfach zeichnen, wie Sie möchten. Ich habe Ihre Daten zuerst in Gruppen als [{"vor": 4, "nach": 8}, {"vor": 15, "nach": 16}, {"vor": 23, "nach": 42 geändert }] und übergab sie dann zum Drucken. –