【问题标题】:Filling a line chart with D3.js (v4)使用 D3.js (v4) 填充折线图
【发布时间】:2017-09-27 00:13:03
【问题描述】:

尝试构建折线图,我有以下代码。

var lineGraph = svgContainer.append('path')
    .attr('d', lineFunction(lineData))
    .attr('stroke', 'steelblue')
    .attr('stroke-width', 2)
    .attr('fill', 'red' );

我想尝试将('fill', 'red')替换为仅从行向下填充的填充。知道如何解决这个问题吗?

【问题讨论】:

    标签: javascript html css d3.js svg


    【解决方案1】:

    使用area generator,而不是行生成器...

    ...为给定的数据数组生成一个区域。

    例如,像这样的:

    var areaGenerator = d3.area()
      .x(function(d) {
        return d.x
      })
      .y1(function(d) {
        return d.y
      })
      .y0(function() {
        return someValue
      });
    

    y0 中的someValue 是您所在区域的基地。

    这是一个简单的演示:

    var svg = d3.select("svg");
    
    var data = d3.range(10).map(function(d) {
      return {
        x: d * 30 + 10,
        y: Math.random() * 130 + 10
      }
    });
    
    var areaGenerator = d3.area()
      .x(function(d) {
        return d.x
      })
      .y1(function(d) {
        return d.y
      })
      .y0(function() {
        return 150
      })
      .curve(d3.curveMonotoneX);
    
    var area = svg.append('path')
      .attr('d', areaGenerator(data))
      .attr('stroke', 'steelblue')
      .attr('stroke-width', 2)
      .attr('fill', 'red');
    <script src="//d3js.org/d3.v4.min.js"></script>
    <svg></svg>

    PS:描边(“steelblue”)将围绕所有路径绘制。这可能不是你想要的。在这种情况下,修复方法是创建两条路径:一条您现在拥有的路径,带有钢蓝色笔触,没有填充,以及我在这个答案中显示的区域,没有笔触和红色填充。像这样:

    var svg = d3.select("svg");
    
    var data = d3.range(10).map(function(d) {
      return {
        x: d * 30 + 10,
        y: Math.random() * 130 + 10
      }
    });
    
    var areaGenerator = d3.area()
      .x(function(d) {
        return d.x
      })
      .y1(function(d) {
        return d.y
      })
      .y0(function() {
        return 150
      })
      .curve(d3.curveMonotoneX);
    
    var lineGenerator = d3.area()
      .x(function(d) {
        return d.x
      })
      .y(function(d) {
        return d.y
      })
      .curve(d3.curveMonotoneX);
    
    var area = svg.append('path')
      .attr('d', areaGenerator(data))
      .attr('stroke-width', 2)
      .attr('fill', 'red');
    
    var line = svg.append('path')
      .attr('d', lineGenerator(data))
      .attr('stroke', 'steelblue')
      .attr('stroke-width', 3)
      .attr('fill', 'none');
    <script src="//d3js.org/d3.v4.min.js"></script>
    <svg></svg>

    【讨论】:

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