2016-04-29 8 views
1

Ich habe ein Flächendiagramm (siehe js fiddle https://jsfiddle.net/o7df3tyn/) Ich möchte dieses Flächendiagramm animieren. Ich versuchte, den Ansatz in this Frage, aber das scheint nicht zu helfen, weil ich mehr Liniendiagramme im gleichen svg Elemente habeD3 Flächendiagrammanimation

var numberOfDays = 30; 

var vis = d3.select('#visualisation'), 
     WIDTH = 1000, 
     HEIGHT = 400, 
     MARGINS = { 
      top: 20, 
      right: 20, 
      bottom: 20, 
      left: 50 
     }; 

    var drawArea = function (data) { 
     var areaData = data; 
     // var areaData = data.data; 
     var xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([0, numberOfDays + 1]), 
      yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([_.min(areaData), _.max(areaData)]); 

     var area = d3.svg.area() 
      .interpolate("monotone") 
      .x(function(d) { 
       return xRange(areaData.indexOf(d)); 
      }) 
      .y0(HEIGHT) 
      .y1(function(d) { 
       return yRange(d); 
      }); 

     var path = vis.append("path") 
     .datum(areaData) 
     .attr("fill", 'lightgrey') 
     .attr("d", area); 
     }; 
var data = [1088,978,1282,755,908,1341,616,727,1281,247,1188,11204,556,15967,623,681,605,7267,4719,9665,5719,5907,3520,1286,1368,3243,2451,1674,1357,7414,2726]  
drawArea(data); 

So kippe ich den Vorhang Ansatz. Ich möchte den Bereich von unten animieren. Irgendwelche Ideen/Erklärungen?

Nur für den Fall, dass jemand anderes in dem gleichen Problem steckte, @thatOneGuy das genaue Problem genagelt. Meine aktualisiert Geige ist hier https://jsfiddle.net/sahils/o7df3tyn/14/

Antwort

1

Die andere Antwort ist in Ordnung, aber das Diagramm wird nicht animiert .

Hier ist, wie ich es tun würde.

Ich würde ein Animations-Tween zum Pfad hinzufügen, so dass es zwischen 0 und dem Punkt auf dem Pfad tween wird.

So etwas so:

//create an array of 0's the same size as your current array : 

    var startData = areaData.map(function(datum) { 
     return 0; 
     }); 

//use this and tween between startData and data 

var path = vis.append("path") 
    .datum(startdata1) 
    .attr("fill", 'lightgrey') 
    .attr("d", area) 
    .transition() 
    .duration(1500) 
    .attrTween('d', function() { 
     var interpolator = d3.interpolateArray(startData, areaData); 
     return function(t) { 
     return area(interpolator(t)); 

     } 
    }); 

Der Grund, warum Ihr nicht wegen dieser Linie war arbeitete:

.x(function(d) { 
     return xRange(areaData.indexOf(d)); 
    }) 

d an dieser Stelle ein Wert zwischen 0 und das aktuelle Stück Daten, so areaData.indexOf(d) wird nicht funktionieren.

.x(function(d,i) { 
     return xRange(i); 
    }) 

Diese entlang der x-Achse :)

Aktualisiert Geige wird erhöht:

Nur soviel ändern https://jsfiddle.net/thatOneGuy/o7df3tyn/17/

+0

Danke, viel, dass es gelöst hat. Nur neugierig.Ich stelle eine ganzzahlige Ganzzahl dar (eigentlich ist es die Anzahl der Tage) Also sollte xRange (index) nicht gleich xRange (areaData.indexOf (d)) sein. Ich habe versucht, in jeder Wiederholung zu drucken. es druckt als 1 2 3 4 .. ebenso. Also bin ich etwas verwirrt darüber. Vielleicht verstehe ich nicht, wie diese Bereichsfunktion funktioniert. Meines Erachtens bezeichnet es jeden Wert, der auf xAxis aufgetragen werden soll, wobei d in der y-Funktion den Wert auf der Y-Achse angibt. –

+0

Ihre Daten sind ein Array von ganzen Zahlen, in dem Moment, in dem Sie es nur zeichnen, wenn sie in dem Array ankommen. Also Tag 0, ist der erste, Tag 1, ist der zweite und so weiter. Der beste Weg dies zu tun wäre, 'i' zu benutzen, anstatt das, was Sie jetzt haben, was indexOf verwendet. Wie beim Tween übergibt man die Werte an die Bereichsfunktion und überprüft, ob die AreaData für den aktuellen Wert zwischen 0 und dem Datenwert liegt, damit atm nicht gefunden wird. Um dies zu lösen, verwenden Sie einfach "i", was die gleiche Ausgabe liefert. – thatOneGuy

+0

Danke vielmals. –

2

https://jsfiddle.net/DavidGuan/o7df3tyn/2/

vis.append("clipPath") 
    .attr("id", "rectClip") 
.append("rect") 
    .attr("width", 0) 
    .attr("height", HEIGHT); 

Sie jetzt einen Versuch haben.

Denken Sie daran, Clip-Pfad attr den SVG-Elemente Sie

In diesem Fall

var path = vis.append("path") 
    .datum(areaData) 
    .attr("fill", 'lightgrey') 
    .attr("d", area) 
    .attr("clip-path", "url(#rectClip)") 

aktualisieren ausblenden möchten hinzufügen:
Wenn wir den Bereich von unten wachsen wollen:

vis.append("clipPath") 
    .attr("id", "rectClip") 
.append("rect") 
    .attr("width", WIDTH) 
    .attr("height", HEIGHT) 
    .attr("transform", "translate(0," + HEIGHT + ")") 

d3.select("#rectClip rect") 
    .transition().duration(6000) 
    .attr("transform", "translate(0," + 0 + ")") 
+0

Diese sieht nicht wirklich mein Problem lösen. Ich muss das Diagramm von unten nach oben wachsen lassen. Dort kämpfe ich. Ein Overlay löst mein Problem nicht (wie in diesem Fall kann ich das Diagramm zeichnen und es dann aus dem Overlay animieren.) Ich muss den Graph eher aus der X-Achse herausziehen. –

+0

https://jsfiddle.net/o7df3tyn/3/ Dies ist die aktualisierte Füllung. So wie ich über einen Zeitraum von zwei Sekunden meinen Graphen von weiß zu grau übertrage. Aber ich muss den Graph von Null auf den Graphen Wert wachsen. –

+0

Hallo, antworten aktualisiert. –