BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #27708同步于 2014/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

求问D3中的数组值

ccy
2014/10/9镜像同步5 回复
在网上下载了D3的一个stream graph的例子,但是不太明白是怎么实现的? <!DOCTYPE html> <meta charset="utf-8"> <title>Streamgraph</title> <style> body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; margin: auto; position: relative; width: 960px; } button { position: absolute; right: 10px; top: 10px; } </style> <button onclick="transition()">Update</button> <script src="http://d3js.org/d3.v3.min.js"></script> <script> var n = 5, // number of layers m = 60, // number of samples per layer stack = d3.layout.stack().offset("wiggle"), layers0 = stack(d3.range(n).map(function() { return bumpLayer(m); })), layers1 = stack(d3.range(n).map(function() { return bumpLayer(m); })); var width = 960, height = 500; var x = d3.scale.linear() .domain([0, m - 1]) .range([0, width]); var y = d3.scale.linear() .domain([0, d3.max(layers0.concat(layers1), function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); })]) .range([height, 0]); var color = d3.scale.linear() //.range(["#aad", "#556"]); //.range(["#ffffff", "#80c080"]); .range(["#17f538", "#00538b"]); var area = d3.svg.area() .x(function(d) { return x(d.x); }) //x表示数据在横坐标的位置 .y0(function(d) { return y(d.y0); }) //y0可以认为是总高度 .y1(function(d) { return y(d.y0 + d.y); }); //y1表示数据在纵坐标的高度 var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height); svg.selectAll("path") .data(layers0) .enter().append("path") .attr("d", area) .style("fill", function() { return color(Math.random()); }); var dataset= [1,2,3,4,5]; svg.selectAll("text") .data(dataset) .enter() .append("text") .text("New paragraph!") .attr("x",function(d) {return d*(500/dataset.length);}) .attr("y",200) .attr("font-family", "sans-serif") .attr("font-size", "11px") .attr("fill", "black");; function transition() { d3.selectAll("path") .data(function() { var d = layers1; layers1 = layers0; return layers0 = d; }) .transition() .duration(2500) .attr("d", area); } // Inspired by Lee Byron's test data generator. function bumpLayer(n) { function bump(a) { var x = 1 / (.1 + Math.random()), y = 2 * Math.random() - .5, z = 10 / (.1 + Math.random()); for (var i = 0; i < n; i++) { var w = (i / n - y) * z; a[i] += x * Math.exp(-w * w); } } var a = [], i; for (i = 0; i < n; ++i) a[i] = 0; for (i = 0; i < 5; ++i) bump(a); console.log(a[0]) /* var a = [], i; i=5; a[0]=1; a[1]=5; a[2]=20; a[3]=2; a[4]=100; */ return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; }); } </script> 请问为什么在最后的bumper函数中,我自己写了a[]的五个值跟随机生成的差那么多?貌似bump函数生成的a【】不止五个值? 弄了很久,求大神指导,谢谢~~~
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
weiyitheonly机器人#1 · 2014/10/10
for (i = 0; i < n; ++i) a[i] = 0; a.length 是n不是5吧。。
weiyitheonly机器人#2 · 2014/10/10
两次调的时候 a都是60个呢。。 var n = 5, // number of layers m = 60, // number of samples per layer stack = d3.layout.stack().offset("wiggle"), layers0 = stack(d3.range(n).map(function() { return bumpLayer(m); })), layers1 = stack(d3.range(n).map(function() { return bumpLayer(m); }));
ccy机器人#3 · 2014/10/10
是啊,才发现是60个,谢谢解答啊~~~那整个最后一句是什么意思? return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; }); 也没看到有定义d,x,y呀? 另外是怎么控制layer的范围的?求指教,多谢啊~~~ 【 在 weiyitheonly 的大作中提到: 】 : 两次调的时候 : a都是60个呢。。 : var n = 5, // number of layers : ...................
weiyitheonly机器人#4 · 2014/10/10
return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; }); 相当于 function abc(d, i) { return {x: i, y: Math.max(0, d)}; } for(var i =0; i < a.lenght; i++) { abc(a[i], i); } 这样看的话,d是循环的那一项的值。x 和 y不是变量,是object的属性名。 控制范围是啥?
ccy机器人#5 · 2014/10/10
这个懂了,谢谢你啊~~~ 另外为什么这些layer会这么随机且不相关的排列?(如图一) 而当我人工设定数组a[]的值,如: function bumpLayer(n) { var a = [], i; for (i = 0; i < n; ++i) {a[i] = i%20; console.log(a[i]) } return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; }); } 返回的却是第二个图?不应该是平行的山峰吗,怎么变成向右下倾斜的山峰? 多谢帮忙啊~~~ 【 在 weiyitheonly 的大作中提到: 】 : return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; }); : 相当于 : function abc(d, i) { return {x: i, y: Math.max(0, d)}; } : ...................