<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script> <style> * { margin: 0; padding: 0; border: 0; } body { background: #ffd; } </style> </head> <body> <svg width="200px" height="100vh"></svg> <script> var svg = d3.select('svg'); var rect = svg.node().getBoundingClientRect(); var r = function() { return 20 + Math.random() * 50; }; var update = function(data) { console.log('update'); var count = data.length; var min = Math.min.apply(null, data), max = Math.max.apply(null, data); var dataScale = d3.scaleLinear().domain([min, max]).range([0, 100]); var percentToPixelScale = d3.scaleLinear().domain([0, 100]).range([0, rect.height]); var getR = function(d, i) { return d; }; var getY = function(d, i) { return percentToPixelScale((i + 1) * (100 / (count + 1))) }; // elements to update var u = svg.selectAll('circle') .data(data); // on exit remove u.exit().remove(); // elements to add enter = u.enter() .append('circle') .attr("cy", getY) .attr("fill", "red"); enter .merge(u) .transition() .ease(d3.easeExp) .attr('r', getR) .attr('cx', r) .attr("cy", getY) .duration(600); } var dataSet = [10, 23, 15]; update(dataSet); setInterval(function() { dataSet.push(r() / 4); update(dataSet); }, 1000); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script> <style> * { margin: 0; padding: 0; border: 0; } body { background: #ffd; } </style> </head> <body> <svg width="100%" height="99vh"></svg> <script> var svg = d3.select('svg'); var path = svg.append("path"); path.attr("fill", "none") .attr("stroke", "steelblue") .attr("stroke-linejoin", "round") .attr("stroke-linecap", "round") .attr("stroke-width", 2); var rect = svg.node().getBoundingClientRect(); var r = function() { return 20 + Math.random() * 50; }; function getRandomColor() { var letters = '0123456789ABCDEF'; var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } var update = function(data) { var count = data.length; var dataValues = data.map(function (d) { return d.value; }); var min = Math.min.apply(null, dataValues), max = Math.max.apply(null, dataValues); var dataScale = d3.scaleLinear().domain([min, max]).range([0, 100]); var percentToPixelXScale = d3.scaleLinear().domain([0, 100]).range([0, rect.width]); var percentToPixelYScale = d3.scaleLinear().domain([0, 100]).range([0, rect.height]); var getX = function (d, i) { var v = (i + 1) * (100 / (count + 1)); return percentToPixelXScale(v); }; var getY = function(d, i) { var v = 100 - dataScale(d.value); return percentToPixelYScale(v) }; var getR = function(d, i) { return d.value; }; // elements to update var u = svg.selectAll('circle') .data(data); // on exit remove u.exit().remove(); var line = d3.line() //.data(data) .x(getX) .y(getY) .curve(d3.curveMonotoneX); // apply smoothing to the line // // elements to add // enter = u.enter() // .append('circle') // .attr("cy", getY) // .attr("fill", function (d, i) { // return d.color; // }); //u.enter() path .datum(data) //.transition() //.ease(d3.easeLinear) .attr("d", line) //.duration(10); //.attr("transform", null) //.transition() //.attr("transform", "translate(" + getX(0, -1) + ")"); // enter // .merge(u) // .transition() // .ease(d3.easeLinear) // .attr('r', Math.sqrt(count / 2)) // .attr('cx', getX) // .attr("cy", getY) // .duration(400); } var len = 200; var dataSet = new Array(len).fill().map(() => { return { value: 0, color: '#000000' }; }); update(dataSet); var oldVal = 0; setInterval(function() { dataSet.push({ value: oldVal , color: getRandomColor() }); oldVal += r() - 45; if (dataSet.length > len) { dataSet.shift(); } update(dataSet); }, 100); </script> </body> </html>
102200cookie-checkD3 v4 update Enter/Exit Example Javascript