【问题标题】:D3.js TreeMap - Error: <rect> attribute width: Expected length, "NaN"D3.js TreeMap - 错误:<rect> 属性宽度:预期长度,“NaN”
【发布时间】:2017-08-02 16:51:38
【问题描述】:

我正在尝试在 ReactJS 中的 D3 中创建树形图,下面是我的代码,我收到此错误但不知道原因:

错误:属性宽度:预期长度,“NaN”。

    const chart = d3.select(this.node)

    const treeMap = d3.treemap()
        .size(this.state.width, this.state.height)

    d3.json("treemap.json", (error, data) => {
        if (error) throw error;
        console.log(data)
        const root = d3.hierarchy(data)
            .sum((d) => { return d.size })

        treeMap(root);
        console.log(root)

        const cell = chart.selectAll("g")
            .data(root.leaves())
            .enter()
            .append("g")

        cell.append("rect")
            .attr("id", (d) => { return d.data.id; })
            .attr("width", (d) => { return d.x1 - d.x0; })
            .attr("height", (d) => { return d.y1 - d.y0; })

任何帮助将不胜感激。谢谢!

编辑:我的 json 见下文

 {
                "Skill": "General", "children": [
                    {
                        "Skill": "Dev", "count": 24, "children": [
                            { "Skill": "Java", "count": 13 },
                            { "Skill": "Javascript", "count": 6 },
                            { "Skill": "Analytics", "count": 5 }
                        ]
                    },
                    {
                        "Skill": "Functional", "count": 11, "children": [
                            { "Skill": "Business Analysis", "count": 7 },
                            { "Skill": "PMO", "count": 1 },
                            { "Skill": "Agile", "count": 3 }
                        ]
                    }

                ]
            }

【问题讨论】:

  • 你把这段代码放在哪里?
  • 您确定x1x0 是数值并且它们存在于root.leaves() 中的每个对象吗?
  • @SimonBilsky-Rollins x0 是 0,x1 是 NaN,所以我猜那是错误的。我以为它们应该是自动设置的?我如何确保它们是正确的值?对不起,如果这是一个愚蠢的问题,我是一个字面上的初学者
  • 可以看到你的json吗?
  • @AndrewReid 用 json 编辑了主帖

标签: javascript reactjs d3.js web


【解决方案1】:

两个潜在问题:

一,你的尺码没有指定正确:

   const treeMap = d3.treemap()
        .size(this.state.width, this.state.height)

这应该是一个数组:.size([width,height])

并且,根据您的数据,这里总结了什么:

const root = d3.hierarchy(data)
    .sum((d) => { return d.size })

我相信您正在尝试求和 d.count,而不是未定义的 d.size(请参阅运行此函数时的 console.log 语句)。总之,这给出了:

var data =  { "Skill": "General", "children": [{
  "Skill": "Dev", "count": 24, "children": [
    { "Skill": "Java", "count": 13 },
    { "Skill": "Javascript", "count": 6 },
    { "Skill": "Analytics", "count": 5 }
   ]
  },
  { "Skill": "Functional", "count": 11, "children": [
    { "Skill": "Business Analysis", "count": 7 },
    { "Skill": "PMO", "count": 1 },
    { "Skill": "Agile", "count": 3 }
  ]
 }
]
};

var width = 400; var height = 200;

var chart = d3.select("body")
  .append("svg")
  .attr("width",width)
  .attr("height",height);

const treeMap = d3.treemap()
  .size([width, height])

const root = d3.hierarchy(data)
  .sum((d) => { console.log(d); return d.count })

treeMap(root);


const cell = chart.selectAll("g")
  .data(root.leaves())
  .enter()
  .append("g")
  
color = d3.schemeCategory20;

cell.append("rect")
  .attr("id", (d) => { return d.data.id; })
  .attr("fill", (d,i) => { return color[i%20]; })
  .attr("width", (d) => { return d.x1 - d.x0; })
  .attr("height", (d) => { return d.y1 - d.y0; })
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 啊,就是这样,非常感谢,我错过了那些小东西很烦人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2019-04-21
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多