我正在尝试动画(与转换)一个项目进入实时图表。如何在d3中使用与计时器的转换?
正如你所看到的,当点击“添加圆”按钮时,圆将停留在图表的底部,而不是向上动画。
有趣的是,在转换中添加.ease(d3.easeLinear)
可解决问题。
为什么?
在d3中使用与计时器的转换在概念上是错误的吗?
const width = 300;
const height = 100;
const margin = { top: 0, right: 30, bottom: 30, left: 50 };
const main = d3.select('.chart')
.append('svg')
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.append('g')
.attr('transform', `translate(${margin.left}, ${margin.top})`);
const now = Date.now();
const xScale = d3.scaleTime().domain([now - 10000, now]).range([0, width]);
const xAxis = d3.axisBottom(xScale).ticks(5);
const xAxisG = main.append('g')
.attr('transform', `translate(0, ${height})`)
.call(xAxis);
let data = [];
function drawCircles() {
const t = d3.transition().duration(1000); //.ease(d3.easeLinear);
const update = main.selectAll('circle').data(data);
update.enter()
.append('circle')
.attr('r', d => d.value)
.merge(update)
.attr('cx', d => xScale(d.timestamp))
.attr('cy', height)
.transition(t)
.attr('cy', height/2);
}
d3.timer(() => {
const now = Date.now();
xScale.domain([now - 10000, now]);
xAxisG.call(xAxis);
drawCircles();
});
d3.select('.add-circle').on('click',() => {
data.push({
timestamp: Date.now() - 3000,
value: 10
});
});
svg {
margin: 30px;
}
.add-circle {
margin-left: 200px;
}
<script src="https://unpkg.com/[email protected]/build/d3.js"></script>
<button class="add-circle">Add circle</button>
<div class="chart"></div>
@Misha,赫拉尔多:大哥哥在看我们;-)看看迈克·博斯托克的块[*我做圈*]( http://bl.ocks.org/mbostock/ad550c9d6d156ac726b45f48fa6ff2c7),它不完全回答* this *问题,但似乎有点奇怪地相关... – altocumulus
Mike创建了此示例作为对以下内容的回复:https://github.com/ d3/d3-transition/issues/65 –
*“感谢Mike,这比以前的回复更有帮助”*。我只希望你在谈论他*以前的回应...... –