【问题标题】:Why is my simple D3.js-Barchart not normalized to SVG-height correctly?为什么我的简单 D3.js-Barchart 没有正确标准化为 SVG 高度?
【发布时间】:2012-10-18 14:48:26
【问题描述】:

我是 D3 的新手,我非常喜欢它,但是在我第一次尝试构建一个简单的条形图时,我被困在我想将条形图的高度标准化为 SVG 元素的完整高度的点上.所以最高数据值应该缩放到 SVG 元素的整个高度。所有其他都应该相对缩放。我确信这是一个愚蠢的错误,但我看不到它。请帮忙! 谢谢!

这里是代码

  var dataset = [ 50, 43];
  var colorSet = ['rgb(143,172,206)', 'rgb(117,122,184)'];

  var w = 260;
  var h = 200;
  var barPadding = 7;



  var svg = d3.select("body")
              .append("svg")
              .attr("width", w)
              .attr("height", h);

  var x = d3.scale.ordinal()
      .domain(dataset)
      .rangeBands([0, w - (barPadding*dataset.length)]);

  var y = d3.scale.linear()
              .domain([0, 100]) //d3.max(dataset) // <- HERE SHOULD BE d3.max(dataset) CORRECT?
              .range([0,h]);

  svg.selectAll("rect")
     .data(dataset)
     .enter()
     .append("rect")
     .attr("x", function(d, i) {
        return i * (w / dataset.length);
      })
     .attr("y",  y)                             // <-- SHOULDN'T BE HERE h - y?
     .attr("width", x.rangeBand()) 
     .attr("height", y)
     .attr("fill", function(d, i) {
        return colorSet[i];
      });


svg.append("line")
  .attr("x1", 0)
  .attr("x2", w * dataset.length)
  .attr("y1", h - 0.5)
  .attr("y2", h - 0.5)
  .style("stroke", "#000");

a link to a JSBIN

【问题讨论】:

  • 我也尝试将范围反转为 .range([h,0]);还有很多其他的东西......

标签: javascript d3.js normalization data-visualization bar-chart


【解决方案1】:

您不能对 y 位置和高度使用相同的 y 范围。

y 位置需要 range([h, 0]),高度需要 range([0, h])。

为了确认这一点,当您的数据点为 100% 时,您希望 y 位置为 0,高度为容器高度。当您的数据为 0% 时,您希望 y 位置为容器的高度,高度为 0。

【讨论】:

  • 是的,并相应地为 y 和 height 属性使用这些比例函数。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2020-07-05
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多