1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
//! Scale layer — domain (data space) <-> normalized `[0, 1]` <-> (via
//! [`crate::coord::PlotArea`]) screen pixels.
//!
//! One [`Scale`] trait, six domain<->normalized-range implementations:
//! [`LinearScale`], [`LogScale`], [`BandScale`], [`TimeScale`]
//! (calendar-aware tick generation, harvested from mlc's ~1900-line module
//! — see [`mod@time`]'s own docs for exactly what was ported/dropped),
//! [`SymlogScale`] (linear near zero, log beyond — the scale [`LogScale`]
//! cannot substitute for once data crosses zero or goes negative; see
//! [`mod@symlog`]'s own docs), and [`PowScale`] (sign-preserving exponent
//! mapping, e.g. [`PowScale::sqrt`] for area-to-value bubble-radius
//! encoding; see [`mod@pow`]'s own docs).
//!
//! [`color::ColorScale`] is a DIFFERENT kind of scale — continuous value
//! -> CSS hex color (not -> normalized `[0, 1]`), so it does not implement
//! [`Scale`] itself; it lives in this module because it's still a
//! domain-mapping primitive over the same "figures need a value ->
//! something" shape, driving heatmap/business-chart color encoding (see
//! `color`'s own module docs for the OKLCH machinery it reuses).
//! [`color::CategoricalScale`] is the DISCRETE sibling of `ColorScale` —
//! value(index) -> one of N distinct category hues, never interpolated
//! (see `color`'s own module doc for why it's a separate type).
//!
//! [`bin::ClassScale`] (implemented by [`bin::QuantizeScale`]/
//! [`bin::ThresholdScale`]/[`bin::QuantileScale`]) is a FOURTH kind of
//! primitive — continuous value -> discrete class INDEX (not -> `[0, 1]`,
//! not -> color) — the foundation for risk/class colouring and for a
//! legend that reads as classes rather than a ramp; see [`mod@bin`]'s own
//! docs for the three flavors and the output-type justification.
//!
//! [`format::NumberFormat`] is a FIFTH kind of primitive again — value ->
//! display STRING (not -> `[0, 1]`, not -> color, not -> class index) —
//! used by axis tick labels ([`crate::guide::axis::draw_x_axis_formatted`]/
//! `draw_y_axis_formatted`) and any other caller wanting Si/Percent/
//! Currency-formatted numbers instead of this crate's default thousands-
//! grouped decimal (see `format`'s own module docs).
pub use BandScale;
pub use ;
pub use ;
pub use NumberFormat;
pub use LinearScale;
pub use LogScale;
pub use PowScale;
pub use SymlogScale;
pub use TimeScale;
/// One tick mark: a domain value plus its display label.
/// How strongly [`crate::guide::axis`]'s label-COLLISION skip should
/// PROTECT this tick's own label from being dropped when it overlaps a
/// neighbor — a SEPARATE, independent concern from [`Scale::tick_weight`]'s
/// existing visual-STYLE weight ([`crate::guide::axis::AxisTickWeightStyle`]'s
/// tick length/stroke width/major label color, a rendering-LOOK question
/// only reachable through the OPT-IN `_weighted` entry points).
/// [`TickPriority`] governs WHICH label survives a collision on the
/// DEFAULT, always-on entry points (`draw_x_axis`/`draw_y_axis`/
/// `draw_x_axis_overflow`) — a rendering-CORRECTNESS question: the defect
/// this type fixes is a [`crate::scale::SymlogScale`] axis silently
/// dropping its own `0.0` zero-crossing tick to a merely-intermediate
/// neighbor, with no notion that some ticks matter more than others. See
/// [`crate::guide::axis::resolve_label_priority`] for the exact
/// three-tier degrade order this drives.
/// Domain <-> normalized-range mapping, shared by every mark/guide draw
/// function through [`crate::coord::PlotArea`] — design law #1 (one
/// transform for render, and for any future hit-test).