d3js绘制未定义的线图是不可迭代的

问题描述

我正在学习d3js,在创建折线图时需要帮助。我相当成功地绘制了简单的对象和条形图。折线图似乎是要爬的陡峭山丘。

const data = [{
    "LINE1": [
      10,11,12,15
    ]
  },{
    "LINE2": [
      21,22,23,32
    ]
  },{
    "LINE3": [
      11,13,15
    ]
  }
]

// set the dimensions and margins of the graph
var margin = {
    top: 50,right: 100,bottom: 130,left: 120
  },width = 900 - margin.left - margin.right,height = 400 - margin.top - margin.bottom;

// append the svg object to the body of the page
var svg = d3.select("#ca")
  .append("svg")
  .attr("width",width + margin.left + margin.right)
  .attr("height",height + margin.top + margin.bottom)
  .append("g")
  .attr("transform",`translate(${margin.left},${margin.top})`);

// Add X axis
var x = d3.scaleLinear()
  .domain(d3.extent(data,(d) => d.length))
  .range([0,width]);

svg.append("g")
  .attr("transform","translate(0," + height + ")")
  .call(d3.axisBottom(x).ticks(5));

// Add Y axis
// I need help in this area,how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
  .domain([0,d3.max(data,(d) => d.values)])
  .range([height,0]);

svg.append("g")
  .call(d3.axisLeft(y));

// Draw the line
// I need help in this area,how can I get the lines plotted,js gives error in this!
svg.selectAll(".line")
  .data(data)
  .enter()
  .append("path")
  .attr("fill","none")
  .attr("stroke","black")
  .attr("stroke-width",1.5)
  .attr("d",(d) => {
    console.log(d)
    var k = d3.line()
      .x((d) => x(d))
      .y((d) => y(d))
      (d.values);
    console.log(k);
    return k;
  });
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>

如何获取具有现有数据格式的折线图?

解决方法

我已经使您的示例工作了,但是您需要在此处了解几件事:

  1. 您的数据结构非常混乱。如果要将对象数组作为数据,请确保所有对象都具有相同的键。如果您使用[{y: [...]},{y: [...]}]很好,但是[{LINE1: [...]},{LINE2: [...]}]很难使用。我将您的数据更改为更像[[...],[...],[...]]的结构。

  2. 不要为每行创建单独的d3.line,只需创建一次并调用它即可。这是一个行工厂,这意味着它是一个函数,当被调用时,它返回一行。如果不共享,则可能使用不同的域和范围,从而使图表变得困难甚至无用。

  3. 如果函数中的第一个参数为d,则第二个参数为i,即数组中节点的索引。在这种情况下,您可以使用它从x=0开始,然后转到x=3。您使用d来尝试获得该值。

  4. 请记住数据的结构。您一直想访问d.values,但是那根本不存在!

const data = Object.values({
  "LINE1": [
    10,11,12,15
  ],"LINE2": [
    21,22,23,32
  ],"LINE3": [
    11,13,15
  ]
});

var line = d3.line()
  .x((d,i) => x(i))
  .y((d) => y(d));

// set the dimensions and margins of the graph
var margin = {
    top: 50,right: 100,bottom: 130,left: 120
  },width = 900 - margin.left - margin.right,height = 400 - margin.top - margin.bottom;

// append the svg object to the body of the page
var svg = d3.select("#ca")
  .append("svg")
  .attr("width",width + margin.left + margin.right)
  .attr("height",height + margin.top + margin.bottom)
  .append("g")
  .attr("transform",`translate(${margin.left},${margin.top})`);

// Add X axis
var x = d3.scaleLinear()
  .domain([0,d3.max(data,(d) => d.length)])
  .range([0,width]);

svg.append("g")
  .attr("transform","translate(0," + height + ")")
  .call(d3.axisBottom(x).ticks(5));

// Add Y axis
// I need help in this area,how can I get the min and max values set in the domain?
var y = d3.scaleLinear()
  .domain([0,(d) => Math.max(...d))])
  .range([height,0]);

svg.append("g")
  .call(d3.axisLeft(y));

// Draw the line
// I need help in this area,how can I get the lines plotted,js gives error in this!
svg.selectAll(".line")
  .data(data)
  .enter()
  .append("path")
  .attr("fill","none")
  .attr("stroke","black")
  .attr("stroke-width",1.5)
  .attr("d",(d) => line(d));
<div id="ca">
</div>
<script src="https://d3js.org/d3.v6.min.js"></script>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...