【问题标题】:Error: <path> attribute d: Expected number, "M-6,NaNH0.5V20.5H-6"错误:<路径> 属性 d:预期数字,“M-6,NaNH0.5V20.5H-6”
【发布时间】:2021-02-13 00:50:48
【问题描述】:

我正在尝试使用 d3 创建两个折线图,但我不断收到此错误,我不知道如何解决它。折线图应该用 X 轴上的纪元时间和 yAxis(Disk_Free, Memory_Free) 上的健康值制作。我已将数据集值更改为浮点值,但我认为时间值有问题.我对 d3 很陌生,所以任何建议都会有所帮助。

这是我的数据集

[

 {
   Health_id: 1,
   Epoch_Time: 1603959168.903983,
   Disk_Free: '86.2',
   Memory_Free: '1555480576',
   
 },
 {
   Health_id: 2,
   Epoch_Time: 1603959183.331211,
   Disk_Free: '86.2',
   Memory_Free: '1552396288',
   
  },
  {
   Health_id: 3,
   Epoch_Time: 1603959197.5066514,
   Disk_Free: '86.2',
   Memory_Free: '1565560832',
   
},
{
   Health_id: 4,
   Epoch_Time: 1603959211.6641965,
   Disk_Free: '86.2',
   Memory_Free: '1602510848',
  
  },
{
   Health_id: 5,
   Epoch_Time: 1603959225.8478744,
   Disk_Free: '86.2',
   Memory_Free: '1594617856',
   
},
]

我的 d3 行生成代码如下所示

 static getDerivedStateFromProps(nextProps, prevState){
    const { data } = nextProps; //This is where I accept the above dataset and I try creating the line charts with it

    if(!data){
        return {};
    }
    const xScale = d3.scaleTime().range([margin.left,width-margin.right]);
    const yScale = d3.scaleLinear().range([height-margin.botton,margin.top])
    
    //Set Domains on Scales

    const timeDomain = d3.extent(data, d=>(d.Epoch_Time*1000))
    const healthID = d3.extent(data, d=>(d.Health_id))
    xScale.domain(timeDomain)
    yScale.domain(healthID)
    
    //Create and use line generator to plot the line charts

    const lineGenerator = d3.line().x(d=>xScale((d.Epoch_Time*1000)))
    const lines = [

        {
            path:lineGenerator.y((d)=>yScale((d.Disk_Free)))(data)
        },
        {
            path:lineGenerator.y((d)=>yScale((d.Memory_Free)))(data)
        },
       
    ];
    return {lines, xScale, yScale};
}

render(){
    return(
        <div className="main-body">
            <h4 center>Line Chart Test</h4>
            <svg>
                <g>
                    {this.state.lines.map((d,i)=>{
                        if(i===0){
                            return <path d={d.path} fill="none" stroke="red" />
                        }
                        else{
                            return <path d={d.path} fill="none" stroke="blue" />
                        } 
           })}
                </g>
               
            </svg>
        </div>
    )
}}export default Chart;

我在运行网站时没有得到任何折线图,它显示的错误是:

      Error: <path> attribute d: Expected number, 
      "….00000665251144,NaNL35.097628459…".

我的 svg 路径如下所示:

 <path d="M35.00203802950035,NaNL102.09192541055444,NaNL168.70615737356852,NaNL235.2960961666892,NaNL301.9796416583058,NaNL368.6469772068924,NaNL435.1701408263458,NaNL01.790251499806,NaNL568.4943668788065,NaNL635.0026281969162,NaN" fill="none"stroke="red">
</path>

【问题讨论】:

  • 您的 yScale 有问题 - 记录它的域和范围会发现问题。范围是[NaN,someNumber] - 您的边距对象可能没有名为botton 的属性:range([height-margin.botton,margin.top])。不过,考虑到 Memory_Free 值的大小与域相比,一旦比例范围固定,您可能无法获得所需的线。
  • 您能否就如何正确生成一行提出任何建议?就像我说的那样,我对此很陌生,所以我想不出任何替代方案。
  • 好吧,如果您更正范围内的拼写错误(并将字符串转换为如下数字),您至少会得到一个没有 NaNs 的有效行吗?如果是这样,那么这只是设置正确域的问题,这与您遇到的错误是分开的。
  • 是的,我有一条有效的线路,但看不到域。
  • 好 - 现在我们可以查看域。域是 [1,5] - 值 1 将被缩放为等于该范围中的第一个值,值 5 将被缩放为等于该范围中的第二个值。由于您的数据在内存和磁盘的 [1,5] 之外,因此您的线将在您的范围之外绘制。相当大,因为磁盘是规模范围上限的 16 倍左右,而内存要多几个数量级。您可能希望在设置中为每一行设置域,使用不同的比例,域等于d3.extent(data, function(d) { return d.PropertyBeingScaled })

标签: javascript reactjs svg d3.js


【解决方案1】:

您的 Y 值 Disk_FreeMemory_Free 是字符串。您需要先将它们转换为数字,例如parseFloat:

lineGenerator.y((d) => yScale(parseFloat(d.Disk_Free)))(data)

// ...

lineGenerator.y((d) => yScale(parseFloat(d.Memory_Free)))(data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2020-12-27
    • 1970-01-01
    • 2019-05-12
    • 2017-10-04
    • 2021-11-27
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多