Advertisement
dhshin

overview+detail_skel3

Jun 28th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 3.45 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <meta charset="utf-8">
  5.   <meta name="viewport" content="width=device-width">
  6.   <title>JS Bin</title>
  7. </head>
  8. <body>
  9.   <svg width="960" height="500"></svg>
  10.   <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
  11.   <script>
  12.    
  13.     function ready(fn) {
  14.       if (document.readyState != 'loading'){
  15.         fn();
  16.       } else {
  17.         document.addEventListener('DOMContentLoaded', fn);
  18.       }
  19.     }
  20.    
  21.     ready(init);
  22.    
  23.     function init() {
  24.      
  25.       let parseDate = d3.timeParse("%b-%y");
  26.      
  27.       function parsing(d) {
  28.         d.date = parseDate(d.date);
  29.         return d;
  30.       }
  31.      
  32.       data = data.map(parsing);
  33.      
  34.       let svg = d3.select("svg");
  35.       let margin = {top: 20, right: 20, bottom: 110, left: 40};
  36.       let margin2 = {top: 430, right: 20, bottom: 30, left: 40};
  37.       let width = +svg.attr("width") - margin.left - margin.right;
  38.       let height = +svg.attr("height") - margin.top - margin.bottom;
  39.       let height2 = +svg.attr("height") - margin2.top - margin2.bottom;
  40.      
  41.       let chart = svg
  42.         .append('g')
  43.           .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');
  44.      
  45.       let overview = svg
  46.         .append('g')
  47.           .attr('transform', 'translate(' + margin2.left + ', ' + margin2.top + ')');
  48.      
  49.       let x = d3
  50.       .scaleTime()
  51.       .domain(d3.extent(data, d => d.date))
  52.       .range([0, width]);
  53.      
  54.       let x2 = d3
  55.       .scaleTime()
  56.       .domain(x.domain())
  57.       .range(x.range());
  58.      
  59.       let y = d3
  60.       .scaleLinear()
  61.       .domain([0, d3.max(data, d => d.price)])
  62.       .range([height, 0]);
  63.      
  64.       let y2 = d3
  65.       .scaleLinear()
  66.       .domain(y.domain())
  67.       .range([height2, 0]);
  68.      
  69.       // μΆ• 그리기
  70.       let xAxis = d3.axisBottom(x);
  71.       let xAxis2 = d3.axisBottom(x2);
  72.       let yAxis = d3.axisLeft(y);
  73.      
  74.       chart
  75.         .append('g')
  76.           .attr('class', 'axis--x')
  77.           .attr('transform', 'translate(0, ' + height + ')')
  78.           .call(xAxis);
  79.      
  80.       chart
  81.         .append('g')
  82.           .call(yAxis);
  83.      
  84.       overview
  85.         .append('g')
  86.           .attr('transform', 'translate(0, ' + height2 + ')')
  87.           .call(xAxis2);
  88.      
  89.       let priceArea = d3.area()
  90.       .x(d => x(d.date))
  91.       .y1(d => y(d.price))
  92.       .y0(height)
  93.       .curve(d3.curveMonotoneX);
  94.      
  95.       chart
  96.       .append('path')
  97.         .attr('class', 'area')
  98.         .datum(data)
  99.         .attr('fill', 'steelblue')
  100.         .attr('d', priceArea);
  101.      
  102.       let priceArea_overview = d3.area()
  103.       .x(d => x2(d.date))
  104.       .y1(d => y2(d.price))
  105.       .y0(height2)
  106.       .curve(d3.curveMonotoneX);
  107.      
  108.       overview
  109.       .append('path')
  110.         .datum(data)
  111.         .attr('fill', 'steelblue')
  112.         .attr('d', priceArea_overview);
  113.      
  114.       let brush = d3.brushX()
  115.       .extent([[0, 0], [width, height2]])
  116.       .on('brush', brushed)
  117.       .on('end', brushed);
  118.      
  119.       overview
  120.       .append('g')
  121.         .call(brush)
  122.         .call(brush.move, x.range());
  123.      
  124.       function brushed() {
  125.         let s = d3.event.selection || x2.range();
  126.         let new_domain = s.map(x2.invert);
  127.         x.domain(new_domain)
  128.         chart.select('.axis--x').call(xAxis);
  129.         chart.select('.area').attr('d', priceArea);
  130.       }
  131.     }
  132.        
  133.   </script>
  134. </body>
  135. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement