d3更新具有最大区域值的路径

时间:2016-11-01 09:49:10

标签: d3.js

我显示d3.area()。为了显示最高值,我在数据集的最大值处绘制了一条带有d3.line()的水平线。该值使用以下公式计算:

var max_out = d3.max(data, function(d){ return +d.out; });

要浏览图表,我使用此example中的设置:

一旦区域被刷,我也想移动"最大线"上下反映新域而不是使用整个数据集。

任何指针?

2 个答案:

答案 0 :(得分:3)

让我们有一个行函数定义,第一次只定义x属性:

var line = d3.line()
    .x(function(d) { return x(d.date); });

在主视图中追加您的区域后,添加另一个path,用于在相应区域上方绘制水平线:

  focus.append("path")
    .attr("class", "line");

请注意,我正在为它设置line样式。

我们还要画线,首先只使用您当前使用的功能来确定数据的峰值:

.attr("d", line.y(function () {
    return y(max);
}));

...并为我们的线路生成器提供正确的数据:)

.datum(data)

总结一下,这是我们在初始化时得到的:

  // There's your main view's data area
  focus.append("path")
      .datum(data)
      .attr("class", "area")
      .attr("d", area);

  // There's your 'peak' horizontal line
  var max = d3.max(data, function(d){ return d.price; });
  focus.append("path")
    .datum(data)
    .attr("class", "line")
    .attr("d", line.y(function () {
        return y(max);
    }));

在触发重新绘制元素的功能中,您只需更新d元素的path.line属性。

