zoukankan      html  css  js  c++  java
  • 【D3.js】Focus + Context 折线图


          利用D3.js库实现Focus+Context的折线图。读取data.tsv文件数据

     index.html

    <!DOCTYPE html>
    <meta charset="utf-8">
    <style>
    
    svg {
      font: 10px sans-serif;
    }
    
    .axis path,
    .axis line {
      fill: none;
      stroke: #000;
      shape-rendering: crispEdges;
    }
    
    .line {
      fill: none;
      clip-path: url(#clip);                            //将多余的超出坐标系范围的线段裁剪掉
      stroke: steelblue;
      stroke- 1.5px;
    }
    
    .brush .extent {
      stroke: #fff;
      fill-opacity: .125;
      shape-rendering: crispEdges;
    }
    
    </style>
    <body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
    <script>
    
    var margin = {top: 10, right: 10, bottom: 100, left: 40},
        margin2 = {top: 430, right: 10, bottom: 20, left: 40},
        width = 960 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom,
        height2 = 500 - margin2.top - margin2.bottom;
        
    var color = d3.scale.category10();
    
    var parseDate = d3.time.format("%Y%m%d").parse;
    
    var x = d3.time.scale().range([0, width]),
        x2 = d3.time.scale().range([0, width]),
        y = d3.scale.linear().range([height, 0]),
        y2 = d3.scale.linear().range([height2, 0]);
    
    var xAxis = d3.svg.axis().scale(x).orient("bottom"),
        xAxis2 = d3.svg.axis().scale(x2).orient("bottom"),
        yAxis = d3.svg.axis().scale(y).orient("left");
        
    var line = d3.svg.line()
        .interpolate("basis")
        .x(function(d) { return x(d.date); })
        .y(function(d) { return y(d.temperature);});
        
    var line2 = d3.svg.line()
        .interpolate("basis")
        .x(function(d) { return x2(d.date); })
        .y(function(d) { return y2(d.temperature); }); 
    
    var brush = d3.svg.brush()
        .x(x2)
        .on("brush", brushed);
    
    
    var svg = d3.select("body").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom);
    
    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.tsv("data.tsv",  function(error, data) {
    
      color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
    
      data.forEach(function(d) {
        d.date = parseDate(d.date);
      });
    
      var cities = color.domain().map(function(name) {
        return {
          name: name,
          values: data.map(function(d) {
            return {date: d.date, temperature: +d[name]};
          })
        };
      });
    
      x.domain(d3.extent(data, function(d) { return d.date; }));
    
      y.domain([
        d3.min(cities, function(c) { return d3.min(c.values, function(v) { return v.temperature; }); }),
        d3.max(cities, function(c) { return d3.max(c.values, function(v) { return v.temperature; }); })
      ]);
    
      x2.domain(x.domain());
      y2.domain(y.domain());
      
      
     var city = focus.selectAll(".city")
    	   .data(cities)
    	 .enter().append("g")
    	   .attr("class", "city");
    
      city.append("path")
          .attr("class", "line")
          .attr("d", function(d) { return line(d.values); })
          .style("stroke", function(d) { return color(d.name); });
    
      focus.append("g")
          .attr("class", "x axis")
          .attr("transform", "translate(0," + height + ")")
          .call(xAxis);
    
      focus.append("g")
          .attr("class", "y axis")
          .call(yAxis);
          
          
      var city2 = context.selectAll(".city")
    	   .data(cities)
    	 .enter().append("g")
    	   .attr("class", "city");
    
    	  city2.append("path")
    	      .attr("class", "line")
    	      .attr("d", function(d) { return line2(d.values); })
    	      .style("stroke", function(d) { return color(d.name); });
    
      context.append("g")
          .attr("class", "x axis")
          .attr("transform", "translate(0," + height2 + ")")
          .call(xAxis2);
    
      context.append("g")
          .attr("class", "x brush")
          .call(brush)
        .selectAll("rect")
          .attr("y", -6)
          .attr("height", height2 + 7);
    
      
    });
    
    function brushed() {
      x.domain(brush.empty() ? x2.domain() : brush.extent());
      focus.selectAll(".line").attr("d", function(d) { return line(d.values); });
      focus.select(".x.axis").call(xAxis);
    }
    
    </script>

    效果图 例如以下:



  • 相关阅读:
    2020/5/8
    2020/5/8
    2020/5/6
    2020/4/30
    2020/4/29
    2020/4/28
    2020/4/27
    KMP算法详解
    博客搬家声明
    洛谷P2831 NOIP2016 愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6788894.html
Copyright © 2011-2022 走看看