【问题标题】:d3js plotting linecharts undefined is not iterabled3js 绘制未定义的折线图是不可迭代的
【发布时间】:2020-09-14 21:42:27
【问题描述】:

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

const data = [{
    "LINE1": [
      10,
      11,
      12,
      15
    ]
  },
  {
    "LINE2": [
      21,
      22,
      23,
      32
    ]
  },
  {
    "LINE3": [
      11,
      12,
      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>

我怎样才能用我拥有的数据格式绘制折线图?

【问题讨论】:

    标签: d3.js linechart


    【解决方案1】:

    我已经完成了您的示例,但您需要了解以下几点:

    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,
        12,
        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, d3.max(data, (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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2020-03-21
      相关资源
      最近更新 更多