【问题标题】:D3 data undefined when attempting nested selection尝试嵌套选择时未定义 D3 数据
【发布时间】:2013-10-24 22:48:03
【问题描述】:

我在处理 D3 中的 json 数据时遇到问题。从我console.log 时出现的事实来看,该文件已正确读取,并且似乎根据我找到的所有示例的方式正确格式化。但是,当我尝试使用.data(function(json_data){return json_data.accessibility;}) 进行嵌套选择时,我得到:“无法读取未定义的属性'长度'”。

我的功能:

//load scenario json data
d3.json("./SupportTool/scenario1result.json", function(error, json_data){
if(error) {return console.warn(error)};
console.log(json_data); //works

// add main SVG block
var svg = d3.select(d3id)
    .append('svg')
    .attr('width', 300)
    .attr('height', 75)
    .attr('id', 'svgblock');

// add an SVG group element for each scenario
var series = svg.selectAll('g.series')
    .data(d3.keys(json_data))
    .enter()
    .append('g')
    .attr('class', 'series');

var circles = series.selectAll("circle")
    .data(function(json_data){return json_data.accessibility;})
    .enter()
    .append("circle");
var circleAttributes = circles
    .attr("cx", 20)
    .attr("cy", 20)
    .attr("r", 20)
    .style("color","blue");       });

我的 json 数据:

{
"meta":[{"sc":"1"},{"stratid":"1"}],

"accessibility":[
    {"pop400":"77"},{"pop800":"86"},{"jobs800":"78"},{"pop400tr":"41"},{"pop800tr":"69"},{"jobs800tr":"80"}
],

"housing":[
    {"newcom":"0"},{"redev":"100"},
    {"apt5":"6"},{"apt4":"65"},{"twn":"14"},{"sglf":"15"},

    {"urb":"0"},{"urbhec":"0"}

],

"transport":[

    {"walk":"55"},{"transit":"18"},{"auto":"27"},
    {"vkt":"11000"},

    {"kmtr":"502"},{"form":"grid"},
    {"lanekm":"3250"},

    {"ghgtr":"67"},{"ghgres":"75"}
],

"costs":[
    {"roadcapbils":null,"roadcap":null},
    {"transitcapbils":null,"transitcap":null},
    {"watercapbils":null,"watercap":null},
    {"firecapbils":null,"firecap":null},
    {"reccapbils":null,"reccap":null},
    {"educapbils":null,"educap":null}
],

"opcosts":[
    {"roadopbils":null,"roadop":null},
    {"transitoppbils":null,"transitop":null},
    {"wateropbils":null,"waterop":null},
    {"fireopbils":null,"fireop":null},
    {"parksopbils":null,"parksop":null}
] }    

【问题讨论】:

    标签: javascript json d3.js


    【解决方案1】:

    您遇到的问题来自于您使用已绑定到series 的数据的函数将数据绑定到circles

    var circles = series.selectAll("circle")
    

    series 已经有来自.data(d3.keys(json_data)) 的数据绑定到它。因此,当您将传递给.data() 的对象一次一个地记录到circles 时,您只需获得json_data 的键,即

    ["meta", "accessibility", "housing", "transport", "costs", "opcosts"]
    

    由于这是一个字符串列表,它们没有任何名为 accessibility 的属性,因此您的错误。

    我的猜测是您正在尝试为 json_data.accessibility 中的每个项目附加圆圈,如果您只是将该行替换为,您的代码就会这样做

    .data(json_data.accessibility)
    

    会通过的

    [{"pop400":"77"},{"pop800":"86"},{"jobs800":"78"},{"pop400tr":"41"},{"pop800tr":"69"},{"jobs800tr":"80"}]
    

    data。此代码在我的机器上运行,并在页面上绘制了六个圆圈。

    最后一点是你应该小心你的变量名。在传递给数据的函数中,您将 json_data 重新定义为该函数中的局部变量,这意味着您无法在该函数中访问您的实际 JSON 数据。

    【讨论】:

    • 谢谢!当我用var circles = svg.selectAll("circle") .data(json_data.accessibility) .enter() .append("circle"); 替换整个系列并圈出块时效果很好
    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多