【问题标题】:Error: <path> attribute d: Expected number, "MNaN,NaNLNaN,NaN"错误:<路径> 属性 d:预期数字,“MNaN,NaNLNaN,NaN”
【发布时间】:2017-10-04 07:38:41
【问题描述】:

我正在尝试使用 D3.js v4 创建一个多折线图。我正在使用这个例子:https://bl.ocks.org/mbostock/3884955

示例 csv 数据:

storageSystem,poolId,availableVolumeCapacity,date
system01,0,18031398,20170413
system01,1,15626268,20170413
system01,2,61256286,20170413
system01,3,119514990,20170413
system02,0,15046668,20170413
system02,1,12486558,20170413
system02,2,12303396,20170413
system03,0,35171335,20170413
system03,1,17263722,20170413
system01,0,18031387,20170414
system01,1,15626257,20170414
system01,2,61256275,20170414
system01,3,119514989,20170414
system02,0,15046657,20170414
system02,1,12486547,20170414
system02,2,12303385,20170414
system03,0,35171324,20170414
system03,1,17263711,20170414

数据对象:

0: Object
  color: "#8c564b"
  key: "system03"
  values: Array(2)
    0: Object
      key: "0"
      values: Array(23)
        0: Object
          availableVolumeCapacity: 35171335
          date: Thu Apr 13 2017 00:00:00 GMT+0000 (Coordinated Universal Time)
          poolId: "0"
          storageSystem: "system03"
    1: Object
      key: "1"
      values: Array(23)
        0: Object
          availableVolumeCapacity: 17263722
          date: Thu Apr 13 2017 00:00:00 GMT+0000 (Coordinated Universal Time)
          poolId:"1"
          storageSystem: "system03"

D3.js 代码:

var svg = d3.select("svg")
    m = {top: 20, right: 20, bottom: 50, left: 20},
    w = svg.attr("width") - m.left - m.right,
    h = svg.attr("height") - m.top - m.bottom,
    g = svg.append("g").attr("transform", "translate(" + m.left + "," + m.top + ")");

var parseTime = d3.timeParse("%Y%m%d");

var x = d3.scaleTime().range([0, w]),
    y = d3.scaleLinear().range([h, 0]),
    z = d3.scaleOrdinal(d3.schemeCategory10);

var line = d3.line()
    .curve(d3.curveBasis)
    .x(function(d) { return x(d.date); })
    .y(function(d) { return y(d.availableVolumeCapacity); });

d3.csv("ssystem.csv", function(error, data) {
    if (error) throw error;
    data.forEach(function(d) {
            d.date = parseTime(d.date);
            d.availableVolumeCapacity = +d.availableVolumeCapacity;
});

x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([0, d3.max(data, function(d) { return d.availableVolumeCapacity; })]);

var dataNest = d3.nest()
    .key(function(d) {return d.storageSystem; })
    .key(function(d) {return d.poolId; })
    .entries(data);

console.log(dataNest)

legendSpace = w/dataNest.length;

dataNest.forEach(function(d,i) {
    svg.append("path")
        .attr("class", "line")
        .style("stroke", function() {
            return d.color = z(d.key); })
        .attr("id", 'tag'+d.key.replace(/\s+/g, ''))
        .attr("d", line(d.values));
    svg.append("text")
        .attr("x", (legendSpace/2)+i*legendSpace)
        .attr("y", h + (m.bottom/2)+ 5)
        .attr("class", "legend")
        .style("fill", function() {
            return d.color = z(d.key); })
        .on("click", function(){
            // Determine if current line is visible
            var active = d.active ? false : true,
            newOpacity = active ? 0 : 1;
            // Hide or show the elements based on the ID
            d3.select("#tag"+d.key.replace(/\s+/g, ''))
                .transition().duration(100)
                .style("opacity", newOpacity);
            // Update whether or not the elements are active
            d.active = active;
            })
        .text(d.key);
});

svg.append("g")
      .attr("class", "axis axis--x")
      .attr("transform", "translate(0," + h + ")")
      .call(d3.axisBottom(x));

svg.append("g")
      .attr("class", "axis axis--y")
      .call(d3.axisLeft(y))
    .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", "0.71em")
      .attr("fill", "#000")
      .text("Capacity (MB)");
});

