You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D3教程中用CSV数据生成气泡图时半径读取失败(报NaN错误)求助

Fixing "Error: attribute r: Expected length, 'NaN'" in D3 Bubble Chart with CSV Data

Hey there! Let's break down why you're hitting this NaN error when trying to render bubble radii from your world-population.csv data, and how to fix it.

Common Causes & Solutions

1. Your CSV population values aren't being parsed as numbers

D3 reads CSV values as strings by default. If your population column has formatted numbers (like 7,800,000,000 with commas) or non-numeric characters, converting them directly to numbers will result in NaN.

Fix:
Either clean your CSV to remove commas/symbols from population values, or parse them explicitly when loading data:

d3.csv("world-population.csv").then(function(data) {
  data.forEach(d => {
    // Remove commas and convert to number
    d.population = +d.population.replace(/,/g, '');
  });
  // Rest of your chart code...
});

2. Mismatched field names between CSV and code

D3 is case-sensitive, so if your CSV header is Pop but you're referencing d.population in your code, you'll get undefined—which becomes NaN when you try to use it for radius.

Fix:
Double-check your CSV's header row. If your population column is named World Population, make sure your code uses d["World Population"] (with quotes for spaces) or rename the header to something simpler like population.

3. You're accessing data before it's loaded

d3.csv is asynchronous—if you try to calculate radii outside the .then() callback, the data hasn't finished loading yet, leading to undefined values.

Fix:
Wrap all data-dependent logic (like drawing circles) inside the .then() block:

// Correct approach
d3.csv("world-population.csv").then(function(data) {
  // Parse data first
  data.forEach(d => d.population = +d.population);
  
  // Now draw bubbles
  svg.selectAll("circle")
    .data(data)
    .enter()
    .append("circle")
    .attr("r", d => Math.sqrt(d.population) / 1000) // Scale radius appropriately
    .attr("cx", d => ...)
    .attr("cy", d => ...);
});

4. Invalid values in your CSV

If your CSV has empty population entries, negative numbers, or non-numeric strings, converting them to numbers will produce NaN.

Fix:
Add a check to handle invalid values in your radius calculation:

.attr("r", d => {
  const pop = +d.population;
  // Return 0 or a default radius if population is invalid
  return pop > 0 ? Math.sqrt(pop) / 1000 : 0;
})

Quick Debugging Tip

Add a console.log(data) inside the .then() callback to inspect your parsed data. Look for population values that are undefined or NaN—this will point you straight to the issue!

内容的提问来源于stack exchange,提问作者jqxz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:35:37