0
この目的は、現在のネットワークのフラッドを示すECG波のチャートを描画し、チャートが左側に遷移し続け、ビューポートでajaxによって取得された新しいデータで再描画することです。D3.jsを使用してトランジション中に以前のパスデータを削除するにはどうすればECG波形図を描画できますか?
しかし、これらのノードがビューポートから移動するときに以前のパスノードを削除する方法はわかりません。
var wrapperWidth = 800;
var wrapperHeight = 400;
var margin = { top: 20, right: 0, bottom: 30, left: 0 },
width = wrapperWidth - margin.left - margin.right,
height = wrapperHeight - margin.top - margin.bottom;
var xAxisScale = 15;
var svg;
var ECG = {
begin: function() {
var list = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
svg = d3.select(".jke-ecgChart").append("svg")
.attr("width", wrapperWidth)
.attr("height", wrapperHeight);
this.sliceData(list);
},
sliceData: function (list) {
var index = 0;
// draw the path that in current viewport
this.drawECG(list.slice(index, 10).map(function(item, index) {
return {
value: item.lTagIndex || 0,
title: item.sTagName || ''
}
}));
// // draw the right part path that will tansition to viewport
//
// index+=10;
// this.drawECG(list.slice(index, index+10).map(function(item, index) {
// return {
// value: item.lTagIndex || 0,
// title: item.sTagName || ''
// }
// }));
},
drawECG: function(data) {
// d3.shuffle(data);
var valueData = [];
// format the data
data.forEach(function(d, index) {
d.index = index;
valueData.push(d.value);
});
var mean = d3.mean(valueData);
var minMax = d3.extent(valueData);
var y = d3.scaleLinear().range([height, 0]);
// define the line
var valueline = d3.line()
.x(function(d) {
return d.index * xAxisScale;
})
.y(function(d) {
return y(d.value - mean);
});
// append the svg obgect to the body of the page
// appends a 'group' element to 'svg'
// moves the 'group' element to the top left margin
var group = svg
.attr("width", wrapperWidth)
.attr("height", wrapperHeight)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
y.domain([(minMax[0] - mean), (minMax[1] - mean)]);
// Add the valueline path.
group.append("path")
.data([data])
.attr("class", "line")
.attr("d", valueline);
var showTextData = data.filter(function (textData, index) {
if (data[index-1] && data[index+1]) {
if(data[index-1].value < textData.value && data[index+1].value < textData.value) {
return true;
}
if(data[index-1].value > textData.value && data[index+1].value > textData.value) {
return true;
}
return false;
}
});
group.transition()
.duration(13000)
.attr("transform", "translate(" + -wrapperWidth + ", 0)")
.style("fill", "red")
.remove();
group.append("g")
.attr("class", "states-names")
.selectAll("text")
.data(showTextData)
.enter()
.append("svg:text")
.text(function(d) {
return d.title;
})
.attr("x", function(d) {
return d.index * xAxisScale;
})
.attr("y", function(d) {
return y(d.value - mean);
})
.attr("text-anchor", "middle")
.attr('fill', 'white');
}
}
お返事ありがとうございます。もう1つの質問は、私は最後のグループの最後のノードを新しく作成されたグループの最初のノードに接続し、それを連続した線のようにしますか? – Aflext
'drawECG'関数で渡すデータごとに線が新たに生成されることを心配しないでください – Cyril
ダイナミックECG波を描きたいので、アニメーションと流動性がポイントですが、やり方は分かりませんそれは – Aflext