D3 Chart范围SafeZone

时间:2016-10-28 13:00:02

标签: javascript css html5 d3.js svg

我目前有一个简单的D3图表。 enter image description here

我想要的只是在图表中有一个范围框。基本上是半透明的。

想象一下,如果灰色框内是半透明的。

enter image description here

来源:

<script>

var configuration = {"xtitle":"X"};

var margin = {top: 20, right: 20, bottom: 30, left: 50},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var parseDate = d3.time.format("%Y%m%d").parse;

var x = d3.time.scale()
    .range([0, width]);

var y = d3.scale.linear()
    .range([height, 0]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left");

var line = d3.svg.line()
    .interpolate("basis")
    .x(function(d) { return x(d.x); })
    .y(function(d) { return y(d.y); });

var line2 = d3.svg.line()
        .interpolate("basis")
        .x(function(d) { return x(d.x); })
        .y(function(d) { return y(d.y); });

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("data.json", function(error, data) {
  if (error) throw error;

  data.forEach(function(d) {
    d.x = parseDate(d.x);
    d.y = d.y;
  });

  x.domain([data[0].x, data[data.length - 1].x]);
  y.domain(d3.extent(data, function(d) { return d.y; }));

  var meanx = [{x:parseDate("20111001"),y:25},{x:parseDate("20111002"),y:60},{x:parseDate("20111003"),y:25}];

  svg.append("linearGradient")
      .attr("id", "temperature-gradient")
      .attr("gradientUnits", "userSpaceOnUse")
      .attr("x1", 0).attr("y1", y(50))
      .attr("x2", 0).attr("y2", y(60))
    .selectAll("stop")
      .data([
        {offset: "0%", color: "green"},
        {offset: "50%", color: "gray"},
        {offset: "100%", color: "red"}
      ])
    .enter().append("stop")
      .attr("offset", function(d) { return d.offset; })
      .attr("stop-color", function(d) { return d.color; });

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

  svg.append("g")
      .attr("class", "y axis")
      .call(yAxis)
    .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", ".71em")
      .style("text-anchor", "end")
      .text(configuration.xtitle);

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

  svg.append("path")
      .datum(meanx)
      .attr("class", "line")
      .attr("d", line);

  svg.append('path')
    .attr('class', 'area upper outer')
    .attr('d', upperOuterArea)
    .attr('clip-path', 'url(#rect-clip)');

  svg.append("path")
    .attr("class","box")
    .attr("x1",0).attr("y1",20)
    .attr("x2",0).attr("y2",50);
});

</script>

1 个答案:

答案 0 :(得分:1)

在脚本的最底部,添加一个矩形:

svg.append("rect").attr("x", 0)
    .attr("y", y(45))
    .attr("width", width)
    .attr("height", y(25) - y(45))
    .attr("fill", "white")
    .attr("opacity", 0.6);

在y轴上从45到25。矩形为白色,其不透明度会改变其后面线条的外观。