gpt4 book ai didi

javascript - 在简单的可重用 D3 图表中更新数据

转载 作者:行者123 更新时间:2023-12-03 10:35:49 24 4
gpt4 key购买 nike

在“Data Visualization with D3 Cookbook”一书中(第 8 章)出现了作者绘制两条线的示例。基本上,数据是随机创建的:

var numberOfSeries = 2,
numberOfDataPoint = 11,
data = [];

for (var i = 0; i < numberOfSeries; ++i)
data.push(d3.range(numberOfDataPoint).map(function (i) {
return {x: i, y: randomData()};
}));

然后,作者创建图表的实例并定义尺度的域:

var chart = lineChart()
.x(d3.scale.linear().domain([0, 10]))
.y(d3.scale.linear().domain([0, 10]));

之后,使用addSeries()方法引入数据:

data.forEach(function (series) {
chart.addSeries(series);
});

最后,调用 render() 方法渲染图表:

chart.render();

此外,该图还有一个更新按钮,允许通过调用此函数来更新显示的数据:

function update() {
for (var i = 0; i < data.length; ++i) {
var series = data[i];
series.length = 0;
for (var j = 0; j < numberOfDataPoint; ++j)
series.push({x: j, y: randomData()});
}

chart.render();
}

我的问题是,在按更新后,如果不再次调用addSeries()方法,我无法理解数据如何在图中更新 按钮,即在 update() 函数中。数据内部存储在变量_data中,可以使用addSeries()方法对其进行修改。有什么想法吗?

非常感谢!

完整代码为here ,但下面我复制了最重要的部分:

function lineChart() { // <-1A
var _chart = {};

var _width = 600, _height = 300, // <-1B
_margins = {top: 30, left: 30, right: 30, bottom: 30},
_x, _y,
_data = [],
_colors = d3.scale.category10(),
_svg,
_bodyG,
_line;

_chart.render = function () { // <-2A
if (!_svg) {
_svg = d3.select("body").append("svg") // <-2B
.attr("height", _height)
.attr("width", _width);

renderAxes(_svg);

defineBodyClip(_svg);
}

renderBody(_svg);
};

// Axis rendering functions ...


function renderBody(svg) { // <-2D
if (!_bodyG)
_bodyG = svg.append("g")
.attr("class", "body")
.attr("transform", "translate("
+ xStart() + ","
+ yEnd() + ")") // <-2E
.attr("clip-path", "url(#body-clip)");

renderLines();

}

function renderLines() {
_line = d3.svg.line() //<-4A
.x(function (d) { return _x(d.x); })
.y(function (d) { return _y(d.y); });

_bodyG.selectAll("path.line")
.data(_data)
.enter() //<-4B
.append("path")
.style("stroke", function (d, i) {
return _colors(i); //<-4C
})
.attr("class", "line");

_bodyG.selectAll("path.line")
.data(_data)
.transition() //<-4D
.attr("d", function (d) { return _line(d); });
}

//Some getter/setters functions and other stuff

_chart.addSeries = function (series) { // <-1D
_data.push(series);
return _chart;
};

return _chart; // <-1E
}

function randomData() {
return Math.random() * 9;
}

function update() {
for (var i = 0; i < data.length; ++i) {
var series = data[i];
series.length = 0;
for (var j = 0; j < numberOfDataPoint; ++j)
series.push({x: j, y: randomData()});
}

chart.render();
}

var numberOfSeries = 2,
numberOfDataPoint = 11,
data = [];

for (var i = 0; i < numberOfSeries; ++i)
data.push(d3.range(numberOfDataPoint).map(function (i) {
return {x: i, y: randomData()};
}));

var chart = lineChart()
.x(d3.scale.linear().domain([0, 10]))
.y(d3.scale.linear().domain([0, 10]));

data.forEach(function (series) {
chart.addSeries(series);
});

chart.render();

最佳答案

update() 函数正在就地修改每个系列,该修改由 render() 函数自动获取。这是可行的,因为闭包存储了对系列(已修改)的引用,而不是实际值。

所发生的情况与修改全局变量时相同。 addSeries() 函数添加一个新系列,但在这种特殊情况下,您不会添加任何新系列,而是修改现有系列。

也就是说,我不认为代码设计得特别好。

关于javascript - 在简单的可重用 D3 图表中更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994900/

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