【问题标题】:D3 grid lines and tick values issuesD3 网格线和刻度值问题
【发布时间】:2016-01-21 12:08:53
【问题描述】:

我有一个使用 D3 制作的堆积面积图。我的实施面临两个问题。

1) 我只想在 y 轴上显示替代刻度值。例如,在我的实现中,y 轴值为0, 20, 40, 60, 80, 100 等等。但我想显示像0, 40, 80, 120 这样的值,但也要保持相应的网格线。我只想删除替代刻度值而不删除 y 轴网格线。

2) 我想格式化 y 轴,使其始终具有上 y 轴网格线。所以在我的实现中,我希望在180 值上方有一条网格线。

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

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

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

var z = d3.scale.category20c();

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


var yAxis = d3.svg.axis()
  .scale(y).innerTickSize(-width).outerTickSize(0)
  .orient("left");

var stack = d3.layout.stack()
  .offset("zero")
  .values(function(d) {
    return d.data;
  })
  .x(function(d) {
    return new Date(d[0]);
  })
  .y(function(d) {
    return d[1];
  });



var area = d3.svg.area()
  .interpolate("cardinal")
  .x(function(d) {
    return x(new Date(d[0]));;
  })
  .y0(function(d) {
    return y(d.y0);
  })
  .y1(function(d) {
    return y(d.y0 + 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 + ")");


var b = [{
  data: [
    ["2016-01-20T05:31:17.000Z", 95.9, {}],
    ["2016-01-20T05:31:47.000Z", 95.9, {}],
    ["2016-01-20T05:32:17.000Z", 95.4, {}],
    ["2016-01-20T05:32:47.000Z", 96.1, {}],
    ["2016-01-20T05:33:17.000Z", 95.7, {}],
    ["2016-01-20T05:33:47.000Z", 95.9, {}],
    ["2016-01-20T05:34:17.000Z", 95.5, {}],
    ["2016-01-20T05:34:47.000Z", 95.9, {}],
    ["2016-01-20T05:35:17.000Z", 95.8, {}],
    ["2016-01-20T05:35:47.000Z", 95.9, {}],
    ["2016-01-20T05:36:17.000Z", 95.7, {}],
    ["2016-01-20T05:36:47.000Z", 95.7, {}],
    ["2016-01-20T05:37:17.000Z", 95.9, {}],
    ["2016-01-20T05:37:47.000Z", 95.5, {}],
    ["2016-01-20T05:38:17.000Z", 95.4, {}],
    ["2016-01-20T05:38:47.000Z", 95.8, {}],
    ["2016-01-20T05:39:17.000Z", 96.0, {}],
    ["2016-01-20T05:39:47.000Z", 96.1, {}],
    ["2016-01-20T05:40:17.000Z", 95.8, {}],
    ["2016-01-20T05:40:47.000Z", 96.0, {}],
    ["2016-01-20T05:41:17.000Z", 95.9, {}],
    ["2016-01-20T05:41:47.000Z", 94.9, {}],
    ["2016-01-20T05:42:17.000Z", 95.8, {}],
    ["2016-01-20T05:42:47.000Z", 95.9, {}],
    ["2016-01-20T05:43:17.000Z", 95.8, {}],
    ["2016-01-20T05:43:47.000Z", 96.0, {}],
    ["2016-01-20T05:44:17.000Z", 95.7, {}],
    ["2016-01-20T05:44:47.000Z", 96.0, {}],
    ["2016-01-20T05:45:17.000Z", 95.9, {}],
    ["2016-01-20T05:45:47.000Z", 96.0, {}],
    ["2016-01-20T05:46:17.000Z", 95.8, {}],
    ["2016-01-20T05:46:47.000Z", 96.0, {}],
    ["2016-01-20T05:47:17.000Z", 95.7, {}],
    ["2016-01-20T05:47:47.000Z", 96.2, {}],
    ["2016-01-20T05:48:17.000Z", 95.8, {}],
    ["2016-01-20T05:48:47.000Z", 95.9, {}],
    ["2016-01-20T05:49:17.000Z", 95.7, {}],
    ["2016-01-20T05:49:47.000Z", 95.9, {}],
    ["2016-01-20T05:50:18.000Z", 95.7, {}],
    ["2016-01-20T05:50:48.000Z", 95.8, {}],
    ["2016-01-20T05:51:18.000Z", 95.7, {}],
    ["2016-01-20T05:51:48.000Z", 95.9, {}],
    ["2016-01-20T05:52:18.000Z", 95.5, {}],
    ["2016-01-20T05:52:48.000Z", 95.9, {}],
    ["2016-01-20T05:53:18.000Z", 95.8, {}],
    ["2016-01-20T05:53:48.000Z", 95.9, {}],
    ["2016-01-20T05:54:18.000Z", 95.7, {}],
    ["2016-01-20T05:54:48.000Z", 95.9, {}],
    ["2016-01-20T05:55:18.000Z", 95.8, {}],
    ["2016-01-20T05:55:48.000Z", 95.8, {}],
    ["2016-01-20T05:56:18.000Z", 95.6, {}],
    ["2016-01-20T05:56:48.000Z", 95.7, {}],
    ["2016-01-20T05:57:18.000Z", 95.7, {}],
    ["2016-01-20T05:57:48.000Z", 95.8, {}],
    ["2016-01-20T05:58:18.000Z", 95.7, {}],
    ["2016-01-20T05:58:48.000Z", 95.7, {}],
    ["2016-01-20T05:59:18.000Z", 95.6, {}],
    ["2016-01-20T05:59:48.000Z", 95.8, {}],
    ["2016-01-20T06:00:18.000Z", 95.7, {}],
    ["2016-01-20T06:00:48.000Z", 95.7, {}],
    ["2016-01-20T06:01:18.000Z", 95.6, {}],
    ["2016-01-20T06:01:48.000Z", 95.7, {}],
    ["2016-01-20T06:02:18.000Z", 95.8, {}],
    ["2016-01-20T06:02:48.000Z", 95.8, {}],
    ["2016-01-20T06:03:18.000Z", 95.8, {}],
    ["2016-01-20T06:03:48.000Z", 95.8, {}],
    ["2016-01-20T06:04:18.000Z", 95.8, {}],
    ["2016-01-20T06:04:48.000Z", 95.8, {}],
    ["2016-01-20T06:05:18.000Z", 95.7, {}],
    ["2016-01-20T06:05:48.000Z", 95.7, {}]
  ],
  label: "a"
}, {
  data: [
    ["2016-01-20T05:31:17.000Z", 95.9, {}],
    ["2016-01-20T05:31:47.000Z", 95.9, {}],
    ["2016-01-20T05:32:17.000Z", 95.4, {}],
    ["2016-01-20T05:32:47.000Z", 96.1, {}],
    ["2016-01-20T05:33:17.000Z", 95.7, {}],
    ["2016-01-20T05:33:47.000Z", 95.9, {}],
    ["2016-01-20T05:34:17.000Z", 95.5, {}],
    ["2016-01-20T05:34:47.000Z", 95.9, {}],
    ["2016-01-20T05:35:17.000Z", 95.8, {}],
    ["2016-01-20T05:35:47.000Z", 95.9, {}],
    ["2016-01-20T05:36:17.000Z", 95.7, {}],
    ["2016-01-20T05:36:47.000Z", 95.7, {}],
    ["2016-01-20T05:37:17.000Z", 95.9, {}],
    ["2016-01-20T05:37:47.000Z", 95.5, {}],
    ["2016-01-20T05:38:17.000Z", 95.4, {}],
    ["2016-01-20T05:38:47.000Z", 95.8, {}],
    ["2016-01-20T05:39:17.000Z", 96.0, {}],
    ["2016-01-20T05:39:47.000Z", 96.1, {}],
    ["2016-01-20T05:40:17.000Z", 95.8, {}],
    ["2016-01-20T05:40:47.000Z", 96.0, {}],
    ["2016-01-20T05:41:17.000Z", 95.9, {}],
    ["2016-01-20T05:41:47.000Z", 94.9, {}],
    ["2016-01-20T05:42:17.000Z", 95.8, {}],
    ["2016-01-20T05:42:47.000Z", 95.9, {}],
    ["2016-01-20T05:43:17.000Z", 95.8, {}],
    ["2016-01-20T05:43:47.000Z", 96.0, {}],
    ["2016-01-20T05:44:17.000Z", 95.7, {}],
    ["2016-01-20T05:44:47.000Z", 96.0, {}],
    ["2016-01-20T05:45:17.000Z", 95.9, {}],
    ["2016-01-20T05:45:47.000Z", 96.0, {}],
    ["2016-01-20T05:46:17.000Z", 95.8, {}],
    ["2016-01-20T05:46:47.000Z", 96.0, {}],
    ["2016-01-20T05:47:17.000Z", 95.7, {}],
    ["2016-01-20T05:47:47.000Z", 96.2, {}],
    ["2016-01-20T05:48:17.000Z", 95.8, {}],
    ["2016-01-20T05:48:47.000Z", 95.9, {}],
    ["2016-01-20T05:49:17.000Z", 95.7, {}],
    ["2016-01-20T05:49:47.000Z", 95.9, {}],
    ["2016-01-20T05:50:18.000Z", 95.7, {}],
    ["2016-01-20T05:50:48.000Z", 95.8, {}],
    ["2016-01-20T05:51:18.000Z", 95.7, {}],
    ["2016-01-20T05:51:48.000Z", 95.9, {}],
    ["2016-01-20T05:52:18.000Z", 95.5, {}],
    ["2016-01-20T05:52:48.000Z", 95.9, {}],
    ["2016-01-20T05:53:18.000Z", 95.8, {}],
    ["2016-01-20T05:53:48.000Z", 95.9, {}],
    ["2016-01-20T05:54:18.000Z", 95.7, {}],
    ["2016-01-20T05:54:48.000Z", 95.9, {}],
    ["2016-01-20T05:55:18.000Z", 95.8, {}],
    ["2016-01-20T05:55:48.000Z", 95.8, {}],
    ["2016-01-20T05:56:18.000Z", 95.6, {}],
    ["2016-01-20T05:56:48.000Z", 95.7, {}],
    ["2016-01-20T05:57:18.000Z", 95.7, {}],
    ["2016-01-20T05:57:48.000Z", 95.8, {}],
    ["2016-01-20T05:58:18.000Z", 95.7, {}],
    ["2016-01-20T05:58:48.000Z", 95.7, {}],
    ["2016-01-20T05:59:18.000Z", 95.6, {}],
    ["2016-01-20T05:59:48.000Z", 95.8, {}],
    ["2016-01-20T06:00:18.000Z", 95.7, {}],
    ["2016-01-20T06:00:48.000Z", 95.7, {}],
    ["2016-01-20T06:01:18.000Z", 95.6, {}],
    ["2016-01-20T06:01:48.000Z", 95.7, {}],
    ["2016-01-20T06:02:18.000Z", 95.8, {}],
    ["2016-01-20T06:02:48.000Z", 95.8, {}],
    ["2016-01-20T06:03:18.000Z", 95.8, {}],
    ["2016-01-20T06:03:48.000Z", 95.8, {}],
    ["2016-01-20T06:04:18.000Z", 95.8, {}],
    ["2016-01-20T06:04:48.000Z", 95.8, {}],
    ["2016-01-20T06:05:18.000Z", 95.7, {}],
    ["2016-01-20T06:05:48.000Z", 95.7, {}]
  ],
  label: "b"
}]




var layers = stack(b);

var ary = [];
layers.forEach(function(d) {
  ary.push(d.data)
})

x.domain(d3.extent(d3.merge(ary), function(d) {
  return new Date(d[0]);
}));
y.domain([0, d3.max(d3.merge(ary), function(d) {
  return d.y0 + d.y;
})]);


svg.selectAll(".layer")
  .data(layers)
  .enter().append("path")
  .attr("class", "layer")
  .attr("d", function(d) {
    return area(d.data);
  })
  .style("fill", function(d, i) {
    return z(i);
  });

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

svg.append("g")
  .attr("class", "y axis")
  .call(yAxis);
body {
  font: 10px sans-serif;
}
.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

注意:数据值是动态的,因此 y 轴刻度值不是固定的。请帮我找到一个适用于任何数据的解决方案。

【问题讨论】:

    标签: javascript css d3.js


    【解决方案1】:

    要使刻度值做:

    var max = y.domain()[1];
    var values = [];
    for(var j =0; j <=max; j=j+20){
        values.push(j)
    }
    values.push(max)
    
    yAxis.tickValues(values);
    

    要隐藏备用网格文本,请执行以下操作:

    var last = svg.selectAll(".y .tick text")[0].length;  
    
    svg.selectAll(".y .tick text")[0].forEach(function(d, i){
      if (i==last-1){
        return;//for showing last tick
      }
      if(i%2==0)
        d3.select(d).style("display", "none");//for showing alternate ticks
    });
    

    工作代码here

    【讨论】:

    • 感谢您的解决方案。
    【解决方案2】:

    通过设置yAxis 的参数可以轻松满足您的这两个要求。

    1. 自定义刻度值可以通过使用axis.tickValues() 覆盖由刻度的自动刻度生成器提供的值来指定。对于您的情况,这意味着致电yAxis.tickValues([0, 40, 80, 120])。要在仍然绘制网格线的同时隐藏某些刻度值,您可以使用 axis.tickFormat(),这取决于您的逻辑 - 需要为每个要省略的刻度值返回一个空字符串。下面的示例将显示每秒的刻度值,但您可以随意实现任何您喜欢的逻辑。

    2. 如果您想要图表上方的封闭网格线,您可以使用yAxis.outerTickSize(-width),它将在刻度范围的最小/最大值处添加网格线,就像为中间值添加内部网格线一样。但是请注意,作为副作用,这还会在 y 轴的下端添加一条网格线,这在您的情况下不会受到伤害,因为它将与您的 x 轴相同。

    生成yAxis 的代码如下所示:

    var yTicks = [40,80,120,160];               // Use whatever values you like.
    var yAxis = d3.svg.axis()
      .scale(y)
      .innerTickSize(-width)
      .outerTickSize(-width)                    // Set to -width for upper/lower grid lines
      .tickValues(yTicks)                       // Set custom grid values.
      .tickFormat(function(d) {
        return yTicks.indexOf(d) % 2 ? d : "";  // Custom tickFormat to hide certain tickValues
      })
      .orient("left");
    

    如果您不希望上方的网格线与值的路径齐平,您可以通过扩展刻度的域来添加一点填充:

    y.domain([0, d3.max(d3.merge(ary), function(d) {
      return d.y0 + d.y;
    }) * 1.1]);   // Extending the extent's max value by .1 to allow for padding.
    

    var margin = {
        top: 20,
        right: 30,
        bottom: 30,
        left: 40
      },
      width = 960 - margin.left - margin.right,
      height = 500 - margin.top - margin.bottom;
    
    var x = d3.time.scale()
      .range([0, width]);
    
    var y = d3.scale.linear()
      .range([height, 0]);
    
    var z = d3.scale.category20c();
    
    var xAxis = d3.svg.axis()
      .scale(x)
      .orient("bottom")
    
    var yTicks = [40,80,120,160];               // Use whatever values you like.
    var yAxis = d3.svg.axis()
      .scale(y)
      .innerTickSize(-width)
      .outerTickSize(-width)                    // Set to -width for upper/lower grid lines
      .tickValues(yTicks)                       // Set custom grid values.
      .tickFormat(function(d) {
        return yTicks.indexOf(d) % 2 ? d : "";  // Use a custom tickFormat to hide certain tickValues
      })
      .orient("left");
    
    var stack = d3.layout.stack()
      .offset("zero")
      .values(function(d) {
        return d.data;
      })
      .x(function(d) {
        return new Date(d[0]);
      })
      .y(function(d) {
        return d[1];
      });
    
    
    
    var area = d3.svg.area()
      .interpolate("cardinal")
      .x(function(d) {
        return x(new Date(d[0]));;
      })
      .y0(function(d) {
        return y(d.y0);
      })
      .y1(function(d) {
        return y(d.y0 + 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 + ")");
    
    
    var b = [{
      data: [
        ["2016-01-20T05:31:17.000Z", 95.9, {}],
        ["2016-01-20T05:31:47.000Z", 95.9, {}],
        ["2016-01-20T05:32:17.000Z", 95.4, {}],
        ["2016-01-20T05:32:47.000Z", 96.1, {}],
        ["2016-01-20T05:33:17.000Z", 95.7, {}],
        ["2016-01-20T05:33:47.000Z", 95.9, {}],
        ["2016-01-20T05:34:17.000Z", 95.5, {}],
        ["2016-01-20T05:34:47.000Z", 95.9, {}],
        ["2016-01-20T05:35:17.000Z", 95.8, {}],
        ["2016-01-20T05:35:47.000Z", 95.9, {}],
        ["2016-01-20T05:36:17.000Z", 95.7, {}],
        ["2016-01-20T05:36:47.000Z", 95.7, {}],
        ["2016-01-20T05:37:17.000Z", 95.9, {}],
        ["2016-01-20T05:37:47.000Z", 95.5, {}],
        ["2016-01-20T05:38:17.000Z", 95.4, {}],
        ["2016-01-20T05:38:47.000Z", 95.8, {}],
        ["2016-01-20T05:39:17.000Z", 96.0, {}],
        ["2016-01-20T05:39:47.000Z", 96.1, {}],
        ["2016-01-20T05:40:17.000Z", 95.8, {}],
        ["2016-01-20T05:40:47.000Z", 96.0, {}],
        ["2016-01-20T05:41:17.000Z", 95.9, {}],
        ["2016-01-20T05:41:47.000Z", 94.9, {}],
        ["2016-01-20T05:42:17.000Z", 95.8, {}],
        ["2016-01-20T05:42:47.000Z", 95.9, {}],
        ["2016-01-20T05:43:17.000Z", 95.8, {}],
        ["2016-01-20T05:43:47.000Z", 96.0, {}],
        ["2016-01-20T05:44:17.000Z", 95.7, {}],
        ["2016-01-20T05:44:47.000Z", 96.0, {}],
        ["2016-01-20T05:45:17.000Z", 95.9, {}],
        ["2016-01-20T05:45:47.000Z", 96.0, {}],
        ["2016-01-20T05:46:17.000Z", 95.8, {}],
        ["2016-01-20T05:46:47.000Z", 96.0, {}],
        ["2016-01-20T05:47:17.000Z", 95.7, {}],
        ["2016-01-20T05:47:47.000Z", 96.2, {}],
        ["2016-01-20T05:48:17.000Z", 95.8, {}],
        ["2016-01-20T05:48:47.000Z", 95.9, {}],
        ["2016-01-20T05:49:17.000Z", 95.7, {}],
        ["2016-01-20T05:49:47.000Z", 95.9, {}],
        ["2016-01-20T05:50:18.000Z", 95.7, {}],
        ["2016-01-20T05:50:48.000Z", 95.8, {}],
        ["2016-01-20T05:51:18.000Z", 95.7, {}],
        ["2016-01-20T05:51:48.000Z", 95.9, {}],
        ["2016-01-20T05:52:18.000Z", 95.5, {}],
        ["2016-01-20T05:52:48.000Z", 95.9, {}],
        ["2016-01-20T05:53:18.000Z", 95.8, {}],
        ["2016-01-20T05:53:48.000Z", 95.9, {}],
        ["2016-01-20T05:54:18.000Z", 95.7, {}],
        ["2016-01-20T05:54:48.000Z", 95.9, {}],
        ["2016-01-20T05:55:18.000Z", 95.8, {}],
        ["2016-01-20T05:55:48.000Z", 95.8, {}],
        ["2016-01-20T05:56:18.000Z", 95.6, {}],
        ["2016-01-20T05:56:48.000Z", 95.7, {}],
        ["2016-01-20T05:57:18.000Z", 95.7, {}],
        ["2016-01-20T05:57:48.000Z", 95.8, {}],
        ["2016-01-20T05:58:18.000Z", 95.7, {}],
        ["2016-01-20T05:58:48.000Z", 95.7, {}],
        ["2016-01-20T05:59:18.000Z", 95.6, {}],
        ["2016-01-20T05:59:48.000Z", 95.8, {}],
        ["2016-01-20T06:00:18.000Z", 95.7, {}],
        ["2016-01-20T06:00:48.000Z", 95.7, {}],
        ["2016-01-20T06:01:18.000Z", 95.6, {}],
        ["2016-01-20T06:01:48.000Z", 95.7, {}],
        ["2016-01-20T06:02:18.000Z", 95.8, {}],
        ["2016-01-20T06:02:48.000Z", 95.8, {}],
        ["2016-01-20T06:03:18.000Z", 95.8, {}],
        ["2016-01-20T06:03:48.000Z", 95.8, {}],
        ["2016-01-20T06:04:18.000Z", 95.8, {}],
        ["2016-01-20T06:04:48.000Z", 95.8, {}],
        ["2016-01-20T06:05:18.000Z", 95.7, {}],
        ["2016-01-20T06:05:48.000Z", 95.7, {}]
      ],
      label: "a"
    }, {
      data: [
        ["2016-01-20T05:31:17.000Z", 95.9, {}],
        ["2016-01-20T05:31:47.000Z", 95.9, {}],
        ["2016-01-20T05:32:17.000Z", 95.4, {}],
        ["2016-01-20T05:32:47.000Z", 96.1, {}],
        ["2016-01-20T05:33:17.000Z", 95.7, {}],
        ["2016-01-20T05:33:47.000Z", 95.9, {}],
        ["2016-01-20T05:34:17.000Z", 95.5, {}],
        ["2016-01-20T05:34:47.000Z", 95.9, {}],
        ["2016-01-20T05:35:17.000Z", 95.8, {}],
        ["2016-01-20T05:35:47.000Z", 95.9, {}],
        ["2016-01-20T05:36:17.000Z", 95.7, {}],
        ["2016-01-20T05:36:47.000Z", 95.7, {}],
        ["2016-01-20T05:37:17.000Z", 95.9, {}],
        ["2016-01-20T05:37:47.000Z", 95.5, {}],
        ["2016-01-20T05:38:17.000Z", 95.4, {}],
        ["2016-01-20T05:38:47.000Z", 95.8, {}],
        ["2016-01-20T05:39:17.000Z", 96.0, {}],
        ["2016-01-20T05:39:47.000Z", 96.1, {}],
        ["2016-01-20T05:40:17.000Z", 95.8, {}],
        ["2016-01-20T05:40:47.000Z", 96.0, {}],
        ["2016-01-20T05:41:17.000Z", 95.9, {}],
        ["2016-01-20T05:41:47.000Z", 94.9, {}],
        ["2016-01-20T05:42:17.000Z", 95.8, {}],
        ["2016-01-20T05:42:47.000Z", 95.9, {}],
        ["2016-01-20T05:43:17.000Z", 95.8, {}],
        ["2016-01-20T05:43:47.000Z", 96.0, {}],
        ["2016-01-20T05:44:17.000Z", 95.7, {}],
        ["2016-01-20T05:44:47.000Z", 96.0, {}],
        ["2016-01-20T05:45:17.000Z", 95.9, {}],
        ["2016-01-20T05:45:47.000Z", 96.0, {}],
        ["2016-01-20T05:46:17.000Z", 95.8, {}],
        ["2016-01-20T05:46:47.000Z", 96.0, {}],
        ["2016-01-20T05:47:17.000Z", 95.7, {}],
        ["2016-01-20T05:47:47.000Z", 96.2, {}],
        ["2016-01-20T05:48:17.000Z", 95.8, {}],
        ["2016-01-20T05:48:47.000Z", 95.9, {}],
        ["2016-01-20T05:49:17.000Z", 95.7, {}],
        ["2016-01-20T05:49:47.000Z", 95.9, {}],
        ["2016-01-20T05:50:18.000Z", 95.7, {}],
        ["2016-01-20T05:50:48.000Z", 95.8, {}],
        ["2016-01-20T05:51:18.000Z", 95.7, {}],
        ["2016-01-20T05:51:48.000Z", 95.9, {}],
        ["2016-01-20T05:52:18.000Z", 95.5, {}],
        ["2016-01-20T05:52:48.000Z", 95.9, {}],
        ["2016-01-20T05:53:18.000Z", 95.8, {}],
        ["2016-01-20T05:53:48.000Z", 95.9, {}],
        ["2016-01-20T05:54:18.000Z", 95.7, {}],
        ["2016-01-20T05:54:48.000Z", 95.9, {}],
        ["2016-01-20T05:55:18.000Z", 95.8, {}],
        ["2016-01-20T05:55:48.000Z", 95.8, {}],
        ["2016-01-20T05:56:18.000Z", 95.6, {}],
        ["2016-01-20T05:56:48.000Z", 95.7, {}],
        ["2016-01-20T05:57:18.000Z", 95.7, {}],
        ["2016-01-20T05:57:48.000Z", 95.8, {}],
        ["2016-01-20T05:58:18.000Z", 95.7, {}],
        ["2016-01-20T05:58:48.000Z", 95.7, {}],
        ["2016-01-20T05:59:18.000Z", 95.6, {}],
        ["2016-01-20T05:59:48.000Z", 95.8, {}],
        ["2016-01-20T06:00:18.000Z", 95.7, {}],
        ["2016-01-20T06:00:48.000Z", 95.7, {}],
        ["2016-01-20T06:01:18.000Z", 95.6, {}],
        ["2016-01-20T06:01:48.000Z", 95.7, {}],
        ["2016-01-20T06:02:18.000Z", 95.8, {}],
        ["2016-01-20T06:02:48.000Z", 95.8, {}],
        ["2016-01-20T06:03:18.000Z", 95.8, {}],
        ["2016-01-20T06:03:48.000Z", 95.8, {}],
        ["2016-01-20T06:04:18.000Z", 95.8, {}],
        ["2016-01-20T06:04:48.000Z", 95.8, {}],
        ["2016-01-20T06:05:18.000Z", 95.7, {}],
        ["2016-01-20T06:05:48.000Z", 95.7, {}]
      ],
      label: "b"
    }]
    
    
    
    
    var layers = stack(b);
    
    var ary = [];
    layers.forEach(function(d) {
      ary.push(d.data)
    })
    
    x.domain(d3.extent(d3.merge(ary), function(d) {
      return new Date(d[0]);
    }));
    y.domain([0, d3.max(d3.merge(ary), function(d) {
      return d.y0 + d.y;
    }) * 1.1]);   // Extending the extent's max value by .1 to allow for padding.
    
    svg.selectAll(".layer")
      .data(layers)
      .enter().append("path")
      .attr("class", "layer")
      .attr("d", function(d) {
        return area(d.data);
      })
      .style("fill", function(d, i) {
        return z(i);
      });
    
    svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);
    
    svg.append("g")
      .attr("class", "y axis")
      .call(yAxis);
    body {
      font: 10px sans-serif;
    }
    .axis path,
    .axis line {
      fill: none;
      stroke: #000;
      shape-rendering: crispEdges;
    }
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 数据不固定。 y 轴的刻度值将根据后端的数据而变化。请帮我找到一个不需要手动指定tickValues 的通用解决方案。我也不希望相应的网格线消失。在第一个问题的解决方案中,当您从 y 轴上删除 20 时,相应的网格线也将被删除,但我希望该网格线存在但不勾选。
    • 你可以传入任何你喜欢的刻度值数组。当然,您可以根据需要的网格线数预先计算此数组。它们甚至不需要均匀分布; [1,5,10,20,50,500] 会很好。我不确定这如何变得更有活力。我刚刚借用了您在问题中提供的数组。
    • 如何预先计算这个数组?
    • 基本上我想在两个刻度之间绘制网格线,但不能这样做。你能帮我吗?
    • 我已经更新了我的答案,以更好地满足您的要求。
    猜你喜欢
    • 2018-08-03
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多