【问题标题】:D3js - Creating and easily updating a multi-line chartD3js - 创建和轻松更新多折线图
【发布时间】:2012-12-03 18:58:02
【问题描述】:

我使用 D3 创建了一个小测试折线图,但由于我对库很陌生,我不确定向图表添加多条线的最佳方法是什么,目前我只有一条线显示在此fiddle 中。

我想在图表上显示 2 条线,但我不确定如何在不复制粘贴代码的情况下实现这一点,我相信这会非常低效,因为我想定期更新/动画图表基于关于用户选择。

取而代之的是,

var data = [12345,22345,32345,42345,52345,62345,72345,82345,92345,102345,112345,122345,132345,142345];

我想展示这样的东西,

var data = [
            [12345,42345,3234,22345,72345,62345,32345,92345,52345,22345], // line one
            [1234,4234,3234,2234,7234,6234,3234,9234,5234,2234] // line two
          ];

这可能吗?如果是这样,解决此问题的最佳方法是什么,以便我可以在需要时轻松更新/动画图表?

注意:我只是想学习和熟悉 D3 最佳实践和整个库。谢谢。

【问题讨论】:

    标签: javascript d3.js linechart


    【解决方案1】:

    这是可能的,也是合理的。 有一个教程可以解决这个问题 D3 Nested Selection Tutorial 它描述了数据的嵌套。

    下面是我从你的小提琴中截取的代码来演示这一点。

    var data = [        
    [12345,42345,3234,22345,72345,62345,32345,92345,52345,22345], 
    [1234,4234,3234,2234,7234,6234,3234,9234,5234,2234] 
              ];
    
    var width = 625,
        height = 350;
    
    var x = d3.scale.linear()
        .domain([0,data[0].length])   // Hack. Computing x-domain from 1st array
        .range([0, width]);
    
    var y = d3.scale.linear()
        .domain([0,d3.max(data[0])])  // Hack. Computing y-domain from 1st array
        .range([height, 0]);
    
    var line = d3.svg.line()
        .x(function(d,i) { return x(i); })
        .y(function(d) { return y(d); });
    
    var area = d3.svg.area()
        .x(line.x())
        .y1(line.y())
        .y0(y(0));
    
    var svg = d3.select("body").append("svg")
        //.datum(data)
        .attr("width", width)
        .attr("height", height)
      //.append("g");
    
    var lines = svg.selectAll( "g" )
      .data( data );  // The data here is two arrays
    
    // for each array, create a 'g' line container
    var aLineContainer = lines
      .enter().append("g");  
    
    /*svg.append("path")
        .attr("class", "area")
        .attr("d", area);*/
    
    aLineContainer.append("path")
        .attr("class", "area")
        .attr("d", area);
    
    /*svg.append("path")
        .attr("class", "line")
        .attr("d", line);*/
    
    aLineContainer.append("path")
        .attr("class", "line")
        .attr("d", line);
    
    /*svg.selectAll(".dot")
        .data(data)
      .enter().append("circle")
        .attr("class", "dot")
        .attr("cx", line.x())
        .attr("cy", line.y())
        .attr("r", 3.5);*/
    // Access the nested data, which are values within the array here
    aLineContainer.selectAll(".dot")
      .data( function( d, i ) { return d; } )  // This is the nested data call
      .enter()
        .append("circle")
        .attr("class", "dot")
        .attr("cx", line.x())
        .attr("cy", line.y())
        .attr("r", 3.5);
    ​
    

    一个缺陷是我计算了第一个数组的 x 和 y 轴的域,这是一个 hack,但与您的问题不完全相关。

    【讨论】:

    • 完美!谢谢,现在只是为了创建一个更可重用的函数来更新/动画图表。 :) 我已经达到了可以很容易地更新/动画单行的地步,但是更新这样的图表我还没有弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多