gpt4 book ai didi

transition - 消除 D3 折线图过渡中的突然添加/删除

转载 作者:行者123 更新时间:2023-12-01 11:52:09 25 4
gpt4 key购买 nike

您可以在此处查看此代码:http://bl.ocks.org/2626142

此代码绘制折线图,​​然后在 3 个样本数据集之间转换。当从一个小数据集移动到一个更大的数据集时,额外的数据点突然出现,而不是从现有的线平滑展开。

当从较大的数据集移动到较小的数据集时,线条在过渡到填充整个图表之前突然被截断。

使用此代码可以突然添加和删除线条和网格线。我该如何消除这些?

var data = [
[0,2,3,2,8],
[2,4,1,5,3],
];
var data2 = [
[0,1,2,3,4,5],
[9,8,7,6,5,6],
];
var data3 = [
[1,3,2],
[0,8,5],
];

var w = 300,
h = 100;

var chart = d3.select('body').append('div')
.attr('class', 'chart')
.append('svg:svg')
.attr('width', w)
.attr('height', h);

var color = d3.scale.category10();

function drawdata(data, chart) {
var num = data[0].length-1;
var x = d3.scale.linear().domain([0, num]).range([0,w]);
var y = d3.scale.linear().domain([0, 10]).range([h, 0]);

var line = d3.svg.line()
.x(function(d, i) { return x(i); })
.y(function(d) { return y(d); });

var flat = d3.svg.line()
.x(function(d, i) { return x(i); })
.y(y(-1));

var lines = chart.selectAll('.line')
.data(data);

lines.enter().append('path')
.attr('class', 'line')
.style('stroke', function(d,i) { return color(i); })
.attr('d', line);

lines.transition()
.ease('linear')
.duration(500)
.attr('d', line);

lines.exit().remove();

// legend
var ticks = chart.selectAll('line')
.data(x.ticks(num));

ticks.enter().append('line')
.attr('x1', x)
.attr('x2', x)
.attr('y1', 0)
.attr('y2', h)
.attr('class', 'rule');
ticks.transition()
.ease('linear')
.duration(500)
.attr('x1', x)
.attr('x2', x)
.attr('y1', 0)
.attr('y2', h);
ticks.exit().remove();
}
var dats = [data, data2, data3];
function next() {
var it = dats.shift();
dats.push(it);
drawdata(it, chart);
}
setInterval(next, 2000);
next();

最佳答案

我最近遇到了类似的问题,并使用 custom interpolator 解决了它对于路径:

// Add path interpolator to d3
d3.interpolators.push(function(a, b) {
var isPath, isArea, interpolator, ac, bc, an, bn;

// Create a new array of a given length and fill it with the given value
function fill(value, length) {
return d3.range(length)
.map(function() {
return value;
});
}

// Extract an array of coordinates from the path string
function extractCoordinates(path) {
return path.substr(1, path.length - (isArea ? 2 : 1)).split('L');
}

// Create a path from an array of coordinates
function makePath(coordinates) {
return 'M' + coordinates.join('L') + (isArea ? 'Z' : '');
}

// Buffer the smaller path with coordinates at the same position
function bufferPath(p1, p2) {
var d = p2.length - p1.length;

// Paths created by d3.svg.area() wrap around such that the 'end'
// of the path is in the middle of the list of coordinates
if (isArea) {
return fill(p1[0], d/2).concat(p1, fill(p1[p1.length - 1], d/2));
} else {
return fill(p1[0], d).concat(p1);
}
}

// Regex for matching the 'd' attribute of SVG paths
isPath = /M-?\d*\.?\d*,-?\d*\.?\d*(L-?\d*\.?\d*,-?\d*\.?\d*)*Z?/;

if (isPath.test(a) && isPath.test(b)) {
// A path is considered an area if it closes itself, indicated by a trailing 'Z'
isArea = a[a.length - 1] === 'Z';
ac = extractCoordinates(a);
bc = extractCoordinates(b);
an = ac.length;
bn = bc.length;

// Buffer the ending path if it is smaller than the first
if (an > bn) {
bc = bufferPath(bc, ac);
}

// Or, buffer the starting path if the reverse is true
if (bn > an) {
ac = bufferPath(ac, bc);
}

// Create an interpolater with the buffered paths (if both paths are of the same length,
// the function will end up being the default string interpolator)
interpolator = d3.interpolateString(bn > an ? makePath(ac) : a, an > bn ? makePath(bc) : b);

// If the ending value changed, make sure the final interpolated value is correct
return bn > an ? interpolator : function(t) {
return t === 1 ? b : interpolator(t);
};
}
});

这是使用新插值器的原始要点:http://bl.ocks.org/4535474 .

它的方法是通过在开头插入零长度线段来“缓冲”较小数据集的路径。其效果是新段从行首的单个点展开,而未使用的段同样折叠成一个点。

不同大小的数据集之间的转换(显然)不是一个常见问题,也没有通用的解决方案。因为我正在可视化时间序列数据并在每日/每周/每月间隔之间转换,所以我需要接近路径末端的片段以保持视觉连续性。我可以想象这样一种情况,您希望对路径的开头执行相同的操作,或者可能通过在整个过程中统一缓冲段来扩展/收缩路径。无论哪种方式,相同的方法都会奏效。

关于transition - 消除 D3 折线图过渡中的突然添加/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com