Ich bin sehr neu in D3 passiert, Ich versuche, eine einfache Live-Chart lose auf einem Ausschnitt aus hier basiert zu machen: https://bost.ocks.org/mike/path/D3 Übergangslinie zweimal
ich in der Lage sein wollen, eine Reihe von Linien zu einem hinzufügen Live-Chart verschieben und von einem Web-Socket aktualisieren lassen (ich weiß, wie man das Bit macht!)
Wenn ich versuche, eine zweite Zeile hinzuzufügen, wird das Diagramm nicht reibungslos aktualisiert, ich denke, der Übergang wird aufgerufen zweimal. Jede Hilfe wurde dankbar angenommen.
-Code unten, aber hier ist eine Geige https://jsfiddle.net/q8qgbj58/
var n = 243;
var random = d3.randomNormal(0, .2);
var duration = 500;
var now = new Date(Date.now() - duration);
var svg = d3.select("svg"),
margin = {top: 20, right: 20, bottom: 20, left: 40},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom,
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var x = d3.scaleTime()
.domain([now - (n - 2) * duration, now - duration])
.range([0, width]);
var y = d3.scaleLinear()
.domain([-1, 1])
.range([height, 0]);
var lineNames = [];
var lines = {};
var data = {};
var line = d3.line()
.curve(d3.curveBasis)
.x(function(d, i) { return x(now - (n - 1 - i) * duration); })
.y(function(d, i) { return y(d); });
g.append("defs").append("clipPath")
.attr("id", "clip")
.append("rect")
.attr("width", width)
.attr("height", height);
var axis = g.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + y(0) + ")")
.call(d3.axisBottom(x));
g.append("g")
.attr("class", "axis axis--y")
.call(d3.axisLeft(y));
createLine("one");
createLine("two");
d3.selectAll(".line")
.transition()
.duration(duration)
.ease(d3.easeLinear)
.on("start", tick);
function createLine(name) {
lineNames.push(name);
data[name] = d3.range(n).map(random);
lines[name] = d3.line()
.curve(d3.curveBasis)
.x(function(d, i) { return x(now - (n - 1 - i) * duration); })
.y(function(d, i) { return y(d); });
g.append("g")
.attr("clip-path", "url(#clip)")
.append("path")
.datum(data[name])
.attr("class", "line");
}
function tick() {
var index;
var i;
for (i = 0; i < lineNames.length; ++i) {
index = lineNames[i];
// Push a new data point onto the back.
data[index].push(random());
// Redraw the line.
d3.select(this)
.attr("d", lines[index])
.attr("transform", null);
// Pop the old data point off the front.
data[index].shift();
}
now = new Date();
x.domain([now - (n - 2) * duration, now - duration]);
axis.transition()
.duration(duration)
.ease(d3.easeLinear)
.call(d3.axisBottom(x));
// Slide it to the left.
d3.active(this)
.attr("transform", "translate(" + x(now - (n - 1) * duration) + ")")
.transition()
.on("start", tick);
}
Meine anfängliche Neigung ist die Zecke Funktion zweimal aufgerufen wird so oft wie es sollte. Ich könnte mich irren, aber es sieht so aus, als ob die Funktion einmal pro Zeile aufgerufen wird, aber jeder Aufruf wirkt sich auf beide Zeilen aus. Ich hätte erwartet, dass jede Zeile abhebt und nur diese Zeile beeinflusst. Oder ankreuzen, um einmal aufgerufen zu werden und beide Linien zu beeinflussen. –
Ich habe eine Geige hinzugefügt, um das Problem zu zeigen. – SlimCheney