tracks and traces

Rendering multiple axes in D3.js

Last week, I needed to add many axes to a single D3 svg. I had a set of sets of data points, and I wanted each of these sets of data to be rendered with its own x and y axes.

To do this, I wrote the following:

  var locationArea = bar.append("g")
      .attr("transform", function(d) { return "translate(200," + 24*(+d.length) + ")"; })
      .attr("class", function(d, i) { return "locations n_".concat(i) });

  var locationXAxes = locationArea
    .each(function (d, i) {

      var lat_scale = d3.scale.linear()
                      .range([-50, 50])
                      .domain([d3.min(d.locations, function(d) { return d[0]; }),
                               d3.max(d.locations, function(d) { return d[0]; })]);

      var axis = d3.svg.axis()
        .scale(lat_scale)
        .orient("bottom")
        .ticks(3);

      d3.selectAll(".n_".concat(i)).append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0, 60)")
        .call(axis);
    });

For each set of data points, a new D3 scale is created, and a new axis is created from that scale. Then, the group created previously is selected and the axis is appended to that specific group.

There’s probably a better way to do this, but this worked.