# charts.axis
An axis as data rather than drawing: the axis line, and for each tick its
position, its mark, its label and where and how to anchor that label. Any
renderer (SVG, canvas, a PDF library, a native chart view) can draw it
without doing any arithmetic of its own, so a chart built in Python on the
server and one built in TypeScript in the browser put every tick in the same
place.
This is a group, because an axis is useless without its scale and ticks:
- `numberAxis` for a linear number scale: nice tick values inside the domain
(`charts.ticks` niceTicks), placed by `charts.scale` linearScale, labelled by
`charts.format` formatTick with just enough decimals for the step (0.1, 0.2,
0.3, never 0.30000000000000004).
- `timeAxis` for dates: `charts.ticks` picks the calendar interval (days,
weeks, months, quarters, years) that gives about `count` ticks, puts ticks on
its boundaries, and `charts.format` formatDate labels them for that interval.
- `bandAxis` for categories: a tick at the centre of each band of
`charts.scale` bandScale with the same padding as the bars.
- `axisFromTicks` builds the geometry from any positions and labels, for
scales this group does not cover (a log scale with hand-picked ticks).
- `gridLines` runs a line from each tick across the plot.
## Layout (as d3-axis)
The mark points away from the plot: down from a bottom axis, up from a top
one, left from a left axis, right from a right one, `tickSize` pixels long.
The label sits 3 pixels past the end of the mark (d3's default tick padding).
Under a bottom axis it is centred with `dominant-baseline: hanging`; above a
top axis centred on its alphabetic baseline; beside a left axis right-aligned
(`text-anchor: end`) and vertically centred; beside a right axis
left-aligned. `position` is the axis line's fixed coordinate: its y for a
bottom or top axis, its x for a left or right one.
Gridlines start on the axis line and run `length` pixels across the plot, the
opposite way to the marks.
Every pixel value is rounded to 2 decimal places by `math.round-float`, half
away from zero, so the numbers agree to the digit in every language. Labels
are not measured here: how wide text is depends on the font, which only the
renderer knows; `charts.layout` estimates widths when a layout needs them.
Source: d3-axis (github.com/d3/d3-axis), the conventions for mark direction,
padding and anchors.
1.0.1 adds tests; behaviour unchanged.