It's probably best to assume that if the attr is being set, it's changing, and
therefore we shouldn't check the original value. The caller can now use the
filter operator to optimize, if needed.
Also, change svg.mouse so that it returns an array [x, y] rather than {x, y};
this makes it easier to convert to a string, e.g., for SVG's transform
attribute. Also, optimize selection.attr so that it checks the attribute value
before setting the attribute. (I thought it would be slower to check, but
surprisingly it's not!)
The `property` action allows the setting of arbitrary properties on selected
element, such as the "value" of a form input. The `call` action invokes the
specified function, being passed the current selection (`this`) and optional
additional arguments. This makes it easier to have functions which define sets
of actions, and then apply those actions to any number of selections, similar
to mixin inheritance.
It's a lot more predictable if we always use selectAll to determine the parent
node for a given group, rather than trying to infer parent nodes per node
during select.
The tick format function doesn't have to be used with ticks, though. It's also
for convenient for determining an appropriate precision for any value label.
Previously, the tweens would not be initialized until the first tick, after a
minimum delay. It's more predictable if we initialize them during the initial
apply, especially if the tweens depend on external state (such as scales) that
may change after the transition has started.
If the select doesn't find any results, `o.node` is null, so we shouldn't run
any normal actions on it. But we still want to run the data action on it (to
generate the enter selection), so the fix is a bit more complicated than this.
This includes only the quantitative scale functions, which is primarily the
linear scale. Also included are `log` and `pow` scales, which are simple
transforms of linear scales. All the scale functions use the existing
interpolator logic, so you can specify an output range of numbers, colors,
fonts, paths... pretty much anything.