xxxxxxxxxx
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="data.js"></script>
<script src="data2.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
</style>
</head>
<body>
<script>
const width = 960;
const height = 500;
const margin = { left: 40, right: 20, top: 20, bottom: 20};
var svg = d3.select('body').append('svg')
.attr('width', width)
.attr('height', height)
const t = d3.transition().duration(1000);
const xScale = d3.scaleTime()
.range([margin.left, width - margin.right])
const yScale = d3.scaleLinear()
.range([height - margin.bottom, margin.top ])
const createLine = data => {
console.log(data)
const xExtent = d3.extent(data, d => d.time)
const yExtent = d3.extent(data, d => d.change)
xScale.domain(xExtent)
yScale.domain(yExtent)
let lines = svg.selectAll('line')
.data(data, d => d.time)
lines.exit().remove()
const enter = lines.enter().append('line')
.attr('x1', d => xScale(d.time))
.attr('y1', d => yScale(d.change))
.attr('x2', (d,i) => data[i + 1] ? xScale(data[i + 1].time) : xScale(d.time))
.attr('y2', (d,i) => data[i + 1] ? yScale(data[i + 1].change) : yScale(d.change));
lines = enter.merge(lines)
.attr('stroke', 'black')
.attr('stroke-width', 1)
.transition(t)
.attr('x1', d => xScale(d.time))
.attr('y1', d => yScale(d.change))
.attr('x2', (d,i) => data[i + 1] ? xScale(data[i + 1].time) : xScale(d.time))
.attr('y2', (d,i) => data[i + 1] ? yScale(data[i + 1].change) : yScale(d.change));
}
const xAxis = d3.axisTop().scale(xScale);
const yAxis = d3.axisLeft().scale(yScale);
svg.append('g')
.attr('transform', `translate(0, ${margin.top})`)
.call(xAxis);
svg.append('g')
.attr('transform', `translate(${margin.left}, 0)`)
.call(yAxis);
let index = 0;
data1.forEach(d => {
d.change = +d.change;
d.rate = +d.rate;
});
createLine(data1)
setTimeout(() => {
data2.forEach(d => {
d.change = +d.change;
d.rate = +d.rate;
});
createLine(data2);
}, 3000)
</script>
</body>
https://d3js.org/d3.v4.min.js