UNPKG

@macrostrat/column-components

Version:

React rendering primitives for stratigraphic columns

1 lines 9.98 kB
{"version":3,"file":"analyze.cjs","sources":["../../../../../../../../../.yarn/berry/cache/chroma-js-npm-3.2.0-d5c39f5077-10c0.zip/node_modules/chroma-js/src/utils/analyze.js"],"sourcesContent":["import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n"],"names":["limits"],"mappings":"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","x_google_ignoreList":[0]}