d3-scale.js 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165
  1. // https://d3js.org/d3-scale/ v2.2.2 Copyright 2019 Mike Bostock
  2. (function (global, factory) {
  3. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) :
  4. typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) :
  5. (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));
  6. }(this, (function (exports,d3Collection,d3Array,d3Interpolate,d3Format,d3Time,d3TimeFormat) { 'use strict';
  7. function initRange(domain, range) {
  8. switch (arguments.length) {
  9. case 0: break;
  10. case 1: this.range(domain); break;
  11. default: this.range(range).domain(domain); break;
  12. }
  13. return this;
  14. }
  15. function initInterpolator(domain, interpolator) {
  16. switch (arguments.length) {
  17. case 0: break;
  18. case 1: this.interpolator(domain); break;
  19. default: this.interpolator(interpolator).domain(domain); break;
  20. }
  21. return this;
  22. }
  23. var array = Array.prototype;
  24. var map = array.map;
  25. var slice = array.slice;
  26. var implicit = {name: "implicit"};
  27. function ordinal() {
  28. var index = d3Collection.map(),
  29. domain = [],
  30. range = [],
  31. unknown = implicit;
  32. function scale(d) {
  33. var key = d + "", i = index.get(key);
  34. if (!i) {
  35. if (unknown !== implicit) return unknown;
  36. index.set(key, i = domain.push(d));
  37. }
  38. return range[(i - 1) % range.length];
  39. }
  40. scale.domain = function(_) {
  41. if (!arguments.length) return domain.slice();
  42. domain = [], index = d3Collection.map();
  43. var i = -1, n = _.length, d, key;
  44. while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
  45. return scale;
  46. };
  47. scale.range = function(_) {
  48. return arguments.length ? (range = slice.call(_), scale) : range.slice();
  49. };
  50. scale.unknown = function(_) {
  51. return arguments.length ? (unknown = _, scale) : unknown;
  52. };
  53. scale.copy = function() {
  54. return ordinal(domain, range).unknown(unknown);
  55. };
  56. initRange.apply(scale, arguments);
  57. return scale;
  58. }
  59. function band() {
  60. var scale = ordinal().unknown(undefined),
  61. domain = scale.domain,
  62. ordinalRange = scale.range,
  63. range = [0, 1],
  64. step,
  65. bandwidth,
  66. round = false,
  67. paddingInner = 0,
  68. paddingOuter = 0,
  69. align = 0.5;
  70. delete scale.unknown;
  71. function rescale() {
  72. var n = domain().length,
  73. reverse = range[1] < range[0],
  74. start = range[reverse - 0],
  75. stop = range[1 - reverse];
  76. step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
  77. if (round) step = Math.floor(step);
  78. start += (stop - start - step * (n - paddingInner)) * align;
  79. bandwidth = step * (1 - paddingInner);
  80. if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
  81. var values = d3Array.range(n).map(function(i) { return start + step * i; });
  82. return ordinalRange(reverse ? values.reverse() : values);
  83. }
  84. scale.domain = function(_) {
  85. return arguments.length ? (domain(_), rescale()) : domain();
  86. };
  87. scale.range = function(_) {
  88. return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
  89. };
  90. scale.rangeRound = function(_) {
  91. return range = [+_[0], +_[1]], round = true, rescale();
  92. };
  93. scale.bandwidth = function() {
  94. return bandwidth;
  95. };
  96. scale.step = function() {
  97. return step;
  98. };
  99. scale.round = function(_) {
  100. return arguments.length ? (round = !!_, rescale()) : round;
  101. };
  102. scale.padding = function(_) {
  103. return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
  104. };
  105. scale.paddingInner = function(_) {
  106. return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
  107. };
  108. scale.paddingOuter = function(_) {
  109. return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
  110. };
  111. scale.align = function(_) {
  112. return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
  113. };
  114. scale.copy = function() {
  115. return band(domain(), range)
  116. .round(round)
  117. .paddingInner(paddingInner)
  118. .paddingOuter(paddingOuter)
  119. .align(align);
  120. };
  121. return initRange.apply(rescale(), arguments);
  122. }
  123. function pointish(scale) {
  124. var copy = scale.copy;
  125. scale.padding = scale.paddingOuter;
  126. delete scale.paddingInner;
  127. delete scale.paddingOuter;
  128. scale.copy = function() {
  129. return pointish(copy());
  130. };
  131. return scale;
  132. }
  133. function point() {
  134. return pointish(band.apply(null, arguments).paddingInner(1));
  135. }
  136. function constant(x) {
  137. return function() {
  138. return x;
  139. };
  140. }
  141. function number(x) {
  142. return +x;
  143. }
  144. var unit = [0, 1];
  145. function identity(x) {
  146. return x;
  147. }
  148. function normalize(a, b) {
  149. return (b -= (a = +a))
  150. ? function(x) { return (x - a) / b; }
  151. : constant(isNaN(b) ? NaN : 0.5);
  152. }
  153. function clamper(domain) {
  154. var a = domain[0], b = domain[domain.length - 1], t;
  155. if (a > b) t = a, a = b, b = t;
  156. return function(x) { return Math.max(a, Math.min(b, x)); };
  157. }
  158. // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
  159. // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
  160. function bimap(domain, range, interpolate) {
  161. var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
  162. if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
  163. else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
  164. return function(x) { return r0(d0(x)); };
  165. }
  166. function polymap(domain, range, interpolate) {
  167. var j = Math.min(domain.length, range.length) - 1,
  168. d = new Array(j),
  169. r = new Array(j),
  170. i = -1;
  171. // Reverse descending domains.
  172. if (domain[j] < domain[0]) {
  173. domain = domain.slice().reverse();
  174. range = range.slice().reverse();
  175. }
  176. while (++i < j) {
  177. d[i] = normalize(domain[i], domain[i + 1]);
  178. r[i] = interpolate(range[i], range[i + 1]);
  179. }
  180. return function(x) {
  181. var i = d3Array.bisect(domain, x, 1, j) - 1;
  182. return r[i](d[i](x));
  183. };
  184. }
  185. function copy(source, target) {
  186. return target
  187. .domain(source.domain())
  188. .range(source.range())
  189. .interpolate(source.interpolate())
  190. .clamp(source.clamp())
  191. .unknown(source.unknown());
  192. }
  193. function transformer() {
  194. var domain = unit,
  195. range = unit,
  196. interpolate = d3Interpolate.interpolate,
  197. transform,
  198. untransform,
  199. unknown,
  200. clamp = identity,
  201. piecewise,
  202. output,
  203. input;
  204. function rescale() {
  205. piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
  206. output = input = null;
  207. return scale;
  208. }
  209. function scale(x) {
  210. return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
  211. }
  212. scale.invert = function(y) {
  213. return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y)));
  214. };
  215. scale.domain = function(_) {
  216. return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();
  217. };
  218. scale.range = function(_) {
  219. return arguments.length ? (range = slice.call(_), rescale()) : range.slice();
  220. };
  221. scale.rangeRound = function(_) {
  222. return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale();
  223. };
  224. scale.clamp = function(_) {
  225. return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;
  226. };
  227. scale.interpolate = function(_) {
  228. return arguments.length ? (interpolate = _, rescale()) : interpolate;
  229. };
  230. scale.unknown = function(_) {
  231. return arguments.length ? (unknown = _, scale) : unknown;
  232. };
  233. return function(t, u) {
  234. transform = t, untransform = u;
  235. return rescale();
  236. };
  237. }
  238. function continuous(transform, untransform) {
  239. return transformer()(transform, untransform);
  240. }
  241. function tickFormat(start, stop, count, specifier) {
  242. var step = d3Array.tickStep(start, stop, count),
  243. precision;
  244. specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier);
  245. switch (specifier.type) {
  246. case "s": {
  247. var value = Math.max(Math.abs(start), Math.abs(stop));
  248. if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision;
  249. return d3Format.formatPrefix(specifier, value);
  250. }
  251. case "":
  252. case "e":
  253. case "g":
  254. case "p":
  255. case "r": {
  256. if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
  257. break;
  258. }
  259. case "f":
  260. case "%": {
  261. if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
  262. break;
  263. }
  264. }
  265. return d3Format.format(specifier);
  266. }
  267. function linearish(scale) {
  268. var domain = scale.domain;
  269. scale.ticks = function(count) {
  270. var d = domain();
  271. return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count);
  272. };
  273. scale.tickFormat = function(count, specifier) {
  274. var d = domain();
  275. return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
  276. };
  277. scale.nice = function(count) {
  278. if (count == null) count = 10;
  279. var d = domain(),
  280. i0 = 0,
  281. i1 = d.length - 1,
  282. start = d[i0],
  283. stop = d[i1],
  284. step;
  285. if (stop < start) {
  286. step = start, start = stop, stop = step;
  287. step = i0, i0 = i1, i1 = step;
  288. }
  289. step = d3Array.tickIncrement(start, stop, count);
  290. if (step > 0) {
  291. start = Math.floor(start / step) * step;
  292. stop = Math.ceil(stop / step) * step;
  293. step = d3Array.tickIncrement(start, stop, count);
  294. } else if (step < 0) {
  295. start = Math.ceil(start * step) / step;
  296. stop = Math.floor(stop * step) / step;
  297. step = d3Array.tickIncrement(start, stop, count);
  298. }
  299. if (step > 0) {
  300. d[i0] = Math.floor(start / step) * step;
  301. d[i1] = Math.ceil(stop / step) * step;
  302. domain(d);
  303. } else if (step < 0) {
  304. d[i0] = Math.ceil(start * step) / step;
  305. d[i1] = Math.floor(stop * step) / step;
  306. domain(d);
  307. }
  308. return scale;
  309. };
  310. return scale;
  311. }
  312. function linear() {
  313. var scale = continuous(identity, identity);
  314. scale.copy = function() {
  315. return copy(scale, linear());
  316. };
  317. initRange.apply(scale, arguments);
  318. return linearish(scale);
  319. }
  320. function identity$1(domain) {
  321. var unknown;
  322. function scale(x) {
  323. return isNaN(x = +x) ? unknown : x;
  324. }
  325. scale.invert = scale;
  326. scale.domain = scale.range = function(_) {
  327. return arguments.length ? (domain = map.call(_, number), scale) : domain.slice();
  328. };
  329. scale.unknown = function(_) {
  330. return arguments.length ? (unknown = _, scale) : unknown;
  331. };
  332. scale.copy = function() {
  333. return identity$1(domain).unknown(unknown);
  334. };
  335. domain = arguments.length ? map.call(domain, number) : [0, 1];
  336. return linearish(scale);
  337. }
  338. function nice(domain, interval) {
  339. domain = domain.slice();
  340. var i0 = 0,
  341. i1 = domain.length - 1,
  342. x0 = domain[i0],
  343. x1 = domain[i1],
  344. t;
  345. if (x1 < x0) {
  346. t = i0, i0 = i1, i1 = t;
  347. t = x0, x0 = x1, x1 = t;
  348. }
  349. domain[i0] = interval.floor(x0);
  350. domain[i1] = interval.ceil(x1);
  351. return domain;
  352. }
  353. function transformLog(x) {
  354. return Math.log(x);
  355. }
  356. function transformExp(x) {
  357. return Math.exp(x);
  358. }
  359. function transformLogn(x) {
  360. return -Math.log(-x);
  361. }
  362. function transformExpn(x) {
  363. return -Math.exp(-x);
  364. }
  365. function pow10(x) {
  366. return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
  367. }
  368. function powp(base) {
  369. return base === 10 ? pow10
  370. : base === Math.E ? Math.exp
  371. : function(x) { return Math.pow(base, x); };
  372. }
  373. function logp(base) {
  374. return base === Math.E ? Math.log
  375. : base === 10 && Math.log10
  376. || base === 2 && Math.log2
  377. || (base = Math.log(base), function(x) { return Math.log(x) / base; });
  378. }
  379. function reflect(f) {
  380. return function(x) {
  381. return -f(-x);
  382. };
  383. }
  384. function loggish(transform) {
  385. var scale = transform(transformLog, transformExp),
  386. domain = scale.domain,
  387. base = 10,
  388. logs,
  389. pows;
  390. function rescale() {
  391. logs = logp(base), pows = powp(base);
  392. if (domain()[0] < 0) {
  393. logs = reflect(logs), pows = reflect(pows);
  394. transform(transformLogn, transformExpn);
  395. } else {
  396. transform(transformLog, transformExp);
  397. }
  398. return scale;
  399. }
  400. scale.base = function(_) {
  401. return arguments.length ? (base = +_, rescale()) : base;
  402. };
  403. scale.domain = function(_) {
  404. return arguments.length ? (domain(_), rescale()) : domain();
  405. };
  406. scale.ticks = function(count) {
  407. var d = domain(),
  408. u = d[0],
  409. v = d[d.length - 1],
  410. r;
  411. if (r = v < u) i = u, u = v, v = i;
  412. var i = logs(u),
  413. j = logs(v),
  414. p,
  415. k,
  416. t,
  417. n = count == null ? 10 : +count,
  418. z = [];
  419. if (!(base % 1) && j - i < n) {
  420. i = Math.round(i) - 1, j = Math.round(j) + 1;
  421. if (u > 0) for (; i < j; ++i) {
  422. for (k = 1, p = pows(i); k < base; ++k) {
  423. t = p * k;
  424. if (t < u) continue;
  425. if (t > v) break;
  426. z.push(t);
  427. }
  428. } else for (; i < j; ++i) {
  429. for (k = base - 1, p = pows(i); k >= 1; --k) {
  430. t = p * k;
  431. if (t < u) continue;
  432. if (t > v) break;
  433. z.push(t);
  434. }
  435. }
  436. } else {
  437. z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows);
  438. }
  439. return r ? z.reverse() : z;
  440. };
  441. scale.tickFormat = function(count, specifier) {
  442. if (specifier == null) specifier = base === 10 ? ".0e" : ",";
  443. if (typeof specifier !== "function") specifier = d3Format.format(specifier);
  444. if (count === Infinity) return specifier;
  445. if (count == null) count = 10;
  446. var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
  447. return function(d) {
  448. var i = d / pows(Math.round(logs(d)));
  449. if (i * base < base - 0.5) i *= base;
  450. return i <= k ? specifier(d) : "";
  451. };
  452. };
  453. scale.nice = function() {
  454. return domain(nice(domain(), {
  455. floor: function(x) { return pows(Math.floor(logs(x))); },
  456. ceil: function(x) { return pows(Math.ceil(logs(x))); }
  457. }));
  458. };
  459. return scale;
  460. }
  461. function log() {
  462. var scale = loggish(transformer()).domain([1, 10]);
  463. scale.copy = function() {
  464. return copy(scale, log()).base(scale.base());
  465. };
  466. initRange.apply(scale, arguments);
  467. return scale;
  468. }
  469. function transformSymlog(c) {
  470. return function(x) {
  471. return Math.sign(x) * Math.log1p(Math.abs(x / c));
  472. };
  473. }
  474. function transformSymexp(c) {
  475. return function(x) {
  476. return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
  477. };
  478. }
  479. function symlogish(transform) {
  480. var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
  481. scale.constant = function(_) {
  482. return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
  483. };
  484. return linearish(scale);
  485. }
  486. function symlog() {
  487. var scale = symlogish(transformer());
  488. scale.copy = function() {
  489. return copy(scale, symlog()).constant(scale.constant());
  490. };
  491. return initRange.apply(scale, arguments);
  492. }
  493. function transformPow(exponent) {
  494. return function(x) {
  495. return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
  496. };
  497. }
  498. function transformSqrt(x) {
  499. return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
  500. }
  501. function transformSquare(x) {
  502. return x < 0 ? -x * x : x * x;
  503. }
  504. function powish(transform) {
  505. var scale = transform(identity, identity),
  506. exponent = 1;
  507. function rescale() {
  508. return exponent === 1 ? transform(identity, identity)
  509. : exponent === 0.5 ? transform(transformSqrt, transformSquare)
  510. : transform(transformPow(exponent), transformPow(1 / exponent));
  511. }
  512. scale.exponent = function(_) {
  513. return arguments.length ? (exponent = +_, rescale()) : exponent;
  514. };
  515. return linearish(scale);
  516. }
  517. function pow() {
  518. var scale = powish(transformer());
  519. scale.copy = function() {
  520. return copy(scale, pow()).exponent(scale.exponent());
  521. };
  522. initRange.apply(scale, arguments);
  523. return scale;
  524. }
  525. function sqrt() {
  526. return pow.apply(null, arguments).exponent(0.5);
  527. }
  528. function quantile() {
  529. var domain = [],
  530. range = [],
  531. thresholds = [],
  532. unknown;
  533. function rescale() {
  534. var i = 0, n = Math.max(1, range.length);
  535. thresholds = new Array(n - 1);
  536. while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n);
  537. return scale;
  538. }
  539. function scale(x) {
  540. return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)];
  541. }
  542. scale.invertExtent = function(y) {
  543. var i = range.indexOf(y);
  544. return i < 0 ? [NaN, NaN] : [
  545. i > 0 ? thresholds[i - 1] : domain[0],
  546. i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
  547. ];
  548. };
  549. scale.domain = function(_) {
  550. if (!arguments.length) return domain.slice();
  551. domain = [];
  552. for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
  553. domain.sort(d3Array.ascending);
  554. return rescale();
  555. };
  556. scale.range = function(_) {
  557. return arguments.length ? (range = slice.call(_), rescale()) : range.slice();
  558. };
  559. scale.unknown = function(_) {
  560. return arguments.length ? (unknown = _, scale) : unknown;
  561. };
  562. scale.quantiles = function() {
  563. return thresholds.slice();
  564. };
  565. scale.copy = function() {
  566. return quantile()
  567. .domain(domain)
  568. .range(range)
  569. .unknown(unknown);
  570. };
  571. return initRange.apply(scale, arguments);
  572. }
  573. function quantize() {
  574. var x0 = 0,
  575. x1 = 1,
  576. n = 1,
  577. domain = [0.5],
  578. range = [0, 1],
  579. unknown;
  580. function scale(x) {
  581. return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown;
  582. }
  583. function rescale() {
  584. var i = -1;
  585. domain = new Array(n);
  586. while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
  587. return scale;
  588. }
  589. scale.domain = function(_) {
  590. return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
  591. };
  592. scale.range = function(_) {
  593. return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();
  594. };
  595. scale.invertExtent = function(y) {
  596. var i = range.indexOf(y);
  597. return i < 0 ? [NaN, NaN]
  598. : i < 1 ? [x0, domain[0]]
  599. : i >= n ? [domain[n - 1], x1]
  600. : [domain[i - 1], domain[i]];
  601. };
  602. scale.unknown = function(_) {
  603. return arguments.length ? (unknown = _, scale) : scale;
  604. };
  605. scale.thresholds = function() {
  606. return domain.slice();
  607. };
  608. scale.copy = function() {
  609. return quantize()
  610. .domain([x0, x1])
  611. .range(range)
  612. .unknown(unknown);
  613. };
  614. return initRange.apply(linearish(scale), arguments);
  615. }
  616. function threshold() {
  617. var domain = [0.5],
  618. range = [0, 1],
  619. unknown,
  620. n = 1;
  621. function scale(x) {
  622. return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown;
  623. }
  624. scale.domain = function(_) {
  625. return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
  626. };
  627. scale.range = function(_) {
  628. return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
  629. };
  630. scale.invertExtent = function(y) {
  631. var i = range.indexOf(y);
  632. return [domain[i - 1], domain[i]];
  633. };
  634. scale.unknown = function(_) {
  635. return arguments.length ? (unknown = _, scale) : unknown;
  636. };
  637. scale.copy = function() {
  638. return threshold()
  639. .domain(domain)
  640. .range(range)
  641. .unknown(unknown);
  642. };
  643. return initRange.apply(scale, arguments);
  644. }
  645. var durationSecond = 1000,
  646. durationMinute = durationSecond * 60,
  647. durationHour = durationMinute * 60,
  648. durationDay = durationHour * 24,
  649. durationWeek = durationDay * 7,
  650. durationMonth = durationDay * 30,
  651. durationYear = durationDay * 365;
  652. function date(t) {
  653. return new Date(t);
  654. }
  655. function number$1(t) {
  656. return t instanceof Date ? +t : +new Date(+t);
  657. }
  658. function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
  659. var scale = continuous(identity, identity),
  660. invert = scale.invert,
  661. domain = scale.domain;
  662. var formatMillisecond = format(".%L"),
  663. formatSecond = format(":%S"),
  664. formatMinute = format("%I:%M"),
  665. formatHour = format("%I %p"),
  666. formatDay = format("%a %d"),
  667. formatWeek = format("%b %d"),
  668. formatMonth = format("%B"),
  669. formatYear = format("%Y");
  670. var tickIntervals = [
  671. [second, 1, durationSecond],
  672. [second, 5, 5 * durationSecond],
  673. [second, 15, 15 * durationSecond],
  674. [second, 30, 30 * durationSecond],
  675. [minute, 1, durationMinute],
  676. [minute, 5, 5 * durationMinute],
  677. [minute, 15, 15 * durationMinute],
  678. [minute, 30, 30 * durationMinute],
  679. [ hour, 1, durationHour ],
  680. [ hour, 3, 3 * durationHour ],
  681. [ hour, 6, 6 * durationHour ],
  682. [ hour, 12, 12 * durationHour ],
  683. [ day, 1, durationDay ],
  684. [ day, 2, 2 * durationDay ],
  685. [ week, 1, durationWeek ],
  686. [ month, 1, durationMonth ],
  687. [ month, 3, 3 * durationMonth ],
  688. [ year, 1, durationYear ]
  689. ];
  690. function tickFormat(date) {
  691. return (second(date) < date ? formatMillisecond
  692. : minute(date) < date ? formatSecond
  693. : hour(date) < date ? formatMinute
  694. : day(date) < date ? formatHour
  695. : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
  696. : year(date) < date ? formatMonth
  697. : formatYear)(date);
  698. }
  699. function tickInterval(interval, start, stop, step) {
  700. if (interval == null) interval = 10;
  701. // If a desired tick count is specified, pick a reasonable tick interval
  702. // based on the extent of the domain and a rough estimate of tick size.
  703. // Otherwise, assume interval is already a time interval and use it.
  704. if (typeof interval === "number") {
  705. var target = Math.abs(stop - start) / interval,
  706. i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target);
  707. if (i === tickIntervals.length) {
  708. step = d3Array.tickStep(start / durationYear, stop / durationYear, interval);
  709. interval = year;
  710. } else if (i) {
  711. i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
  712. step = i[1];
  713. interval = i[0];
  714. } else {
  715. step = Math.max(d3Array.tickStep(start, stop, interval), 1);
  716. interval = millisecond;
  717. }
  718. }
  719. return step == null ? interval : interval.every(step);
  720. }
  721. scale.invert = function(y) {
  722. return new Date(invert(y));
  723. };
  724. scale.domain = function(_) {
  725. return arguments.length ? domain(map.call(_, number$1)) : domain().map(date);
  726. };
  727. scale.ticks = function(interval, step) {
  728. var d = domain(),
  729. t0 = d[0],
  730. t1 = d[d.length - 1],
  731. r = t1 < t0,
  732. t;
  733. if (r) t = t0, t0 = t1, t1 = t;
  734. t = tickInterval(interval, t0, t1, step);
  735. t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
  736. return r ? t.reverse() : t;
  737. };
  738. scale.tickFormat = function(count, specifier) {
  739. return specifier == null ? tickFormat : format(specifier);
  740. };
  741. scale.nice = function(interval, step) {
  742. var d = domain();
  743. return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
  744. ? domain(nice(d, interval))
  745. : scale;
  746. };
  747. scale.copy = function() {
  748. return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
  749. };
  750. return scale;
  751. }
  752. function time() {
  753. return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);
  754. }
  755. function utcTime() {
  756. return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);
  757. }
  758. function transformer$1() {
  759. var x0 = 0,
  760. x1 = 1,
  761. t0,
  762. t1,
  763. k10,
  764. transform,
  765. interpolator = identity,
  766. clamp = false,
  767. unknown;
  768. function scale(x) {
  769. return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
  770. }
  771. scale.domain = function(_) {
  772. return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
  773. };
  774. scale.clamp = function(_) {
  775. return arguments.length ? (clamp = !!_, scale) : clamp;
  776. };
  777. scale.interpolator = function(_) {
  778. return arguments.length ? (interpolator = _, scale) : interpolator;
  779. };
  780. scale.unknown = function(_) {
  781. return arguments.length ? (unknown = _, scale) : unknown;
  782. };
  783. return function(t) {
  784. transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
  785. return scale;
  786. };
  787. }
  788. function copy$1(source, target) {
  789. return target
  790. .domain(source.domain())
  791. .interpolator(source.interpolator())
  792. .clamp(source.clamp())
  793. .unknown(source.unknown());
  794. }
  795. function sequential() {
  796. var scale = linearish(transformer$1()(identity));
  797. scale.copy = function() {
  798. return copy$1(scale, sequential());
  799. };
  800. return initInterpolator.apply(scale, arguments);
  801. }
  802. function sequentialLog() {
  803. var scale = loggish(transformer$1()).domain([1, 10]);
  804. scale.copy = function() {
  805. return copy$1(scale, sequentialLog()).base(scale.base());
  806. };
  807. return initInterpolator.apply(scale, arguments);
  808. }
  809. function sequentialSymlog() {
  810. var scale = symlogish(transformer$1());
  811. scale.copy = function() {
  812. return copy$1(scale, sequentialSymlog()).constant(scale.constant());
  813. };
  814. return initInterpolator.apply(scale, arguments);
  815. }
  816. function sequentialPow() {
  817. var scale = powish(transformer$1());
  818. scale.copy = function() {
  819. return copy$1(scale, sequentialPow()).exponent(scale.exponent());
  820. };
  821. return initInterpolator.apply(scale, arguments);
  822. }
  823. function sequentialSqrt() {
  824. return sequentialPow.apply(null, arguments).exponent(0.5);
  825. }
  826. function sequentialQuantile() {
  827. var domain = [],
  828. interpolator = identity;
  829. function scale(x) {
  830. if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x) - 1) / (domain.length - 1));
  831. }
  832. scale.domain = function(_) {
  833. if (!arguments.length) return domain.slice();
  834. domain = [];
  835. for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
  836. domain.sort(d3Array.ascending);
  837. return scale;
  838. };
  839. scale.interpolator = function(_) {
  840. return arguments.length ? (interpolator = _, scale) : interpolator;
  841. };
  842. scale.copy = function() {
  843. return sequentialQuantile(interpolator).domain(domain);
  844. };
  845. return initInterpolator.apply(scale, arguments);
  846. }
  847. function transformer$2() {
  848. var x0 = 0,
  849. x1 = 0.5,
  850. x2 = 1,
  851. t0,
  852. t1,
  853. t2,
  854. k10,
  855. k21,
  856. interpolator = identity,
  857. transform,
  858. clamp = false,
  859. unknown;
  860. function scale(x) {
  861. return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
  862. }
  863. scale.domain = function(_) {
  864. return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];
  865. };
  866. scale.clamp = function(_) {
  867. return arguments.length ? (clamp = !!_, scale) : clamp;
  868. };
  869. scale.interpolator = function(_) {
  870. return arguments.length ? (interpolator = _, scale) : interpolator;
  871. };
  872. scale.unknown = function(_) {
  873. return arguments.length ? (unknown = _, scale) : unknown;
  874. };
  875. return function(t) {
  876. transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);
  877. return scale;
  878. };
  879. }
  880. function diverging() {
  881. var scale = linearish(transformer$2()(identity));
  882. scale.copy = function() {
  883. return copy$1(scale, diverging());
  884. };
  885. return initInterpolator.apply(scale, arguments);
  886. }
  887. function divergingLog() {
  888. var scale = loggish(transformer$2()).domain([0.1, 1, 10]);
  889. scale.copy = function() {
  890. return copy$1(scale, divergingLog()).base(scale.base());
  891. };
  892. return initInterpolator.apply(scale, arguments);
  893. }
  894. function divergingSymlog() {
  895. var scale = symlogish(transformer$2());
  896. scale.copy = function() {
  897. return copy$1(scale, divergingSymlog()).constant(scale.constant());
  898. };
  899. return initInterpolator.apply(scale, arguments);
  900. }
  901. function divergingPow() {
  902. var scale = powish(transformer$2());
  903. scale.copy = function() {
  904. return copy$1(scale, divergingPow()).exponent(scale.exponent());
  905. };
  906. return initInterpolator.apply(scale, arguments);
  907. }
  908. function divergingSqrt() {
  909. return divergingPow.apply(null, arguments).exponent(0.5);
  910. }
  911. exports.scaleBand = band;
  912. exports.scalePoint = point;
  913. exports.scaleIdentity = identity$1;
  914. exports.scaleLinear = linear;
  915. exports.scaleLog = log;
  916. exports.scaleSymlog = symlog;
  917. exports.scaleOrdinal = ordinal;
  918. exports.scaleImplicit = implicit;
  919. exports.scalePow = pow;
  920. exports.scaleSqrt = sqrt;
  921. exports.scaleQuantile = quantile;
  922. exports.scaleQuantize = quantize;
  923. exports.scaleThreshold = threshold;
  924. exports.scaleTime = time;
  925. exports.scaleUtc = utcTime;
  926. exports.scaleSequential = sequential;
  927. exports.scaleSequentialLog = sequentialLog;
  928. exports.scaleSequentialPow = sequentialPow;
  929. exports.scaleSequentialSqrt = sequentialSqrt;
  930. exports.scaleSequentialSymlog = sequentialSymlog;
  931. exports.scaleSequentialQuantile = sequentialQuantile;
  932. exports.scaleDiverging = diverging;
  933. exports.scaleDivergingLog = divergingLog;
  934. exports.scaleDivergingPow = divergingPow;
  935. exports.scaleDivergingSqrt = divergingSqrt;
  936. exports.scaleDivergingSymlog = divergingSymlog;
  937. exports.tickFormat = tickFormat;
  938. Object.defineProperty(exports, '__esModule', { value: true });
  939. })));