/*! * Adapted from * https://github.com/vega/vega-lite/blob/master/src/scale.ts * * Copyright (c) 2015-2018, University of Washington Interactive Data Lab * All rights reserved. * * BSD-3-Clause License: https://github.com/vega/vega-lite/blob/master/LICENSE */ import { ChromosomalLocus, GenomeDefinition } from "./genome.js"; import { ExprRef } from "./parameter.js"; export type ScaleType = | "null" | "linear" | "log" | "pow" | "sqrt" | "symlog" | "identity" | "sequential" | "quantize" | "threshold" | "ordinal" | "point" | "band" | "index" | "locus"; export interface Scale { /** * The name of the scale. Names are optional but allow the scales to be referenced and found with the API. */ name?: string; /** * The type of scale. Vega-Lite supports the following categories of scale types: * * 1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`"linear"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`"pow"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`"sqrt"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`"symlog"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`"log"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`"time"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`"utc"`](https://vega.github.io/vega-lite/docs/scale.html#utc). * * 2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`"ordinal"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`"band"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`"point"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges. * * 3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`"bin-ordinal"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`"quantile"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`"quantize"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`"threshold"`](https://vega.github.io/vega-lite/docs/scale.html#threshold). * * __Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type). */ type?: ScaleType; /** * Genome assembly definition for locus scales. * * This can be: * * - A string reference to a named assembly (built-in or root-configured). * - An inline anonymous assembly that defines either `contigs` or `url`. * * If undefined, the default genome from the genome store is used. */ assembly?: string | InlineLocusAssembly; /** * Customized domain values. * * For _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries. * * For _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime). * * For _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values. */ domain?: ScalarDomain | ComplexDomain | SelectionDomainRef | ExprRef; /** * Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains. */ domainMid?: number; /** * Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains. */ domainMax?: number; /** * Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains. */ domainMin?: number; /** * If true, reverses the order of the scale range. * * __Default value:__ `false`. */ reverse?: boolean; /** * Controls whether domain updates are applied immediately or with a smooth * transition. * * Set this to `false` to apply domain updates immediately. The default is * `true`, except for domains defined by an `ExprRef`, which default to * `false` unless overridden. * * __Default value:__ `true`, except `false` for ExprRef-driven domains. */ domainTransition?: boolean | Record; /** * The range of the scale. One of: * * - A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `"symbol"`, or `"diverging"`). * * - For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise). * * - For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values. * * __Notes:__ * * 1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`. * * 2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`). */ range?: number[] | string[] | string | ExprRef[]; // ordinal /** * A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `"category10"` or `"blues"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params). * * Discrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales. * * For the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference. */ scheme?: string | SchemeParams; /** * The alignment of the steps within the scale range. * * This value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis. * * __Default value:__ `0.5` */ align?: number; /** * An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels. */ bins?: number[]; /** * If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid. * * __Default value:__ `false`. */ round?: boolean; /** * For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties. * * For _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value. * * For _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`. * * __Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. * For _band and point_ scales, see `paddingInner` and `paddingOuter`. By default, Vega-Lite sets padding such that _width/height = number of unique values * step_. * * @minimum 0 */ padding?: number; /** * The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1]. * * For point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands). * * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`. * * @minimum 0 * @maximum 1 */ paddingInner?: number; /** * The outer padding (spacing) at the ends of the range of band and point scales, * as a fraction of the step size. This value must lie in the range [0,1]. * * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. * By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_. * * @minimum 0 * @maximum 1 */ paddingOuter?: number; // typical /** * If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value * * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default). */ clamp?: boolean; /** * Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_. * * For quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain. * * __Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise. * */ nice?: boolean | number | { interval: string; step: number }; /** * The logarithm base of the `log` scale (default `10`). */ base?: number; /** * The exponent of the `pow` scale. */ exponent?: number; /** * A constant determining the slope of the symlog function around zero. Only used for `symlog` scales. * * __Default value:__ `1` */ constant?: number; /** * If `true`, ensures that a zero baseline value is included in the scale domain. * * __Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise. * * __Note:__ Log, time, and utc scales do not support `zero`. */ zero?: boolean; /** * The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate). * * __Default value:__ `hcl` */ interpolate?: ScaleInterpolate | ScaleInterpolateParams; /** * If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively. */ zoom?: boolean | ZoomParams; /** * The numbering offset used when formatting tick labels on index and locus scales. * * __Default value:__ `0` */ numberingOffset?: number; } export type InlineLocusAssembly = GenomeDefinition; export interface SelectionDomainRef { /** * Name of an interval selection parameter that provides the domain. */ param: string; /** * Initial configured domain for the linked scale when the linked interval * selection is empty. * * Only supported when the linked scale is zoomable. * * Clearing the linked interval selection resets the domain to the normal * default/data-derived domain instead of restoring `initial`. */ initial?: ScalarDomain | ComplexDomain; /** * Selection interval channel to use. * * If omitted, GenomeSpy infers the channel from the scale channel when * possible (e.g., `x` -> `x`, `x2` -> `x`, `y` -> `y`, `y2` -> `y`). */ encoding?: "x" | "y"; } export interface SchemeParams { /** * A color scheme name for ordinal scales (e.g., `"category10"` or `"blues"`). * * For the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference. */ name: string; /** * The extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme. */ extent?: number[]; /** * The number of colors to use in the scheme. This can be useful for scale types such as `"quantize"`, which use the length of the scale range to determine the number of discrete bins for the scale domain. */ count?: number; } export type ScaleInterpolate = | "rgb" | "lab" | "hcl" | "hsl" | "hsl-long" | "hcl-long" | "cubehelix" | "cubehelix-long"; export interface ScaleInterpolateParams { type: "rgb" | "cubehelix" | "cubehelix-long"; gamma?: number; } export type NumericDomain = number[]; export type ScalarDomain = NumericDomain | string[] | boolean[]; /** * A complex domain that needs to be converted into a scalar domain before it * is assigned to a scale. */ export type ComplexDomain = ChromosomalLocus[]; export interface ZoomParams { /** The boundaries that limit the zoom and pan interactions. */ extent?: ScalarDomain | ComplexDomain; }