【问题标题】:Nested arrays in JSON with D3使用 D3 在 JSON 中嵌套数组
【发布时间】:2017-07-30 22:53:53
【问题描述】:

我是 d3js 的新手,正在尝试从嵌套在 JSON 中的数组中绘制一条线。已经提出了关于该主题的几个问题,但他们的解决方案不适用于我的具体问题(也许只是我是一个完全的新手)。

有问题的 JSON 文件 (json_data.json) 是这样的:

{"Test": 1, 
 "Name": "SampleA", 
 "Voltage": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1], 
 "Current": [-0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5]}

“电压”和“电流”是我想用这个 js 绘制的 x 和 y 值:

var margin = {top: 50, right: 50, bottom: 50, left: 50},
    width = 800 - margin.left - margin.right,
    height = 600 - margin.top - margin.bottom;

var xScale = d3.scaleLinear().range([0, width]);
var yScale = d3.scaleLinear().range([height, 0]);

var xAxis = d3.axisBottom().scale(xScale);
var yAxis = d3.axisLeft().scale(yScale);

var line = d3.line()
    .x(function(d,i){return d.Voltage[i]; } )
    .y(function(d,i){return d.Current[i]; } );

var svg = d3.select("body")
    .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 + ")");

d3.json("json_data.json", function(data) {

xScale.domain(d3.extent(data.Voltage));
yScale.domain(d3.extent(data.Current));

svg.append("path")     
    .attr("d", line(data))

svg.append("g")       
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);

svg.append("g")        
    .attr("class", "y axis")
    .call(yAxis);

});

问题是由于某种原因折线图没有显示。轴以正确的比例显示,这让我认为 line() 生成器一定有问题。当我运行 console.log 时会显示 JSON 和嵌套数组。

非常感谢您的帮助!如果您对如何改进我的代码或 JSON 结构有任何建议,我正在倾听 :) 非常感谢!

【问题讨论】:

    标签: javascript arrays json d3.js


    【解决方案1】:

    d3.line "为给定的数据数组生成一行" (https://github.com/d3/d3-shape#_line)。

    所以我会创建一个点数组,例如:

    let lineData = []
    let lineDataLength = data.Voltage.length;
    
    for (var i = 0; i < lineDataLength; i++) {
          let point = {};
          point.x = data.Voltage[i];
          point.y = data.Current[i];
          lineData.push(point);
    };
    

    那么对于线生成器简化为:

    var line = d3.line()
        .x(function(d,i){return xScale(d.x); } )
        .y(function(d,i){return yScale(d.y); } );
    

    【讨论】:

    • 这为我修好了,非常感谢!我的计划是构建一个包含许多样本的更大的 JSON 文件,在这种情况下,我需要在同一个图中绘制多条线。您会为每条线创建一个点数组,还是以不同的方式构建 JSON 数组?
    • 在 Stackoverflow 评论中需要考虑的内容更多。对我来说,我能做的客户端越少越好,尤其是当数据集变大时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2015-12-06
    相关资源
    最近更新 更多