我们将简单地执行以下操作:

  1. 过滤掉不在x轴更新范围内的数据点
  2. 评估该子集的最大值(使用您描述的方法)
  3. 让D3为d属性生成新值并进行设置。
  4. 这转化为以下内容:

      var lo = x.domain()[0],
          hi = x.domain()[1];
    
      var max = d3.max(data.filter(function (d) {
        return d.date.getTime() >= lo && d.date.getTime() <= hi;
      }), function(d){ return d.price; });
    
      focus.select(".line").attr("d", line.y(function () {
        return y(max);
      }));
    

    请参阅下面的代码段中的示例或on JSFiddle

    var svg = d3.select("svg"),
        margin = {top: 20, right: 20, bottom: 110, left: 40},
        margin2 = {top: 180, right: 20, bottom: 30, left: 40},
        width = +svg.attr("width") - margin.left - margin.right,
        height = +svg.attr("height") - margin.top - margin.bottom,
        height2 = +svg.attr("height") - margin2.top - margin2.bottom;
    
    var x = d3.scaleTime().range([0, width]),
        x2 = d3.scaleTime().range([0, width]),
        y = d3.scaleLinear().range([height, 0]),
        y2 = d3.scaleLinear().range([height2, 0]);
    
    var xAxis = d3.axisBottom(x),
        xAxis2 = d3.axisBottom(x2),
        yAxis = d3.axisLeft(y);
    
    var brush = d3.brushX()
        .extent([[0, 0], [width, height2]])
        .on("brush end", brushed);
    
    var zoom = d3.zoom()
        .scaleExtent([1, Infinity])
        .translateExtent([[0, 0], [width, height]])
        .extent([[0, 0], [width, height]])
        .on("zoom", zoomed);
    
    var area = d3.area()
        .x(function(d) { return x(d.date); })
        .y0(height)
        .y1(function(d) { return y(d.price); });
    
    var area2 = d3.area()
        .x(function(d) { return x2(d.date); })
        .y0(height2)
        .y1(function(d) { return y2(d.price); });
        
    var line = d3.line()
        .x(function(d) { return x(d.date); });
    
    svg.append("defs").append("clipPath")
        .attr("id", "clip")
    	  .append("rect")
        .attr("width", width)
        .attr("height", height);
    
    var focus = svg.append("g")
        .attr("class", "focus")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    
    var context = svg.append("g")
        .attr("class", "context")
        .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")");
        
    var data;
    
    (function (_data) {
    	data = _data;
      data.forEach(function (d) {
      	d.date = new Date(d.date);
      });
    	
      data = (function uniqBy(a, key) {
        var seen = {};
        return a.filter(function(item) {
            var k = key(item);
            return seen.hasOwnProperty(k) ? false : (seen[k] = true);
        });
    	})(data, function (d) {return d.date;});
      
      data.sort(function(a,b) { 
        return new Date(a.date).getTime() - new Date(b.date).getTime();
    	});
    
      x.domain(d3.extent(data, function(d) { return d.date; }));
      y.domain([0, d3.max(data, function(d) { return d.price; })]);
      x2.domain(x.domain());
      y2.domain(y.domain());
    
      focus.append("path")
          .datum(data)
          .attr("class", "area")
          .attr("d", area);
          
      var max = d3.max(data, function(d){ return d.price; });
      focus.append("path")
        .datum(data)
        .attr("class", "line")
        .attr("d", line.y(function () {
        	return y(max);
        }));
      
      focus.append("g")
          .attr("class", "axis axis--x")
          .attr("transform", "translate(0," + height + ")")
          .call(xAxis);
    
      focus.append("g")
          .attr("class", "axis axis--y")
          .call(yAxis);
    
      context.append("path")
          .datum(data)
          .attr("class", "area")
          .attr("d", area2);
    
      context.append("g")
          .attr("class", "axis axis--x")
          .attr("transform", "translate(0," + height2 + ")")
          .call(xAxis2);
    
      context.append("g")
          .attr("class", "brush")
          .call(brush)
          .call(brush.move, x.range());
    
      svg.append("rect")
          .attr("class", "zoom")
          .attr("width", width)
          .attr("height", height)
          .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
          .call(zoom);
    })([{"date":"1999-12-31T23:00:00.000Z","price":1394.46},{"date":"2000-01-31T23:00:00.000Z","price":1366.42},{"date":"2000-02-29T23:00:00.000Z","price":1498.58},{"date":"2000-03-31T22:00:00.000Z","price":1452.43},{"date":"2000-04-30T22:00:00.000Z","price":1420.6},{"date":"2000-05-31T22:00:00.000Z","price":1454.6},{"date":"2000-06-30T22:00:00.000Z","price":1430.83},{"date":"2000-07-31T22:00:00.000Z","price":1517.68},{"date":"2000-08-31T22:00:00.000Z","price":1436.51},{"date":"2000-09-30T22:00:00.000Z","price":1429.4},{"date":"2000-10-31T23:00:00.000Z","price":1314.95},{"date":"2000-11-30T23:00:00.000Z","price":1320.28},{"date":"2000-12-31T23:00:00.000Z","price":1366.01},{"date":"2001-01-31T23:00:00.000Z","price":1239.94},{"date":"2001-02-28T23:00:00.000Z","price":1160.33},{"date":"2001-03-31T22:00:00.000Z","price":1249.46},{"date":"2001-04-30T22:00:00.000Z","price":1255.82},{"date":"2001-05-31T22:00:00.000Z","price":1224.38},{"date":"2001-06-30T22:00:00.000Z","price":1211.23},{"date":"2001-07-31T22:00:00.000Z","price":1133.58},{"date":"2001-08-31T22:00:00.000Z","price":1040.94},{"date":"2001-09-30T22:00:00.000Z","price":1059.78},{"date":"2001-10-31T23:00:00.000Z","price":1139.45},{"date":"2001-11-30T23:00:00.000Z","price":1148.08},{"date":"2001-12-31T23:00:00.000Z","price":1130.2},{"date":"2002-01-31T23:00:00.000Z","price":1106.73},{"date":"2002-02-28T23:00:00.000Z","price":1147.39},{"date":"2002-03-31T22:00:00.000Z","price":1076.92},{"date":"2002-04-30T22:00:00.000Z","price":1067.14},{"date":"2002-05-31T22:00:00.000Z","price":989.82},{"date":"2002-06-30T22:00:00.000Z","price":911.62},{"date":"2002-07-31T22:00:00.000Z","price":916.07},{"date":"2002-08-31T22:00:00.000Z","price":815.28},{"date":"2002-09-30T22:00:00.000Z","price":885.76},{"date":"2002-10-31T23:00:00.000Z","price":936.31},{"date":"2002-11-30T23:00:00.000Z","price":879.82},{"date":"2002-12-31T23:00:00.000Z","price":855.7},{"date":"2003-01-31T23:00:00.000Z","price":841.15},{"date":"2003-02-28T23:00:00.000Z","price":848.18},{"date":"2003-03-31T22:00:00.000Z","price":916.92},{"date":"2003-04-30T22:00:00.000Z","price":963.59},{"date":"2003-05-31T22:00:00.000Z","price":974.5},{"date":"2003-06-30T22:00:00.000Z","price":990.31},{"date":"2003-07-31T22:00:00.000Z","price":1008.01},{"date":"2003-08-31T22:00:00.000Z","price":995.97},{"date":"2003-09-30T22:00:00.000Z","price":1050.71},{"date":"2003-10-31T23:00:00.000Z","price":1058.2},{"date":"2003-11-30T23:00:00.000Z","price":1111.92},{"date":"2003-12-31T23:00:00.000Z","price":1131.13},{"date":"2004-01-31T23:00:00.000Z","price":1144.94},{"date":"2004-02-29T23:00:00.000Z","price":1126.21},{"date":"2004-03-31T22:00:00.000Z","price":1107.3},{"date":"2004-04-30T22:00:00.000Z","price":1120.68},{"date":"2004-05-31T22:00:00.000Z","price":1140.84},{"date":"2004-06-30T22:00:00.000Z","price":1101.72},{"date":"2004-07-31T22:00:00.000Z","price":1104.24},{"date":"2004-08-31T22:00:00.000Z","price":1114.58},{"date":"2004-09-30T22:00:00.000Z","price":1130.2},{"date":"2004-10-31T23:00:00.000Z","price":1173.82},{"date":"2004-11-30T23:00:00.000Z","price":1211.92},{"date":"2004-12-31T23:00:00.000Z","price":1181.27},{"date":"2005-01-31T23:00:00.000Z","price":1203.6},{"date":"2005-02-28T23:00:00.000Z","price":1180.59},{"date":"2005-03-31T22:00:00.000Z","price":1156.85},{"date":"2005-04-30T22:00:00.000Z","price":1191.5},{"date":"2005-05-31T22:00:00.000Z","price":1191.33},{"date":"2005-06-30T22:00:00.000Z","price":1234.18},{"date":"2005-07-31T22:00:00.000Z","price":1220.33},{"date":"2005-08-31T22:00:00.000Z","price":1228.81},{"date":"2005-09-30T22:00:00.000Z","price":1207.01},{"date":"2005-10-31T23:00:00.000Z","price":1249.48},{"date":"2005-11-30T23:00:00.000Z","price":1248.29},{"date":"2005-12-31T23:00:00.000Z","price":1280.08},{"date":"2006-01-31T23:00:00.000Z","price":1280.66},{"date":"2006-02-28T23:00:00.000Z","price":1294.87},{"date":"2006-03-31T22:00:00.000Z","price":1310.61},{"date":"2006-04-30T22:00:00.000Z","price":1270.09},{"date":"2006-05-31T22:00:00.000Z","price":1270.2},{"date":"2006-06-30T22:00:00.000Z","price":1276.66},{"date":"2006-07-31T22:00:00.000Z","price":1303.82},{"date":"2006-08-31T22:00:00.000Z","price":1335.85},{"date":"2006-09-30T22:00:00.000Z","price":1377.94},{"date":"2006-10-31T23:00:00.000Z","price":1400.63},{"date":"2006-11-30T23:00:00.000Z","price":1418.3},{"date":"2006-12-31T23:00:00.000Z","price":1438.24},{"date":"2007-01-31T23:00:00.000Z","price":1406.82},{"date":"2007-02-28T23:00:00.000Z","price":1420.86},{"date":"2007-03-31T22:00:00.000Z","price":1482.37},{"date":"2007-04-30T22:00:00.000Z","price":1530.62},{"date":"2007-05-31T22:00:00.000Z","price":1503.35},{"date":"2007-06-30T22:00:00.000Z","price":1455.27},{"date":"2007-07-31T22:00:00.000Z","price":1473.99},{"date":"2007-08-31T22:00:00.000Z","price":1526.75},{"date":"2007-09-30T22:00:00.000Z","price":1549.38},{"date":"2007-10-31T23:00:00.000Z","price":1481.14},{"date":"2007-11-30T23:00:00.000Z","price":1468.36},{"date":"2007-12-31T23:00:00.000Z","price":1378.55},{"date":"2008-01-31T23:00:00.000Z","price":1330.63},{"date":"2008-02-29T23:00:00.000Z","price":1322.7},{"date":"2008-03-31T22:00:00.000Z","price":1385.59},{"date":"2008-04-30T22:00:00.000Z","price":1400.38},{"date":"2008-05-31T22:00:00.000Z","price":1280},{"date":"2008-06-30T22:00:00.000Z","price":1267.38},{"date":"2008-07-31T22:00:00.000Z","price":1282.83},{"date":"2008-08-31T22:00:00.000Z","price":1166.36},{"date":"2008-09-30T22:00:00.000Z","price":968.75},{"date":"2008-10-31T23:00:00.000Z","price":896.24},{"date":"2008-11-30T23:00:00.000Z","price":903.25},{"date":"2008-12-31T23:00:00.000Z","price":825.88},{"date":"2009-01-31T23:00:00.000Z","price":735.09},{"date":"2009-02-28T23:00:00.000Z","price":797.87},{"date":"2009-03-31T22:00:00.000Z","price":872.81},{"date":"2009-04-30T22:00:00.000Z","price":919.14},{"date":"2009-05-31T22:00:00.000Z","price":919.32},{"date":"2009-06-30T22:00:00.000Z","price":987.48},{"date":"2009-07-31T22:00:00.000Z","price":1020.62},{"date":"2009-08-31T22:00:00.000Z","price":1057.08},{"date":"2009-09-30T22:00:00.000Z","price":1036.19},{"date":"2009-10-31T23:00:00.000Z","price":1095.63},{"date":"2009-11-30T23:00:00.000Z","price":1115.1},{"date":"2009-12-31T23:00:00.000Z","price":1073.87},{"date":"2010-01-31T23:00:00.000Z","price":1104.49},{"date":"2010-02-28T23:00:00.000Z","price":1140.45  }]);
    
    function brushed() {
      if (d3.event.sourceEvent && d3.event.sourceEvent.type === "zoom") return; // ignore brush-by-zoom
      var s = d3.event.selection || x2.range();
      x.domain(s.map(x2.invert, x2));
      focus.select(".area").attr("d", area);
      focus.select(".axis--x").call(xAxis);
      svg.select(".zoom").call(zoom.transform, d3.zoomIdentity
          .scale(width / (s[1] - s[0]))
          .translate(-s[0], 0));
    
    	var lo = x.domain()[0],
      		hi = x.domain()[1];
    
      var max = d3.max(data.filter(function (d) {
      	return d.date.getTime() >= lo && d.date.getTime() <= hi;
      }), function(d){ return d.price; });
    
    	focus.select(".line").attr("d", line.y(function () {
        return y(max);
      }));
    }
    
    function zoomed() {
      if (d3.event.sourceEvent && d3.event.sourceEvent.type === "brush") return; // ignore zoom-by-brush
      var t = d3.event.transform;
      x.domain(t.rescaleX(x2).domain());
      focus.select(".area").attr("d", area);
      focus.select(".axis--x").call(xAxis);
      context.select(".brush").call(brush.move, x.range().map(t.invertX, t));
      
    	var lo = x.domain()[0],
      		hi = x.domain()[1];
    
      var max = d3.max(data.filter(function (d) {
      	return d.date.getTime() >= lo && d.date.getTime() <= hi;
      }), function(d){ return d.price; });
    
    	focus.select(".line").attr("d", line.y(function () {
        return y(max);
      }));
    }
    
    function type(d) {
      d.date = parseDate(d.date);
      d.price = +d.price;
      return d;
    }
    .area {
      fill: steelblue;
      clip-path: url(#clip);
    }
    
    .line {
      stroke: red;
      clip-path: url(#clip);
    }
    
    .zoom {
      cursor: move;
      fill: none;
      pointer-events: all;
    }
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <svg width="500" height="250"></svg>

答案 1 :(得分:1)

这样的事情:

  focus.append("line")
    .attr("class", "peak")
    .style("stroke", "orange")
    .attr("stroke-width", 3);

  function setPeak(){
    var maxY = {
      x: null,
      y: -1e100
    };
    data.forEach(function(d){
      if (d.date >= x.domain()[0] &&
          d.date <= x.domain()[1] &&
          d.price > maxY.y){

            maxY.y = d.price;
            maxY.x = d.date;

          }
    });
    d3.select(".peak")
      .attr("x1", x(maxY.x))
      .attr("x2", x(maxY.x))
      .attr("y1", 0)
      .attr("y2", height);
  }

  setPeak();

运行代码:

&#13;
&#13;
<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .area {
    fill: steelblue;
    clip-path: url(#clip);
  }
  
  .zoom {
    cursor: move;
    fill: none;
    pointer-events: all;
  }
</style>
<svg width="400" height="300"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
  var svg = d3.select("svg"),
    margin = {
      top: 20,
      right: 20,
      bottom: 110,
      left: 40
    },
    margin2 = {
      top: 230,
      right: 20,
      bottom: 30,
      left: 40
    },
    width = +svg.attr("width") - margin.left - margin.right,
    height = +svg.attr("height") - margin.top - margin.bottom,
    height2 = +svg.attr("height") - margin2.top - margin2.bottom;

  var x = d3.scaleTime().range([0, width]),
    x2 = d3.scaleTime().range([0, width]),
    y = d3.scaleLinear().range([height, 0]),
    y2 = d3.scaleLinear().range([height2, 0]);

  var xAxis = d3.axisBottom(x),
    xAxis2 = d3.axisBottom(x2),
    yAxis = d3.axisLeft(y);

  var brush = d3.brushX()
    .extent([
      [0, 0],
      [width, height2]
    ])
    .on("brush end", brushed);

  var zoom = d3.zoom()
    .scaleExtent([1, Infinity])
    .translateExtent([
      [0, 0],
      [width, height]
    ])
    .extent([
      [0, 0],
      [width, height]
    ])
    .on("zoom", zoomed);

  var area = d3.area()
    .curve(d3.curveMonotoneX)
    .x(function(d) {
      return x(d.date);
    })
    .y0(height)
    .y1(function(d) {
      return y(d.price);
    });

  var area2 = d3.area()
    .curve(d3.curveMonotoneX)
    .x(function(d) {
      return x2(d.date);
    })
    .y0(height2)
    .y1(function(d) {
      return y2(d.price);
    });

  svg.append("defs").append("clipPath")
    .attr("id", "clip")
    .append("rect")
    .attr("width", width)
    .attr("height", height);

  var focus = svg.append("g")
    .attr("class", "focus")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

  var context = svg.append("g")
    .attr("class", "context")
    .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")");

  //d3.csv("data.csv", type, function(error, data) {
  //  if (error) throw error;

  var data = [{
  "date": "1999-12-31T23:00:00.000Z",
  "price": 1394.46
  }, {
  "date": "2000-01-31T23:00:00.000Z",
  "price": 1366.42
  }, {
  "date": "2000-02-29T23:00:00.000Z",
  "price": 1498.58
  }, {
  "date": "2000-03-31T22:00:00.000Z",
  "price": 1452.43
  }, {
  "date": "2000-04-30T22:00:00.000Z",
  "price": 1420.6
  }, {
  "date": "2000-05-31T22:00:00.000Z",
  "price": 1454.6
  }, {
  "date": "2000-06-30T22:00:00.000Z",
  "price": 1430.83
  }, {
  "date": "2000-07-31T22:00:00.000Z",
  "price": 1517.68
  }, {
  "date": "2000-08-31T22:00:00.000Z",
  "price": 1436.51
  }, {
  "date": "2000-09-30T22:00:00.000Z",
  "price": 1429.4
  }, {
  "date": "2000-10-31T23:00:00.000Z",
  "price": 1314.95
  }, {
  "date": "2000-11-30T23:00:00.000Z",
  "price": 1320.28
  }, {
  "date": "2000-12-31T23:00:00.000Z",
  "price": 1366.01
  }, {
  "date": "2001-01-31T23:00:00.000Z",
  "price": 1239.94
  }, {
  "date": "2001-02-28T23:00:00.000Z",
  "price": 1160.33
  }, {
  "date": "2001-03-31T22:00:00.000Z",
  "price": 1249.46
  }, {
  "date": "2001-04-30T22:00:00.000Z",
  "price": 1255.82
  }, {
  "date": "2001-05-31T22:00:00.000Z",
  "price": 1224.38
  }, {
  "date": "2001-06-30T22:00:00.000Z",
  "price": 1211.23
  }, {
  "date": "2001-07-31T22:00:00.000Z",
  "price": 1133.58
  }, {
  "date": "2001-08-31T22:00:00.000Z",
  "price": 1040.94
  }, {
  "date": "2001-09-30T22:00:00.000Z",
  "price": 1059.78
  }, {
  "date": "2001-10-31T23:00:00.000Z",
  "price": 1139.45
  }, {
  "date": "2001-11-30T23:00:00.000Z",
  "price": 1148.08
  }, {
  "date": "2001-12-31T23:00:00.000Z",
  "price": 1130.2
  }, {
  "date": "2002-01-31T23:00:00.000Z",
  "price": 1106.73
  }, {
  "date": "2002-02-28T23:00:00.000Z",
  "price": 1147.39
  }, {
  "date": "2002-03-31T22:00:00.000Z",
  "price": 1076.92
  }, {
  "date": "2002-04-30T22:00:00.000Z",
  "price": 1067.14
  }, {
  "date": "2002-05-31T22:00:00.000Z",
  "price": 989.82
  }, {
  "date": "2002-06-30T22:00:00.000Z",
  "price": 911.62
  }, {
  "date": "2002-07-31T22:00:00.000Z",
  "price": 916.07
  }, {
  "date": "2002-08-31T22:00:00.000Z",
  "price": 815.28
  }, {
  "date": "2002-09-30T22:00:00.000Z",
  "price": 885.76
  }, {
  "date": "2002-10-31T23:00:00.000Z",
  "price": 936.31
  }, {
  "date": "2002-11-30T23:00:00.000Z",
  "price": 879.82
  }, {
  "date": "2002-12-31T23:00:00.000Z",
  "price": 855.7
  }, {
  "date": "2003-01-31T23:00:00.000Z",
  "price": 841.15
  }, {
  "date": "2003-02-28T23:00:00.000Z",
  "price": 848.18
  }, {
  "date": "2003-03-31T22:00:00.000Z",
  "price": 916.92
  }, {
  "date": "2003-04-30T22:00:00.000Z",
  "price": 963.59
  }, {
  "date": "2003-05-31T22:00:00.000Z",
  "price": 974.5
  }, {
  "date": "2003-06-30T22:00:00.000Z",
  "price": 990.31
  }, {
  "date": "2003-07-31T22:00:00.000Z",
  "price": 1008.01
  }, {
  "date": "2003-08-31T22:00:00.000Z",
  "price": 995.97
  }, {
  "date": "2003-09-30T22:00:00.000Z",
  "price": 1050.71
  }, {
  "date": "2003-10-31T23:00:00.000Z",
  "price": 1058.2
  }, {
  "date": "2003-11-30T23:00:00.000Z",
  "price": 1111.92
  }, {
  "date": "2003-12-31T23:00:00.000Z",
  "price": 1131.13
  }, {
  "date": "2004-01-31T23:00:00.000Z",
  "price": 1144.94
  }, {
  "date": "2004-02-29T23:00:00.000Z",
  "price": 1126.21
  }, {
  "date": "2004-03-31T22:00:00.000Z",
  "price": 1107.3
  }, {
  "date": "2004-04-30T22:00:00.000Z",
  "price": 1120.68
  }, {
  "date": "2004-05-31T22:00:00.000Z",
  "price": 1140.84
  }, {
  "date": "2004-06-30T22:00:00.000Z",
  "price": 1101.72
  }, {
  "date": "2004-07-31T22:00:00.000Z",
  "price": 1104.24
  }, {
  "date": "2004-08-31T22:00:00.000Z",
  "price": 1114.58
  }, {
  "date": "2004-09-30T22:00:00.000Z",
  "price": 1130.2
  }, {
  "date": "2004-10-31T23:00:00.000Z",
  "price": 1173.82
  }, {
  "date": "2004-11-30T23:00:00.000Z",
  "price": 1211.92
  }, {
  "date": "2004-12-31T23:00:00.000Z",
  "price": 1181.27
  }, {
  "date": "2005-01-31T23:00:00.000Z",
  "price": 1203.6
  }, {
  "date": "2005-02-28T23:00:00.000Z",
  "price": 1180.59
  }, {
  "date": "2005-03-31T22:00:00.000Z",
  "price": 1156.85
  }, {
  "date": "2005-04-30T22:00:00.000Z",
  "price": 1191.5
  }, {
  "date": "2005-05-31T22:00:00.000Z",
  "price": 1191.33
  }, {
  "date": "2005-06-30T22:00:00.000Z",
  "price": 1234.18
  }, {
  "date": "2005-07-31T22:00:00.000Z",
  "price": 1220.33
  }, {
  "date": "2005-08-31T22:00:00.000Z",
  "price": 1228.81
  }, {
  "date": "2005-09-30T22:00:00.000Z",
  "price": 1207.01
  }, {
  "date": "2005-10-31T23:00:00.000Z",
  "price": 1249.48
  }, {
  "date": "2005-11-30T23:00:00.000Z",
  "price": 1248.29
  }, {
  "date": "2005-12-31T23:00:00.000Z",
  "price": 1280.08
  }, {
  "date": "2006-01-31T23:00:00.000Z",
  "price": 1280.66
  }, {
  "date": "2006-02-28T23:00:00.000Z",
  "price": 1294.87
  }, {
  "date": "2006-03-31T22:00:00.000Z",
  "price": 1310.61
  }, {
  "date": "2006-04-30T22:00:00.000Z",
  "price": 1270.09
  }, {
  "date": "2006-05-31T22:00:00.000Z",
  "price": 1270.2
  }, {
  "date": "2006-06-30T22:00:00.000Z",
  "price": 1276.66
  }, {
  "date": "2006-07-31T22:00:00.000Z",
  "price": 1303.82
  }, {
  "date": "2006-08-31T22:00:00.000Z",
  "price": 1335.85
  }, {
  "date": "2006-09-30T22:00:00.000Z",
  "price": 1377.94
  }, {
  "date": "2006-10-31T23:00:00.000Z",
  "price": 1400.63
  }, {
  "date": "2006-11-30T23:00:00.000Z",
  "price": 1418.3
  }, {
  "date": "2006-12-31T23:00:00.000Z",
  "price": 1438.24
  }, {
  "date": "2007-01-31T23:00:00.000Z",
  "price": 1406.82
  }, {
  "date": "2007-02-28T23:00:00.000Z",
  "price": 1420.86
  }, {
  "date": "2007-03-31T22:00:00.000Z",
  "price": 1482.37
  }, {
  "date": "2007-04-30T22:00:00.000Z",
  "price": 1530.62
  }, {
  "date": "2007-05-31T22:00:00.000Z",
  "price": 1503.35
  }, {
  "date": "2007-06-30T22:00:00.000Z",
  "price": 1455.27
  }, {
  "date": "2007-07-31T22:00:00.000Z",
  "price": 1473.99
  }, {
  "date": "2007-08-31T22:00:00.000Z",
  "price": 1526.75
  }, {
  "date": "2007-09-30T22:00:00.000Z",
  "price": 1549.38
  }, {
  "date": "2007-10-31T23:00:00.000Z",
  "price": 1481.14
  }, {
  "date": "2007-11-30T23:00:00.000Z",
  "price": 1468.36
  }, {
  "date": "2007-12-31T23:00:00.000Z",
  "price": 1378.55
  }, {
  "date": "2008-01-31T23:00:00.000Z",
  "price": 1330.63
  }, {
  "date": "2008-02-29T23:00:00.000Z",
  "price": 1322.7
  }, {
  "date": "2008-03-31T22:00:00.000Z",
  "price": 1385.59
  }, {
  "date": "2008-04-30T22:00:00.000Z",
  "price": 1400.38
  }, {
  "date": "2008-05-31T22:00:00.000Z",
  "price": 1280
  }, {
  "date": "2008-06-30T22:00:00.000Z",
  "price": 1267.38
  }, {
  "date": "2008-07-31T22:00:00.000Z",
  "price": 1282.83
  }, {
  "date": "2008-08-31T22:00:00.000Z",
  "price": 1166.36
  }, {
  "date": "2008-09-30T22:00:00.000Z",
  "price": 968.75
  }, {
  "date": "2008-10-31T23:00:00.000Z",
  "price": 896.24
  }, {
  "date": "2008-11-30T23:00:00.000Z",
  "price": 903.25
  }, {
  "date": "2008-12-31T23:00:00.000Z",
  "price": 825.88
  }, {
  "date": "2009-01-31T23:00:00.000Z",
  "price": 735.09
  }, {
  "date": "2009-02-28T23:00:00.000Z",
  "price": 797.87
  }, {
  "date": "2009-03-31T22:00:00.000Z",
  "price": 872.81
  }, {
  "date": "2009-04-30T22:00:00.000Z",
  "price": 919.14
  }, {
  "date": "2009-05-31T22:00:00.000Z",
  "price": 919.32
  }, {
  "date": "2009-06-30T22:00:00.000Z",
  "price": 987.48
  }, {
  "date": "2009-07-31T22:00:00.000Z",
  "price": 1020.62
  }, {
  "date": "2009-08-31T22:00:00.000Z",
  "price": 1057.08
  }, {
  "date": "2009-09-30T22:00:00.000Z",
  "price": 1036.19
  }, {
  "date": "2009-10-31T23:00:00.000Z",
  "price": 1095.63
  }, {
  "date": "2009-11-30T23:00:00.000Z",
  "price": 1115.1
  }, {
  "date": "2009-12-31T23:00:00.000Z",
  "price": 1073.87
  }, {
  "date": "2010-01-31T23:00:00.000Z",
  "price": 1104.49
  }, {
  "date": "2010-02-28T23:00:00.000Z",
  "price": 1140.45
  }];
  
  data = data.map(type);
  
  console.log(data)
  
  x.domain(d3.extent(data, function(d) {
    return d.date;
  }));
  y.domain([0, d3.max(data, function(d) {
    return d.price;
  })]);
  x2.domain(x.domain());
  y2.domain(y.domain());

  focus.append("path")
    .datum(data)
    .attr("class", "area")
    .attr("d", area);

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

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

  context.append("path")
    .datum(data)
    .attr("class", "area")
    .attr("d", area2);

  context.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + height2 + ")")
    .call(xAxis2);

  context.append("g")
    .attr("class", "brush")
    .call(brush)
    .call(brush.move, x.range());

  svg.append("rect")
    .attr("class", "zoom")
    .attr("width", width)
    .attr("height", height)
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
    .call(zoom);
    
  focus.append("line")
    .attr("class", "peak")
    .style("stroke", "orange")
    .attr("stroke-width", 3);
  
  //});
  
  function setPeak(){
    var maxY = {
      x: null,
      y: -1e100
    };
    data.forEach(function(d){
      if (d.date >= x.domain()[0] &&
          d.date <= x.domain()[1] &&
          d.price > maxY.y){
            
            maxY.y = d.price;
            maxY.x = d.date;
            
          }
    });
    d3.select(".peak")
      .attr("x1", x(maxY.x))
      .attr("x2", x(maxY.x))
      .attr("y1", 0)
      .attr("y2", height);
  }
  
  setPeak();

  function brushed() {
    if (d3.event.sourceEvent && d3.event.sourceEvent.type === "zoom") return; // ignore brush-by-zoom
    var s = d3.event.selection || x2.range();
    x.domain(s.map(x2.invert, x2));
    focus.select(".area").attr("d", area);
    focus.select(".axis--x").call(xAxis);
    svg.select(".zoom").call(zoom.transform, d3.zoomIdentity
      .scale(width / (s[1] - s[0]))
      .translate(-s[0], 0));
    setPeak();
  }

  function zoomed() {
    if (d3.event.sourceEvent && d3.event.sourceEvent.type === "brush") return; // ignore zoom-by-brush
    var t = d3.event.transform;
    x.domain(t.rescaleX(x2).domain());
    focus.select(".area").attr("d", area);
    focus.select(".axis--x").call(xAxis);
    context.select(".brush").call(brush.move, x.range().map(t.invertX, t));
  }

  function type(d) {
    d.date = new Date(d.date);
    d.price = +d.price;
    return d;
  }
</script>
&#13;
&#13;
&#13;