javascript - 使用 d3.js 绑定(bind)数据内的数组(动态生成恒定的 d3.svg.line)

标签 javascript arrays object svg d3.js

我试图(动态)生成一组 div,绑定(bind)到一些数据,每个 div 包含一些文本和一个带有线条的 SVG。

如果我想一次制作一个,这段代码可以工作:

var ccg = [40, 100, 1, 5, 25, 10];

var lineFunction = d3.svg.line()
                      .x(function(d, i) { return width-(i*10); })
                      .y(function(d, i) { return height-d; })

var myContainer = d3.select("body").append("div")

var svgContainer = myContainer.append("svg")
                                 .attr("width", "10px")
                                 .attr("height", "10px");

var correlogram = svgContainer.append("path")
                         .attr("d", lineFunction(ccg))

到目前为止一切顺利。现在我想更新一个数据数组并让它动态地更新 DOM:

var width=100,
    height=100;

var clusters = [
{id: "1",
    ccg: [40, 100, 1, 5, 25, 10] },
{id: "2", 
    ccg: [41, 101, 11, 51, 21, 11] },
{id: "3", 
    ccg: [42, 130, 13, 53, 21, 101] },
]

var lineFunction = d3.svg.line()
                    .x(function(d, i) { return width-(i*10); })
                    .y(function(d, i) { return height-d; })
                    .interpolate("step-after");

var clusterView = d3.select("body").append("div")

var clusterDivs = clusterView.selectAll(".cluster")
                        .data(clusters, function(d) {return d.id});

var cluster = clusterDivs.enter()
                        .insert("div", ".cluster")

var lineFunction = d3.svg.line()
                     .x(function(d, i) { return width-(i*10); })
                     .y(function(d, i) { return height-d; })
                     .interpolate("step-after");

var svgContainer = cluster.append("svg")
                    .attr("width", width)
                    .attr("height", height);


svgContainer.append("path")
.data(function (d) {return d.ccg;})
.enter()
.attr("d", function(d) {return lineFunction(d)})

cluster.append("div")
    .text(function(d) { return d.id; });

...我收到错误。 “类型错误:无法读取未定义的属性‘ccg’”

我尝试了各种方法:将函数直接放入 .attr 似乎“有效”,只是它不返回该属性的任何输出。

基本上,给定输入数组:如何从每个子数组ccg生成不同的行?我已经阅读了有关嵌套选择的教程,但不确定它是否真正回答了我的问题,因为您无法将每个线顶点绑定(bind)到数据点...

最佳答案

参见http://jsfiddle.net/henbox/9my6Lznc/

替换:

svgContainer.append("path")
  .data(function (d) {return d.ccg;})
  .enter()
  .attr("d", function(d) {return lineFunction(d)})

与:

svgContainer.append("path")
  .datum(function (d) {return d.ccg;})
  .attr("d", function(d) {return lineFunction(d)})

data切换为datum并摆脱enter()。有关 datadatum 之间差异的更多讨论,请参阅:https://stackoverflow.com/a/13728584/3442309 .

data 连接一个数组,而您有对象(例如 {id: "2", ccg: Array[6]})

关于javascript - 使用 d3.js 绑定(bind)数据内的数组(动态生成恒定的 d3.svg.line),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408956/

相关文章:

r - 如何在 R 中创建对象名称

javascript - div幻灯片效果

javascript - 如何在不刷新页面的情况下重新加载 Grocery 网格

javascript - 根据键将一个数组嵌套到另一个数组中

java - 从对象数量中获取平均值

javascript - 在 Mongoose 中定义变体类型

javascript - 使用 setTimeout 来解决或拒绝 promise

javascript - Instagram OAuthException : you must provide a client_id 错误

java - 不同数组之间切换的算子,内部更精准

arrays - 从数组中删除第 i 个元素,因此时间复杂度不依赖于数组大小