2016-04-29 52 views
1

我有一个区域图(请参阅js小提琴https://jsfiddle.net/o7df3tyn/)我想为该区域图创作动画。我试着在this 问题的办法,但是这似乎没有帮助,因为我已经在D3区域图动画

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

,所以我不能用窗帘的方式相同SVG元素更多的图线。 我想从底部对区域进行动画处理。 任何想法/解释?

为了防止其他人陷入同样的​​问题,@thatOneGuy指出了确切的问题。我更新的小提琴是这里https://jsfiddle.net/sahils/o7df3tyn/14/

回答

1

其他答案是好的,但这不会动画图。

这是我该怎么做的。

我会将补间动画添加到路径中,以便它从0补间到路径上的点。

事情是这样:

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

     } 
    }); 

为什么你不工作是因为这条线的原因:

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

d在这一点上是与当前片段的0之间的值数据,所以areaData.indexOf(d)将不起作用。

只要改变这一点:

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

这将沿x轴:)

更新小提琴增加:https://jsfiddle.net/thatOneGuy/o7df3tyn/17/

+0

谢谢,很多解决它。只是好奇。我代表一个纯整数(实际上它是天数)所以不应该xRange(索引)与xRange(areaData.indexOf(d))相同。我尝试在evry迭代中打印我。它打印为1 2 3 4 ..以及。所以我对此有点困惑。可能是我没有得到这方面的功能是如何工作的。根据我的理解,它表示每个要绘制在xAxis上的值,y表示y轴上的值。 –

+0

您的数据是一个整数数组,现在您只是在数组到达时对其进行绘图。所以第0天,第一天,第一天,第二天等等。所以最好的方法是使用'i'而不是现在使用indexOf。当你做补间时,你将值传递给区域函数,它会检查areaData是否为当前值,该值介于0和数据值之间,因此它永远不会找到它。要解决这个问题,只需使用'i'即可得到相同的输出 – thatOneGuy

+0

明白了。非常感谢。 –

2

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

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

您可以试试了。

记住添加到你想隐藏

在这种情况下,SVG元素夹路径attr

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

更新:
如果我们想从底部生长的区域:

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

这并没有真正解决我的问题。我必须使图形从底部增长。那是我挣扎的地方。覆盖并不能解决我的问题(因为在这种情况下,我可以绘制图形,然后将其从覆盖图中移出)。我宁愿将图形生长出x轴。 –

+0

https://jsfiddle.net/o7df3tyn/3/这是更新的填充。就像我正在将图形从白色转换为灰色,持续两秒钟。但我需要将图形从零增加到图形值。 –

+0

嗨,回答更新。 –