d3条形图轴对齐

kyr*_*rre 2 d3.js

我 在绘制条形图时尝试使用http://bl.ocks.org/mbostock/3019563中描述的边距约定.但是,如您在此基本示例中所示,条形图不与x轴对齐:http://bl.ocks.org/kyrre/bbd29f225173825797e3.我究竟做错了什么?

var data = [
            {x: "Differential Geometry", y: 10},
            {x: "Statistical Physics",   y: 5},
            {x: "Music", y: 3}
           ]


var margin = {top: 20, right: 10, bottom: 20, left: 50};

var width = 500 - margin.left - margin.right;
var height = 320 - margin.top - margin.bottom;

var y = d3.scale.linear()
          .domain([0, d3.max(data, function(x) {
              return x.y;
          })])
          .range([0, height]);

var x = d3.scale.ordinal()
          .domain(_.map(data, function(d) { return d.x;}))
          .rangeRoundBands([0, width], 0.10);

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

var yAxis = d3.svg.axis()
            .scale(y)
            .orient("left");



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 rect = svg.selectAll("rect")
              .data(data)
              .enter()
              .append("rect")
              .attr("x", function(d) {
                    return x(d.x);
              })
              .attr("y", 0)
              .attr("height", function(d) {
                  return y(d.y);
              })
              .attr("fill", function(d) { return "blue";})
              .attr("width", 20);

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

svg.append("g")
   .attr("class", "y axis")
   .attr("transform", "translate(0,0)")
   .call(yAxis);
Run Code Online (Sandbox Code Playgroud)

Lar*_*off 5

y坐标是从上数(即,0是在图像的顶部).如果设置y为总减去高度,它应该可以工作.

.attr("y", function(d) { return (height - y(d.y)); })
Run Code Online (Sandbox Code Playgroud)

  • 原来如此.在我看来,标签是正确放置的,但条形图有点偏离 - 确切地说是"x.rangeBand()/ 2".尝试将其添加到条形的"x"值. (3认同)