我从控制台看到以下错误 4 次:

Error: <path> attribute d: Expected number, "MNaN,NaNLNaN,NaN".
(anonymous) @ d3.v4.min.js:205
ul @ d3.v4.min.js:3768
al @ d3.v4.min.js:3775
(anonymous) @ multi-line.js:51
(anonymous) @ multi-line.js:45
(anonymous) @ d3.v4.min.js:5857
call @ d3.v4.min.js:3622
e @ d3.v4.min.js:5840

非常感谢任何帮助。

【问题讨论】:

  • 您使用d3.nest 有什么原因吗?您链接到的示例不使用d3.nest
  • 我贴的例子没有使用嵌套,但是我使用的数据关系需要它。这是一个相关的post,它提供了有关我的数据的更多信息。
  • 好的,谢谢你,但我不是 100% 清楚你想要图表的样子。存储系统和池的每种组合是否应该有一条线?
  • 我试图从每个存储系统中为每个池绘制一条线。例如,“system03”应该有两行 poolId “0”和“1”

标签: javascript d3.js


【解决方案1】:

问题的根源在于传递给dataNest.forEach 的匿名函数中的值d 仍然包含一层嵌套,但您使用它时就好像它没有任何嵌套一样。您的代码失败,因为它正在仅具有 keyvalues 属性的对象上查找 dateavailableVolumeCapacity 属性。

最终有两种方法可以解决此问题:

  1. 使用结合了存储系统和池 ID 的单键功能。这将嵌套减少到只有一层:

    var dataNest = d3.nest()
        .key(function(d) { return d.storageSystem + " " + d.poolId; })
        .entries(data);
    
  2. forEach使用两个嵌套调用:

    dataNest.forEach(function(d2,i2) {
        d2.forEach(function (d,i) {
            svg.append("path")
            // .... rest of inner function omitted
        });
    });
    

    您需要在内部函数(为简洁起见,我省略了它的主体)中对d(特别是d.key)和i 的所有用法进行了检查,以查看是否需要合并d2 和@ 987654334@。例如,也许您想使用d2.key + " " + d.key 而不是d.key

【讨论】:

    【解决方案2】:

    定义路径时:

    svg.append("path")
        .attr("class", "line")
        .style("stroke", function() {
            return d.color = z(d.key); })
        .attr("id", 'tag'+d.key.replace(/\s+/g, ''))
        .attr("d", line(d.values)); // d.values here is not defined
    

    您正在使用教程中提供给您的内容,但dataNest 中的每个项目都没有values 属性。

    【讨论】:

    • 谢谢@chazsolo 我将其更改为.attr("d", line); 并修复了控制台中的错误。现在有一个新问题是图表上的所有线条都重叠。就好像他们都在共享相同的数据。
    • @Clarkus978 嗯,你有没有机会在 jsFiddle 或类似的东西上找到一个工作示例?
    • 嗯,dataNest 中的每个项目确实都有 values 属性。 dataNest 的内容在“数据对象”下的问题中。
    • @LukeWoodward 也许我错过了这一点,但这似乎是最合理的问题,因为d 是定义这条线的东西,而他得到的是 NaN。如果您可以暴露更多问题,请随时解释!
    • @chazsolo:提问者使用了两层嵌套(即在d3.nest 下对.key 的两次调用)。使用dataNest.forEach 可以解开这些级别之一。出现错误是因为 line 函数正在传递数据,但仍然应用了一层嵌套,这不是 xy 函数所期望的。
    猜你喜欢
    • 2021-11-27
    • 2017-11-24
    • 1970-01-01
    • 2019-04-12
    • 2016-09-12
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多