Skip to content

Commit

Permalink
Remove axis.tickSubdivide. Fixes #1115.
Browse files Browse the repository at this point in the history
  • Loading branch information
mbostock committed Aug 10, 2013
1 parent 23ee2c0 commit bd0ce6c
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 161 deletions.
83 changes: 25 additions & 58 deletions d3.js
Original file line number Diff line number Diff line change
Expand Up @@ -7747,13 +7747,11 @@ d3 = function() {
}
}
d3.svg.axis = function() {
var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0;
var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, tickSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
function axis(g) {
g.each(function() {
var g = d3.select(this);
var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_;
var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".tick.minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", ".tick").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1);
var tick = g.selectAll(".tick.major").data(ticks, String), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick major").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform;
var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_, tick = g.selectAll(".tick.major").data(ticks, String), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick major").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform;
var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"),
d3.transition(path));
var scale1 = scale.copy(), scale0 = this.__chart__ || scale1;
Expand All @@ -7765,12 +7763,10 @@ d3 = function() {
case "bottom":
{
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
lineEnter.attr("y2", tickMajorSize);
textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineEnter.attr("y2", tickSize);
textEnter.attr("y", Math.max(tickSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickSize, 0) + tickPadding);
text.attr("dy", ".71em").style("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
break;
Expand All @@ -7779,12 +7775,10 @@ d3 = function() {
case "top":
{
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", -tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
lineEnter.attr("y2", -tickMajorSize);
textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineEnter.attr("y2", -tickSize);
textEnter.attr("y", -(Math.max(tickSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickSize, 0) + tickPadding));
text.attr("dy", "0em").style("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
break;
Expand All @@ -7793,12 +7787,10 @@ d3 = function() {
case "left":
{
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", -tickMinorSize);
subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
lineEnter.attr("x2", -tickMajorSize);
textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
lineEnter.attr("x2", -tickSize);
textEnter.attr("x", -(Math.max(tickSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickSize, 0) + tickPadding)).attr("y", 0);
text.attr("dy", ".32em").style("text-anchor", "end");
pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
break;
Expand All @@ -7807,12 +7799,10 @@ d3 = function() {
case "right":
{
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", tickMinorSize);
subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
lineEnter.attr("x2", tickMajorSize);
textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
lineEnter.attr("x2", tickSize);
textEnter.attr("x", Math.max(tickSize, 0) + tickPadding);
lineUpdate.attr("x2", tickSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickSize, 0) + tickPadding).attr("y", 0);
text.attr("dy", ".32em").style("text-anchor", "start");
pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
break;
Expand All @@ -7828,9 +7818,6 @@ d3 = function() {
tickEnter.call(tickTransform, scale0);
tickUpdate.call(tickTransform, scale1);
tickExit.call(tickTransform, scale1);
subtickEnter.call(tickTransform, scale0);
subtickUpdate.call(tickTransform, scale1);
subtickExit.call(tickTransform, scale1);
}
});
}
Expand Down Expand Up @@ -7859,23 +7846,20 @@ d3 = function() {
tickFormat_ = x;
return axis;
};
axis.tickSize = function(x, y) {
if (!arguments.length) return tickMajorSize;
var n = arguments.length - 1;
tickMajorSize = +x;
tickMinorSize = n > 1 ? +y : tickMajorSize;
tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
axis.tickSize = function(x) {
var n = arguments.length;
if (!n) return tickSize;
tickSize = +x;
tickEndSize = +arguments[n - 1];
return axis;
};
axis.tickPadding = function(x) {
if (!arguments.length) return tickPadding;
tickPadding = +x;
return axis;
};
axis.tickSubdivide = function(x) {
if (!arguments.length) return tickSubdivide;
tickSubdivide = +x;
return axis;
axis.tickSubdivide = function() {
return arguments.length && axis;
};
return axis;
};
Expand All @@ -7895,23 +7879,6 @@ d3 = function() {
return "translate(0," + y(d) + ")";
});
}
function d3_svg_axisSubdivide(scale, ticks, m) {
subticks = [];
if (m && ticks.length > 1) {
var extent = d3_scaleExtent(scale.domain()), subticks, i = -1, n = ticks.length, d = (ticks[1] - ticks[0]) / ++m, j, v;
while (++i < n) {
for (j = m; --j > 0; ) {
if ((v = +ticks[i] - j * d) >= extent[0]) {
subticks.push(v);
}
}
}
for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1]; ) {
subticks.push(v);
}
}
return subticks;
}
d3.svg.brush = function() {
var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, resizes = d3_svg_brushResizes[0], extent = [ [ 0, 0 ], [ 0, 0 ] ], clamp = [ true, true ], extentDomain;
function brush(g) {
Expand Down
10 changes: 5 additions & 5 deletions d3.min.js

Large diffs are not rendered by default.

103 changes: 27 additions & 76 deletions src/svg/axis.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,21 @@ import "svg";
d3.svg.axis = function() {
var scale = d3.scale.linear(),
orient = d3_svg_axisDefaultOrient,
tickMajorSize = 6,
tickMinorSize = 6,
tickSize = 6,
tickEndSize = 6,
tickPadding = 3,
tickArguments_ = [10],
tickValues = null,
tickFormat_,
tickSubdivide = 0;
tickFormat_;

function axis(g) {
g.each(function() {
var g = d3.select(this);

// Ticks, or domain values for ordinal scales.
var ticks = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain()) : tickValues,
tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_;

// Minor ticks.
var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide),
subtick = g.selectAll(".tick.minor").data(subticks, String),
subtickEnter = subtick.enter().insert("line", ".tick").attr("class", "tick minor").style("opacity", 1e-6),
subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(),
subtickUpdate = d3.transition(subtick).style("opacity", 1);

// Major ticks.
var tick = g.selectAll(".tick.major").data(ticks, String),
tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_,
tick = g.selectAll(".tick.major").data(ticks, String),
tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick major").style("opacity", 1e-6),
tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(),
tickUpdate = d3.transition(tick).style("opacity", 1),
Expand Down Expand Up @@ -60,48 +49,40 @@ d3.svg.axis = function() {
switch (orient) {
case "bottom": {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
lineEnter.attr("y2", tickMajorSize);
textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
lineEnter.attr("y2", tickSize);
textEnter.attr("y", Math.max(tickSize, 0) + tickPadding);
lineUpdate.attr("x2", 0).attr("y2", tickSize);
textUpdate.attr("x", 0).attr("y", Math.max(tickSize, 0) + tickPadding);
text.attr("dy", ".71em").style("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
break;
}
case "top": {
tickTransform = d3_svg_axisX;
subtickEnter.attr("y2", -tickMinorSize);
subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
lineEnter.attr("y2", -tickMajorSize);
textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
lineEnter.attr("y2", -tickSize);
textEnter.attr("y", -(Math.max(tickSize, 0) + tickPadding));
lineUpdate.attr("x2", 0).attr("y2", -tickSize);
textUpdate.attr("x", 0).attr("y", -(Math.max(tickSize, 0) + tickPadding));
text.attr("dy", "0em").style("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
break;
}
case "left": {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", -tickMinorSize);
subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
lineEnter.attr("x2", -tickMajorSize);
textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
lineEnter.attr("x2", -tickSize);
textEnter.attr("x", -(Math.max(tickSize, 0) + tickPadding));
lineUpdate.attr("x2", -tickSize).attr("y2", 0);
textUpdate.attr("x", -(Math.max(tickSize, 0) + tickPadding)).attr("y", 0);
text.attr("dy", ".32em").style("text-anchor", "end");
pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
break;
}
case "right": {
tickTransform = d3_svg_axisY;
subtickEnter.attr("x2", tickMinorSize);
subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
lineEnter.attr("x2", tickMajorSize);
textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
lineEnter.attr("x2", tickSize);
textEnter.attr("x", Math.max(tickSize, 0) + tickPadding);
lineUpdate.attr("x2", tickSize).attr("y2", 0);
textUpdate.attr("x", Math.max(tickSize, 0) + tickPadding).attr("y", 0);
text.attr("dy", ".32em").style("text-anchor", "start");
pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
break;
Expand All @@ -125,9 +106,6 @@ d3.svg.axis = function() {
tickEnter.call(tickTransform, scale0);
tickUpdate.call(tickTransform, scale1);
tickExit.call(tickTransform, scale1);
subtickEnter.call(tickTransform, scale0);
subtickUpdate.call(tickTransform, scale1);
subtickExit.call(tickTransform, scale1);
}
});
}
Expand Down Expand Up @@ -162,12 +140,11 @@ d3.svg.axis = function() {
return axis;
};

axis.tickSize = function(x, y) {
if (!arguments.length) return tickMajorSize;
var n = arguments.length - 1;
tickMajorSize = +x;
tickMinorSize = n > 1 ? +y : tickMajorSize;
tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
axis.tickSize = function(x) {
var n = arguments.length;
if (!n) return tickSize;
tickSize = +x;
tickEndSize = +arguments[n - 1];
return axis;
};

Expand All @@ -177,10 +154,8 @@ d3.svg.axis = function() {
return axis;
};

axis.tickSubdivide = function(x) {
if (!arguments.length) return tickSubdivide;
tickSubdivide = +x;
return axis;
axis.tickSubdivide = function() {
return arguments.length && axis;
};

return axis;
Expand All @@ -196,27 +171,3 @@ function d3_svg_axisX(selection, x) {
function d3_svg_axisY(selection, y) {
selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; });
}

function d3_svg_axisSubdivide(scale, ticks, m) {
subticks = [];
if (m && ticks.length > 1) {
var extent = d3_scaleExtent(scale.domain()),
subticks,
i = -1,
n = ticks.length,
d = (ticks[1] - ticks[0]) / ++m,
j,
v;
while (++i < n) {
for (j = m; --j > 0;) {
if ((v = +ticks[i] - j * d) >= extent[0]) {
subticks.push(v);
}
}
}
for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) {
subticks.push(v);
}
}
return subticks;
}
29 changes: 7 additions & 22 deletions test/svg/axis-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,13 +195,11 @@ suite.addBatch({
path = g.selectAll("path");
assert.equal(path.attr("d"), "M0,3V0H1V3");
},
"with three arguments, specifies end and minor tick sizes": function(d3) {
var a = d3.svg.axis().tickSubdivide(3).tickSize(6, 3, 9),
g = d3.select("body").html("").append("g").call(a),
path = g.selectAll("path"),
line = g.select(".minor");
"with three arguments, specifies end tick size and ignores minor tick size": function(d3) {
var a = d3.svg.axis().tickSize(6, 3, 9),
g = d3.select("body").html("").append("svg:g").call(a),
path = g.selectAll("path");
assert.equal(path.attr("d"), "M0,9V0H1V9");
assert.equal(line.attr("y2"), "3");
}
},

Expand Down Expand Up @@ -324,24 +322,11 @@ suite.addBatch({
},

"tickSubdivide": {
"defaults to zero": function(d3) {
"is deprecated and does nothing": function(d3) {
var a = d3.svg.axis();
assert.equal(a.tickSubdivide(), 0);
},
"coerces input value to a number": function(d3) {
var a = d3.svg.axis().tickSubdivide(true);
assert.strictEqual(a.tickSubdivide(), 1);
},
"does not generate minor ticks when zero": function(d3) {
var g = d3.select("body").html("").append("g").call(d3.svg.axis());
assert.isTrue(g.selectAll(".minor").empty());
},
"affects the generated minor ticks": function(d3) {
var a = d3.svg.axis().tickSubdivide(3),
g = d3.select("body").html("").append("g").call(a),
t = g.selectAll("line.tick.minor");
assert.equal(t[0].length, 30);
assert.equal(t[0][1].getAttribute("transform"), "translate(0.05,0)");
assert.strictEqual(a.tickSubdivide(1), a);
assert.equal(a.tickSubdivide(), 0);
}
},

Expand Down

0 comments on commit bd0ce6c

Please sign in to comment.