You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

901 lines
24 KiB

1 year ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. // https://d3js.org/d3-scale/ v2.1.2 Copyright 2018 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. var array = Array.prototype;
  8. var map = array.map;
  9. var slice = array.slice;
  10. var implicit = {name: "implicit"};
  11. function ordinal(range) {
  12. var index = d3Collection.map(),
  13. domain = [],
  14. unknown = implicit;
  15. range = range == null ? [] : slice.call(range);
  16. function scale(d) {
  17. var key = d + "", i = index.get(key);
  18. if (!i) {
  19. if (unknown !== implicit) return unknown;
  20. index.set(key, i = domain.push(d));
  21. }
  22. return range[(i - 1) % range.length];
  23. }
  24. scale.domain = function(_) {
  25. if (!arguments.length) return domain.slice();
  26. domain = [], index = d3Collection.map();
  27. var i = -1, n = _.length, d, key;
  28. while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
  29. return scale;
  30. };
  31. scale.range = function(_) {
  32. return arguments.length ? (range = slice.call(_), scale) : range.slice();
  33. };
  34. scale.unknown = function(_) {
  35. return arguments.length ? (unknown = _, scale) : unknown;
  36. };
  37. scale.copy = function() {
  38. return ordinal()
  39. .domain(domain)
  40. .range(range)
  41. .unknown(unknown);
  42. };
  43. return scale;
  44. }
  45. function band() {
  46. var scale = ordinal().unknown(undefined),
  47. domain = scale.domain,
  48. ordinalRange = scale.range,
  49. range = [0, 1],
  50. step,
  51. bandwidth,
  52. round = false,
  53. paddingInner = 0,
  54. paddingOuter = 0,
  55. align = 0.5;
  56. delete scale.unknown;
  57. function rescale() {
  58. var n = domain().length,
  59. reverse = range[1] < range[0],
  60. start = range[reverse - 0],
  61. stop = range[1 - reverse];
  62. step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
  63. if (round) step = Math.floor(step);
  64. start += (stop - start - step * (n - paddingInner)) * align;
  65. bandwidth = step * (1 - paddingInner);
  66. if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
  67. var values = d3Array.range(n).map(function(i) { return start + step * i; });
  68. return ordinalRange(reverse ? values.reverse() : values);
  69. }
  70. scale.domain = function(_) {
  71. return arguments.length ? (domain(_), rescale()) : domain();
  72. };
  73. scale.range = function(_) {
  74. return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
  75. };
  76. scale.rangeRound = function(_) {
  77. return range = [+_[0], +_[1]], round = true, rescale();
  78. };
  79. scale.bandwidth = function() {
  80. return bandwidth;
  81. };
  82. scale.step = function() {
  83. return step;
  84. };
  85. scale.round = function(_) {
  86. return arguments.length ? (round = !!_, rescale()) : round;
  87. };
  88. scale.padding = function(_) {
  89. return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
  90. };
  91. scale.paddingInner = function(_) {
  92. return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
  93. };
  94. scale.paddingOuter = function(_) {
  95. return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
  96. };
  97. scale.align = function(_) {
  98. return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
  99. };
  100. scale.copy = function() {
  101. return band()
  102. .domain(domain())
  103. .range(range)
  104. .round(round)
  105. .paddingInner(paddingInner)
  106. .paddingOuter(paddingOuter)
  107. .align(align);
  108. };
  109. return rescale();
  110. }
  111. function pointish(scale) {
  112. var copy = scale.copy;
  113. scale.padding = scale.paddingOuter;
  114. delete scale.paddingInner;
  115. delete scale.paddingOuter;
  116. scale.copy = function() {
  117. return pointish(copy());
  118. };
  119. return scale;
  120. }
  121. function point() {
  122. return pointish(band().paddingInner(1));
  123. }
  124. function constant(x) {
  125. return function() {
  126. return x;
  127. };
  128. }
  129. function number(x) {
  130. return +x;
  131. }
  132. var unit = [0, 1];
  133. function deinterpolateLinear(a, b) {
  134. return (b -= (a = +a))
  135. ? function(x) { return (x - a) / b; }
  136. : constant(b);
  137. }
  138. function deinterpolateClamp(deinterpolate) {
  139. return function(a, b) {
  140. var d = deinterpolate(a = +a, b = +b);
  141. return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
  142. };
  143. }
  144. function reinterpolateClamp(reinterpolate) {
  145. return function(a, b) {
  146. var r = reinterpolate(a = +a, b = +b);
  147. return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
  148. };
  149. }
  150. function bimap(domain, range, deinterpolate, reinterpolate) {
  151. var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
  152. if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
  153. else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
  154. return function(x) { return r0(d0(x)); };
  155. }
  156. function polymap(domain, range, deinterpolate, reinterpolate) {
  157. var j = Math.min(domain.length, range.length) - 1,
  158. d = new Array(j),
  159. r = new Array(j),
  160. i = -1;
  161. // Reverse descending domains.
  162. if (domain[j] < domain[0]) {
  163. domain = domain.slice().reverse();
  164. range = range.slice().reverse();
  165. }
  166. while (++i < j) {
  167. d[i] = deinterpolate(domain[i], domain[i + 1]);
  168. r[i] = reinterpolate(range[i], range[i + 1]);
  169. }
  170. return function(x) {
  171. var i = d3Array.bisect(domain, x, 1, j) - 1;
  172. return r[i](d[i](x));
  173. };
  174. }
  175. function copy(source, target) {
  176. return target
  177. .domain(source.domain())
  178. .range(source.range())
  179. .interpolate(source.interpolate())
  180. .clamp(source.clamp());
  181. }
  182. // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
  183. // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
  184. function continuous(deinterpolate, reinterpolate) {
  185. var domain = unit,
  186. range = unit,
  187. interpolate = d3Interpolate.interpolate,
  188. clamp = false,
  189. piecewise,
  190. output,
  191. input;
  192. function rescale() {
  193. piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
  194. output = input = null;
  195. return scale;
  196. }
  197. function scale(x) {
  198. return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);
  199. }
  200. scale.invert = function(y) {
  201. return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
  202. };
  203. scale.domain = function(_) {
  204. return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();
  205. };
  206. scale.range = function(_) {
  207. return arguments.length ? (range = slice.call(_), rescale()) : range.slice();
  208. };
  209. scale.rangeRound = function(_) {
  210. return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale();
  211. };
  212. scale.clamp = function(_) {
  213. return arguments.length ? (clamp = !!_, rescale()) : clamp;
  214. };
  215. scale.interpolate = function(_) {
  216. return arguments.length ? (interpolate = _, rescale()) : interpolate;
  217. };
  218. return rescale();
  219. }
  220. function tickFormat(domain, count, specifier) {
  221. var start = domain[0],
  222. stop = domain[domain.length - 1],
  223. step = d3Array.tickStep(start, stop, count == null ? 10 : count),
  224. precision;
  225. specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier);
  226. switch (specifier.type) {
  227. case "s": {
  228. var value = Math.max(Math.abs(start), Math.abs(stop));
  229. if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision;
  230. return d3Format.formatPrefix(specifier, value);
  231. }
  232. case "":
  233. case "e":
  234. case "g":
  235. case "p":
  236. case "r": {
  237. if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
  238. break;
  239. }
  240. case "f":
  241. case "%": {
  242. if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
  243. break;
  244. }
  245. }
  246. return d3Format.format(specifier);
  247. }
  248. function linearish(scale) {
  249. var domain = scale.domain;
  250. scale.ticks = function(count) {
  251. var d = domain();
  252. return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count);
  253. };
  254. scale.tickFormat = function(count, specifier) {
  255. return tickFormat(domain(), count, specifier);
  256. };
  257. scale.nice = function(count) {
  258. if (count == null) count = 10;
  259. var d = domain(),
  260. i0 = 0,
  261. i1 = d.length - 1,
  262. start = d[i0],
  263. stop = d[i1],
  264. step;
  265. if (stop < start) {
  266. step = start, start = stop, stop = step;
  267. step = i0, i0 = i1, i1 = step;
  268. }
  269. step = d3Array.tickIncrement(start, stop, count);
  270. if (step > 0) {
  271. start = Math.floor(start / step) * step;
  272. stop = Math.ceil(stop / step) * step;
  273. step = d3Array.tickIncrement(start, stop, count);
  274. } else if (step < 0) {
  275. start = Math.ceil(start * step) / step;
  276. stop = Math.floor(stop * step) / step;
  277. step = d3Array.tickIncrement(start, stop, count);
  278. }
  279. if (step > 0) {
  280. d[i0] = Math.floor(start / step) * step;
  281. d[i1] = Math.ceil(stop / step) * step;
  282. domain(d);
  283. } else if (step < 0) {
  284. d[i0] = Math.ceil(start * step) / step;
  285. d[i1] = Math.floor(stop * step) / step;
  286. domain(d);
  287. }
  288. return scale;
  289. };
  290. return scale;
  291. }
  292. function linear() {
  293. var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber);
  294. scale.copy = function() {
  295. return copy(scale, linear());
  296. };
  297. return linearish(scale);
  298. }
  299. function identity() {
  300. var domain = [0, 1];
  301. function scale(x) {
  302. return +x;
  303. }
  304. scale.invert = scale;
  305. scale.domain = scale.range = function(_) {
  306. return arguments.length ? (domain = map.call(_, number), scale) : domain.slice();
  307. };
  308. scale.copy = function() {
  309. return identity().domain(domain);
  310. };
  311. return linearish(scale);
  312. }
  313. function nice(domain, interval) {
  314. domain = domain.slice();
  315. var i0 = 0,
  316. i1 = domain.length - 1,
  317. x0 = domain[i0],
  318. x1 = domain[i1],
  319. t;
  320. if (x1 < x0) {
  321. t = i0, i0 = i1, i1 = t;
  322. t = x0, x0 = x1, x1 = t;
  323. }
  324. domain[i0] = interval.floor(x0);
  325. domain[i1] = interval.ceil(x1);
  326. return domain;
  327. }
  328. function deinterpolate(a, b) {
  329. return (b = Math.log(b / a))
  330. ? function(x) { return Math.log(x / a) / b; }
  331. : constant(b);
  332. }
  333. function reinterpolate(a, b) {
  334. return a < 0
  335. ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
  336. : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
  337. }
  338. function pow10(x) {
  339. return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
  340. }
  341. function powp(base) {
  342. return base === 10 ? pow10
  343. : base === Math.E ? Math.exp
  344. : function(x) { return Math.pow(base, x); };
  345. }
  346. function logp(base) {
  347. return base === Math.E ? Math.log
  348. : base === 10 && Math.log10
  349. || base === 2 && Math.log2
  350. || (base = Math.log(base), function(x) { return Math.log(x) / base; });
  351. }
  352. function reflect(f) {
  353. return function(x) {
  354. return -f(-x);
  355. };
  356. }
  357. function log() {
  358. var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
  359. domain = scale.domain,
  360. base = 10,
  361. logs = logp(10),
  362. pows = powp(10);
  363. function rescale() {
  364. logs = logp(base), pows = powp(base);
  365. if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
  366. return scale;
  367. }
  368. scale.base = function(_) {
  369. return arguments.length ? (base = +_, rescale()) : base;
  370. };
  371. scale.domain = function(_) {
  372. return arguments.length ? (domain(_), rescale()) : domain();
  373. };
  374. scale.ticks = function(count) {
  375. var d = domain(),
  376. u = d[0],
  377. v = d[d.length - 1],
  378. r;
  379. if (r = v < u) i = u, u = v, v = i;
  380. var i = logs(u),
  381. j = logs(v),
  382. p,
  383. k,
  384. t,
  385. n = count == null ? 10 : +count,
  386. z = [];
  387. if (!(base % 1) && j - i < n) {
  388. i = Math.round(i) - 1, j = Math.round(j) + 1;
  389. if (u > 0) for (; i < j; ++i) {
  390. for (k = 1, p = pows(i); k < base; ++k) {
  391. t = p * k;
  392. if (t < u) continue;
  393. if (t > v) break;
  394. z.push(t);
  395. }
  396. } else for (; i < j; ++i) {
  397. for (k = base - 1, p = pows(i); k >= 1; --k) {
  398. t = p * k;
  399. if (t < u) continue;
  400. if (t > v) break;
  401. z.push(t);
  402. }
  403. }
  404. } else {
  405. z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows);
  406. }
  407. return r ? z.reverse() : z;
  408. };
  409. scale.tickFormat = function(count, specifier) {
  410. if (specifier == null) specifier = base === 10 ? ".0e" : ",";
  411. if (typeof specifier !== "function") specifier = d3Format.format(specifier);
  412. if (count === Infinity) return specifier;
  413. if (count == null) count = 10;
  414. var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
  415. return function(d) {
  416. var i = d / pows(Math.round(logs(d)));
  417. if (i * base < base - 0.5) i *= base;
  418. return i <= k ? specifier(d) : "";
  419. };
  420. };
  421. scale.nice = function() {
  422. return domain(nice(domain(), {
  423. floor: function(x) { return pows(Math.floor(logs(x))); },
  424. ceil: function(x) { return pows(Math.ceil(logs(x))); }
  425. }));
  426. };
  427. scale.copy = function() {
  428. return copy(scale, log().base(base));
  429. };
  430. return scale;
  431. }
  432. function raise(x, exponent) {
  433. return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
  434. }
  435. function pow() {
  436. var exponent = 1,
  437. scale = continuous(deinterpolate, reinterpolate),
  438. domain = scale.domain;
  439. function deinterpolate(a, b) {
  440. return (b = raise(b, exponent) - (a = raise(a, exponent)))
  441. ? function(x) { return (raise(x, exponent) - a) / b; }
  442. : constant(b);
  443. }
  444. function reinterpolate(a, b) {
  445. b = raise(b, exponent) - (a = raise(a, exponent));
  446. return function(t) { return raise(a + b * t, 1 / exponent); };
  447. }
  448. scale.exponent = function(_) {
  449. return arguments.length ? (exponent = +_, domain(domain())) : exponent;
  450. };
  451. scale.copy = function() {
  452. return copy(scale, pow().exponent(exponent));
  453. };
  454. return linearish(scale);
  455. }
  456. function sqrt() {
  457. return pow().exponent(0.5);
  458. }
  459. function quantile() {
  460. var domain = [],
  461. range = [],
  462. thresholds = [];
  463. function rescale() {
  464. var i = 0, n = Math.max(1, range.length);
  465. thresholds = new Array(n - 1);
  466. while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n);
  467. return scale;
  468. }
  469. function scale(x) {
  470. if (!isNaN(x = +x)) return range[d3Array.bisect(thresholds, x)];
  471. }
  472. scale.invertExtent = function(y) {
  473. var i = range.indexOf(y);
  474. return i < 0 ? [NaN, NaN] : [
  475. i > 0 ? thresholds[i - 1] : domain[0],
  476. i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
  477. ];
  478. };
  479. scale.domain = function(_) {
  480. if (!arguments.length) return domain.slice();
  481. domain = [];
  482. for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
  483. domain.sort(d3Array.ascending);
  484. return rescale();
  485. };
  486. scale.range = function(_) {
  487. return arguments.length ? (range = slice.call(_), rescale()) : range.slice();
  488. };
  489. scale.quantiles = function() {
  490. return thresholds.slice();
  491. };
  492. scale.copy = function() {
  493. return quantile()
  494. .domain(domain)
  495. .range(range);
  496. };
  497. return scale;
  498. }
  499. function quantize() {
  500. var x0 = 0,
  501. x1 = 1,
  502. n = 1,
  503. domain = [0.5],
  504. range = [0, 1];
  505. function scale(x) {
  506. if (x <= x) return range[d3Array.bisect(domain, x, 0, n)];
  507. }
  508. function rescale() {
  509. var i = -1;
  510. domain = new Array(n);
  511. while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
  512. return scale;
  513. }
  514. scale.domain = function(_) {
  515. return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
  516. };
  517. scale.range = function(_) {
  518. return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();
  519. };
  520. scale.invertExtent = function(y) {
  521. var i = range.indexOf(y);
  522. return i < 0 ? [NaN, NaN]
  523. : i < 1 ? [x0, domain[0]]
  524. : i >= n ? [domain[n - 1], x1]
  525. : [domain[i - 1], domain[i]];
  526. };
  527. scale.copy = function() {
  528. return quantize()
  529. .domain([x0, x1])
  530. .range(range);
  531. };
  532. return linearish(scale);
  533. }
  534. function threshold() {
  535. var domain = [0.5],
  536. range = [0, 1],
  537. n = 1;
  538. function scale(x) {
  539. if (x <= x) return range[d3Array.bisect(domain, x, 0, n)];
  540. }
  541. scale.domain = function(_) {
  542. return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
  543. };
  544. scale.range = function(_) {
  545. return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
  546. };
  547. scale.invertExtent = function(y) {
  548. var i = range.indexOf(y);
  549. return [domain[i - 1], domain[i]];
  550. };
  551. scale.copy = function() {
  552. return threshold()
  553. .domain(domain)
  554. .range(range);
  555. };
  556. return scale;
  557. }
  558. var durationSecond = 1000,
  559. durationMinute = durationSecond * 60,
  560. durationHour = durationMinute * 60,
  561. durationDay = durationHour * 24,
  562. durationWeek = durationDay * 7,
  563. durationMonth = durationDay * 30,
  564. durationYear = durationDay * 365;
  565. function date(t) {
  566. return new Date(t);
  567. }
  568. function number$1(t) {
  569. return t instanceof Date ? +t : +new Date(+t);
  570. }
  571. function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
  572. var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber),
  573. invert = scale.invert,
  574. domain = scale.domain;
  575. var formatMillisecond = format(".%L"),
  576. formatSecond = format(":%S"),
  577. formatMinute = format("%I:%M"),
  578. formatHour = format("%I %p"),
  579. formatDay = format("%a %d"),
  580. formatWeek = format("%b %d"),
  581. formatMonth = format("%B"),
  582. formatYear = format("%Y");
  583. var tickIntervals = [
  584. [second, 1, durationSecond],
  585. [second, 5, 5 * durationSecond],
  586. [second, 15, 15 * durationSecond],
  587. [second, 30, 30 * durationSecond],
  588. [minute, 1, durationMinute],
  589. [minute, 5, 5 * durationMinute],
  590. [minute, 15, 15 * durationMinute],
  591. [minute, 30, 30 * durationMinute],
  592. [ hour, 1, durationHour ],
  593. [ hour, 3, 3 * durationHour ],
  594. [ hour, 6, 6 * durationHour ],
  595. [ hour, 12, 12 * durationHour ],
  596. [ day, 1, durationDay ],
  597. [ day, 2, 2 * durationDay ],
  598. [ week, 1, durationWeek ],
  599. [ month, 1, durationMonth ],
  600. [ month, 3, 3 * durationMonth ],
  601. [ year, 1, durationYear ]
  602. ];
  603. function tickFormat(date) {
  604. return (second(date) < date ? formatMillisecond
  605. : minute(date) < date ? formatSecond
  606. : hour(date) < date ? formatMinute
  607. : day(date) < date ? formatHour
  608. : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
  609. : year(date) < date ? formatMonth
  610. : formatYear)(date);
  611. }
  612. function tickInterval(interval, start, stop, step) {
  613. if (interval == null) interval = 10;
  614. // If a desired tick count is specified, pick a reasonable tick interval
  615. // based on the extent of the domain and a rough estimate of tick size.
  616. // Otherwise, assume interval is already a time interval and use it.
  617. if (typeof interval === "number") {
  618. var target = Math.abs(stop - start) / interval,
  619. i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target);
  620. if (i === tickIntervals.length) {
  621. step = d3Array.tickStep(start / durationYear, stop / durationYear, interval);
  622. interval = year;
  623. } else if (i) {
  624. i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
  625. step = i[1];
  626. interval = i[0];
  627. } else {
  628. step = Math.max(d3Array.tickStep(start, stop, interval), 1);
  629. interval = millisecond;
  630. }
  631. }
  632. return step == null ? interval : interval.every(step);
  633. }
  634. scale.invert = function(y) {
  635. return new Date(invert(y));
  636. };
  637. scale.domain = function(_) {
  638. return arguments.length ? domain(map.call(_, number$1)) : domain().map(date);
  639. };
  640. scale.ticks = function(interval, step) {
  641. var d = domain(),
  642. t0 = d[0],
  643. t1 = d[d.length - 1],
  644. r = t1 < t0,
  645. t;
  646. if (r) t = t0, t0 = t1, t1 = t;
  647. t = tickInterval(interval, t0, t1, step);
  648. t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
  649. return r ? t.reverse() : t;
  650. };
  651. scale.tickFormat = function(count, specifier) {
  652. return specifier == null ? tickFormat : format(specifier);
  653. };
  654. scale.nice = function(interval, step) {
  655. var d = domain();
  656. return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
  657. ? domain(nice(d, interval))
  658. : scale;
  659. };
  660. scale.copy = function() {
  661. return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
  662. };
  663. return scale;
  664. }
  665. function time() {
  666. return 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)]);
  667. }
  668. function utcTime() {
  669. return 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)]);
  670. }
  671. function sequential(interpolator) {
  672. var x0 = 0,
  673. x1 = 1,
  674. k10 = 1,
  675. clamp = false;
  676. function scale(x) {
  677. var t = (x - x0) * k10;
  678. return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
  679. }
  680. scale.domain = function(_) {
  681. return arguments.length ? (x0 = +_[0], x1 = +_[1], k10 = x0 === x1 ? 0 : 1 / (x1 - x0), scale) : [x0, x1];
  682. };
  683. scale.clamp = function(_) {
  684. return arguments.length ? (clamp = !!_, scale) : clamp;
  685. };
  686. scale.interpolator = function(_) {
  687. return arguments.length ? (interpolator = _, scale) : interpolator;
  688. };
  689. scale.copy = function() {
  690. return sequential(interpolator).domain([x0, x1]).clamp(clamp);
  691. };
  692. return linearish(scale);
  693. }
  694. function diverging(interpolator) {
  695. var x0 = 0,
  696. x1 = 0.5,
  697. x2 = 1,
  698. k10 = 1,
  699. k21 = 1,
  700. clamp = false;
  701. function scale(x) {
  702. var t = 0.5 + ((x = +x) - x1) * (x < x1 ? k10 : k21);
  703. return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
  704. }
  705. scale.domain = function(_) {
  706. return arguments.length ? (x0 = +_[0], x1 = +_[1], x2 = +_[2], k10 = x0 === x1 ? 0 : 0.5 / (x1 - x0), k21 = x1 === x2 ? 0 : 0.5 / (x2 - x1), scale) : [x0, x1, x2];
  707. };
  708. scale.clamp = function(_) {
  709. return arguments.length ? (clamp = !!_, scale) : clamp;
  710. };
  711. scale.interpolator = function(_) {
  712. return arguments.length ? (interpolator = _, scale) : interpolator;
  713. };
  714. scale.copy = function() {
  715. return diverging(interpolator).domain([x0, x1, x2]).clamp(clamp);
  716. };
  717. return linearish(scale);
  718. }
  719. exports.scaleBand = band;
  720. exports.scalePoint = point;
  721. exports.scaleIdentity = identity;
  722. exports.scaleLinear = linear;
  723. exports.scaleLog = log;
  724. exports.scaleOrdinal = ordinal;
  725. exports.scaleImplicit = implicit;
  726. exports.scalePow = pow;
  727. exports.scaleSqrt = sqrt;
  728. exports.scaleQuantile = quantile;
  729. exports.scaleQuantize = quantize;
  730. exports.scaleThreshold = threshold;
  731. exports.scaleTime = time;
  732. exports.scaleUtc = utcTime;
  733. exports.scaleSequential = sequential;
  734. exports.scaleDiverging = diverging;
  735. Object.defineProperty(exports, '__esModule', { value: true });
  736. })));