使用 D3.js 填充折线图 (v4)

Jor*_*one 2 html javascript css svg d3.js

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

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

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

Ger*_*ado 5

使用区域生成器代替线生成器,它...

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

例如,这样的事情:

var areaGenerator = d3.area()
  .x(function(d) {
    return d.x
  })
  .y1(function(d) {
    return d.y
  })
  .y0(function() {
    return someValue
  });
Run Code Online (Sandbox Code Playgroud)

其中someValueiny0是您所在区域的基地。

这是一个简单的演示:

var areaGenerator = d3.area()
  .x(function(d) {
    return d.x
  })
  .y1(function(d) {
    return d.y
  })
  .y0(function() {
    return someValue
  });
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)

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

<script src="//d3js.org/d3.v4.min.js"></script>
<svg></svg>
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)