From 4a91ad863674fae028acdd3c848ec984a8ad377d Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Thu, 4 Feb 2021 13:13:05 -0600 Subject: [PATCH 01/12] feat(scales): log scale improvements and options - Set base of log scales to 10, 2 or e - Set custom min limit of log values, previously hardcoded to 1 - Allow domain to fit full domain of dataset, without crossing 0 --- src/chart_types/index.ts | 6 +- src/chart_types/xy_chart/domains/y_domain.ts | 19 ++- .../selectors/compute_axes_geometries.ts | 2 +- .../compute_axis_ticks_dimensions.ts | 2 +- .../selectors/compute_series_geometries.ts | 2 +- src/chart_types/xy_chart/state/utils/utils.ts | 6 +- src/chart_types/xy_chart/utils/axis_utils.ts | 28 +++- src/chart_types/xy_chart/utils/scales.ts | 40 ++++- src/chart_types/xy_chart/utils/specs.ts | 8 +- src/scales/constants.ts | 10 +- src/scales/scale_continuous.ts | 128 +++++++++++---- src/specs/constants.ts | 3 + src/specs/settings.tsx | 31 +++- src/utils/domain.ts | 12 +- stories/scales/7_log_scale_options.tsx | 146 ++++++++++++++++++ stories/scales/scales.stories.tsx | 1 + stories/utils/knobs.ts | 34 ++++ 17 files changed, 410 insertions(+), 68 deletions(-) create mode 100644 stories/scales/7_log_scale_options.tsx diff --git a/src/chart_types/index.ts b/src/chart_types/index.ts index a38aee1994..ab53ef2cfc 100644 --- a/src/chart_types/index.ts +++ b/src/chart_types/index.ts @@ -19,6 +19,10 @@ import { $Values } from 'utility-types'; +/** + * Available chart types + * @public + */ export const ChartTypes = Object.freeze({ Global: 'global' as const, Goal: 'goal' as const, @@ -26,6 +30,4 @@ export const ChartTypes = Object.freeze({ XYAxis: 'xy_axis' as const, Heatmap: 'heatmap' as const, }); - -/** @public */ export type ChartTypes = $Values; diff --git a/src/chart_types/xy_chart/domains/y_domain.ts b/src/chart_types/xy_chart/domains/y_domain.ts index 97fdbf6ef2..d3c1a76019 100644 --- a/src/chart_types/xy_chart/domains/y_domain.ts +++ b/src/chart_types/xy_chart/domains/y_domain.ts @@ -74,10 +74,11 @@ function mergeYDomainForGroup( const groupYScaleType = coerceYScaleTypes(yScaleTypes); const [{ stackMode, spec }] = dataSeries; const groupId = getSpecDomainGroupId(spec); + const isLogScale = groupYScaleType === ScaleType.Log; let domain: number[]; if (stackMode === StackMode.Percentage) { - domain = computeContinuousDataDomain([0, 1], identity, customDomain); + domain = computeContinuousDataDomain([0, 1], identity, isLogScale, customDomain); } else { // TODO remove when removing yScaleToDataExtent const newCustomDomain = customDomain ? { ...customDomain } : {}; @@ -85,14 +86,20 @@ function mergeYDomainForGroup( if (customDomain?.fit !== true && shouldScaleToExtent) { newCustomDomain.fit = true; } + // compute stacked domain - const stackedDomain = computeYDomain(stacked, hasZeroBaselineSpecs); + const stackedDomain = computeYDomain(stacked, isLogScale, hasZeroBaselineSpecs); // compute non stacked domain - const nonStackedDomain = computeYDomain(nonStacked, hasZeroBaselineSpecs); + const nonStackedDomain = computeYDomain(nonStacked, isLogScale, hasZeroBaselineSpecs); // merge stacked and non stacked domain together - domain = computeContinuousDataDomain([...stackedDomain, ...nonStackedDomain], identity, newCustomDomain); + domain = computeContinuousDataDomain( + [...stackedDomain, ...nonStackedDomain], + identity, + isLogScale, + newCustomDomain, + ); const [computedDomainMin, computedDomainMax] = domain; @@ -124,7 +131,7 @@ function mergeYDomainForGroup( }; } -function computeYDomain(dataSeries: DataSeries[], hasZeroBaselineSpecs: boolean) { +function computeYDomain(dataSeries: DataSeries[], isLogScale: boolean, hasZeroBaselineSpecs: boolean) { const yValues = new Set(); dataSeries.forEach(({ data }) => { for (let i = 0; i < data.length; i++) { @@ -138,7 +145,7 @@ function computeYDomain(dataSeries: DataSeries[], hasZeroBaselineSpecs: boolean) if (yValues.size === 0) { return []; } - return computeContinuousDataDomain([...yValues.values()], identity, null); + return computeContinuousDataDomain([...yValues.values()], identity, isLogScale, null); } /** @internal */ diff --git a/src/chart_types/xy_chart/state/selectors/compute_axes_geometries.ts b/src/chart_types/xy_chart/state/selectors/compute_axes_geometries.ts index 2d1640e86a..f3094a5371 100644 --- a/src/chart_types/xy_chart/state/selectors/compute_axes_geometries.ts +++ b/src/chart_types/xy_chart/state/selectors/compute_axes_geometries.ts @@ -71,7 +71,7 @@ export const computeAxesGeometriesSelector = createCachedSelector( return getAxesGeometries( chartDimensions, chartTheme, - settingsSpec.rotation, + settingsSpec, axesSpecs, axesTicksDimensions, axesStyles, diff --git a/src/chart_types/xy_chart/state/selectors/compute_axis_ticks_dimensions.ts b/src/chart_types/xy_chart/state/selectors/compute_axis_ticks_dimensions.ts index 555adaf468..cae0871623 100644 --- a/src/chart_types/xy_chart/state/selectors/compute_axis_ticks_dimensions.ts +++ b/src/chart_types/xy_chart/state/selectors/compute_axis_ticks_dimensions.ts @@ -74,7 +74,7 @@ export const computeAxisTicksDimensionsSelector = createCachedSelector( yDomain, totalBarsInCluster, bboxCalculator, - settingsSpec.rotation, + settingsSpec, axisStyle, fallBackTickFormatter, barsPadding, diff --git a/src/chart_types/xy_chart/state/selectors/compute_series_geometries.ts b/src/chart_types/xy_chart/state/selectors/compute_series_geometries.ts index 689444acb5..d4b60f28d1 100644 --- a/src/chart_types/xy_chart/state/selectors/compute_series_geometries.ts +++ b/src/chart_types/xy_chart/state/selectors/compute_series_geometries.ts @@ -57,7 +57,7 @@ export const computeSeriesGeometriesSelector = createCachedSelector( seriesDomainsAndData, seriesColors, chartTheme, - settingsSpec.rotation, + settingsSpec, axesSpecs, smallMultiplesScales, isHistogramMode, diff --git a/src/chart_types/xy_chart/state/utils/utils.ts b/src/chart_types/xy_chart/state/utils/utils.ts index 9388d8994b..60c3f133c6 100644 --- a/src/chart_types/xy_chart/state/utils/utils.ts +++ b/src/chart_types/xy_chart/state/utils/utils.ts @@ -20,7 +20,7 @@ import { SeriesKey, SeriesIdentifier } from '../../../../common/series_id'; import { Scale } from '../../../../scales'; import { GroupBySpec, SortSeriesByConfig } from '../../../../specs'; -import { OrderBy } from '../../../../specs/settings'; +import { OrderBy, SettingsSpec } from '../../../../specs/settings'; import { mergePartial, Rotation, Color, isUniqueArray } from '../../../../utils/common'; import { CurveType } from '../../../../utils/curves'; import { Dimensions, Size } from '../../../../utils/dimensions'; @@ -203,7 +203,7 @@ export function computeSeriesGeometries( { xDomain, yDomain, formattedDataSeries: nonFilteredDataSeries }: SeriesDomainsAndData, seriesColorMap: Map, chartTheme: Theme, - chartRotation: Rotation, + { rotation: chartRotation, yLogBase, yLogMinLimit }: SettingsSpec, axesSpecs: AxisSpec[], smallMultiplesScales: SmallMultipleScales, enableHistogramMode: boolean, @@ -237,6 +237,8 @@ export function computeSeriesGeometries( const yScales = computeYScales({ yDomains: yDomain, range: [isHorizontalRotation(chartRotation) ? vertical.bandwidth : horizontal.bandwidth, 0], + logBase: yLogBase, + logMinLimit: yLogMinLimit, }); const computedGeoms = renderGeometries( diff --git a/src/chart_types/xy_chart/utils/axis_utils.ts b/src/chart_types/xy_chart/utils/axis_utils.ts index f9fe956f1b..2eba3efa61 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.ts @@ -19,6 +19,8 @@ import { Line } from '../../../geoms/types'; import { Scale } from '../../../scales'; +import { LogBase } from '../../../scales/scale_continuous'; +import { SettingsSpec } from '../../../specs'; import { BBox, BBoxCalculator } from '../../../utils/bbox/bbox_calculator'; import { Position, @@ -91,7 +93,7 @@ export function computeAxisTicksDimensions( yDomain: YDomain[], totalBarsInCluster: number, bboxCalculator: BBoxCalculator, - chartRotation: Rotation, + { rotation: chartRotation, yLogBase, yLogMinLimit, xLogBase, xLogMinLimit }: SettingsSpec, { gridLine, tickLabel }: AxisStyle, fallBackTickFormatter: TickFormatter, barsPadding?: number, @@ -104,14 +106,17 @@ export function computeAxisTicksDimensions( return null; } + const axisIsYDomain = isYDomain(axisSpec.position, chartRotation); const scale = getScaleForAxisSpec( axisSpec, xDomain, yDomain, totalBarsInCluster, - chartRotation, + axisIsYDomain, 0, 1, + axisIsYDomain ? yLogBase : xLogBase, + axisIsYDomain ? yLogMinLimit : xLogMinLimit, barsPadding, enableHistogramMode, ); @@ -152,20 +157,23 @@ export function getScaleForAxisSpec( xDomain: XDomain, yDomain: YDomain[], totalBarsInCluster: number, - chartRotation: Rotation, + axisIsYDomain: boolean, minRange: number, maxRange: number, + logBase: LogBase, + logMinLimit?: number, barsPadding?: number, enableHistogramMode?: boolean, ): Scale | null { - const axisIsYDomain = isYDomain(axisSpec.position, chartRotation); - const range: [number, number] = [minRange, maxRange]; + const range: [min: number, max: number] = [minRange, maxRange]; if (axisIsYDomain) { const yScales = computeYScales({ yDomains: yDomain, range, ticks: axisSpec.ticks, integersOnly: axisSpec.integersOnly, + logBase, + logMinLimit, }); if (yScales.has(axisSpec.groupId)) { return yScales.get(axisSpec.groupId)!; @@ -180,6 +188,8 @@ export function getScaleForAxisSpec( enableHistogramMode, ticks: axisSpec.ticks, integersOnly: axisSpec.integersOnly, + logBase, + logMinLimit, }); } @@ -729,7 +739,7 @@ export function getAxesGeometries( leftMargin: number; }, { chartPaddings, chartMargins, axes: sharedAxesStyle }: Theme, - chartRotation: Rotation, + { rotation: chartRotation, yLogBase, yLogMinLimit, xLogBase, xLogMinLimit }: SettingsSpec, axisSpecs: AxisSpec[], axisDimensions: Map, axesStyles: Map, @@ -821,17 +831,19 @@ export function getAxesGeometries( } const isVertical = isVerticalAxis(axisSpec.position); - const minMaxRanges = getMinMaxRange(axisSpec.position, chartRotation, panel); + const axisIsYDomain = isYDomain(axisSpec.position, chartRotation); const scale = getScaleForAxisSpec( axisSpec, xDomain, yDomain, totalGroupsCount, - chartRotation, + axisIsYDomain, minMaxRanges.minRange, minMaxRanges.maxRange, + axisIsYDomain ? yLogBase : xLogBase, + axisIsYDomain ? yLogMinLimit : xLogMinLimit, barsPadding, enableHistogramMode, ); diff --git a/src/chart_types/xy_chart/utils/scales.ts b/src/chart_types/xy_chart/utils/scales.ts index bfc92ef7e1..8339ea5a1f 100644 --- a/src/chart_types/xy_chart/utils/scales.ts +++ b/src/chart_types/xy_chart/utils/scales.ts @@ -19,6 +19,7 @@ import { Scale, ScaleBand, ScaleContinuous } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; +import { LogBase } from '../../../scales/scale_continuous'; import { GroupId } from '../../../utils/ids'; import { XDomain, YDomain } from '../domains/types'; @@ -41,11 +42,13 @@ function getBandScaleRange( interface XScaleOptions { xDomain: XDomain; totalBarsInCluster: number; - range: [number, number]; + range: [min: number, max: number]; barsPadding?: number; enableHistogramMode?: boolean; ticks?: number; integersOnly?: boolean; + logBase?: LogBase; + logMinLimit?: number; } /** @@ -56,7 +59,17 @@ interface XScaleOptions { * @internal */ export function computeXScale(options: XScaleOptions): Scale { - const { xDomain, totalBarsInCluster, range, barsPadding, enableHistogramMode, ticks, integersOnly } = options; + const { + xDomain, + totalBarsInCluster, + range, + barsPadding, + enableHistogramMode, + ticks, + integersOnly, + logBase, + logMinLimit, + } = options; const { scaleType, minInterval, domain, isBandScale, timeZone } = xDomain; const rangeDiff = Math.abs(range[1] - range[0]); const isInverse = range[1] < range[0]; @@ -91,6 +104,8 @@ export function computeXScale(options: XScaleOptions): Scale { barsPadding, ticks, isSingleValueHistogram, + logBase, + logMinLimit, }, ); @@ -98,16 +113,29 @@ export function computeXScale(options: XScaleOptions): Scale { } return new ScaleContinuous( { type: scaleType, domain, range }, - { bandwidth: 0, minInterval, timeZone, totalBarsInCluster, barsPadding, ticks, integersOnly }, + { + bandwidth: 0, + minInterval, + timeZone, + totalBarsInCluster, + barsPadding, + ticks, + integersOnly, + logBase, + logMinLimit, + }, ); } interface YScaleOptions { yDomains: YDomain[]; - range: [number, number]; + range: [min: number, max: number]; ticks?: number; integersOnly?: boolean; + logBase?: LogBase; + logMinLimit?: number; } + /** * Compute the y scales, one per groupId for the y axis. * @param yDomains the y domains @@ -116,7 +144,7 @@ interface YScaleOptions { */ export function computeYScales(options: YScaleOptions): Map { const yScales: Map = new Map(); - const { yDomains, range, ticks, integersOnly } = options; + const { yDomains, range, ticks, integersOnly, logBase, logMinLimit } = options; yDomains.forEach(({ scaleType: type, domain, groupId }) => { const yScale = new ScaleContinuous( { @@ -127,6 +155,8 @@ export function computeYScales(options: YScaleOptions): Map { { ticks, integersOnly, + logBase, + logMinLimit, }, ); yScales.set(groupId, yScale); diff --git a/src/chart_types/xy_chart/utils/specs.ts b/src/chart_types/xy_chart/utils/specs.ts index 2ff315af93..35d9070658 100644 --- a/src/chart_types/xy_chart/utils/specs.ts +++ b/src/chart_types/xy_chart/utils/specs.ts @@ -49,15 +49,16 @@ export type BarStyleOverride = RecursivePartial | Color | null; /** @public */ export type PointStyleOverride = RecursivePartial | Color | null; -/** @public */ export const SeriesTypes = Object.freeze({ Area: 'area' as const, Bar: 'bar' as const, Line: 'line' as const, Bubble: 'bubble' as const, }); - -/** @public */ +/** + * XY series types + * @public + */ export type SeriesTypes = $Values; /** @@ -692,7 +693,6 @@ export const AnnotationTypes = Object.freeze({ Rectangle: 'rectangle' as const, Text: 'text' as const, }); - /** @public */ export type AnnotationType = $Values; diff --git a/src/scales/constants.ts b/src/scales/constants.ts index 38de953140..dc0c77d08c 100644 --- a/src/scales/constants.ts +++ b/src/scales/constants.ts @@ -18,10 +18,6 @@ */ import { $Values } from 'utility-types'; -/** - * The scale type - * @public - */ export const ScaleType = Object.freeze({ Linear: 'linear' as const, Ordinal: 'ordinal' as const, @@ -32,8 +28,10 @@ export const ScaleType = Object.freeze({ Quantile: 'quantile' as const, Threshold: 'threshold' as const, }); - -/** @public */ +/** + * The scale type + * @public + */ export type ScaleType = $Values; /** @internal */ diff --git a/src/scales/scale_continuous.ts b/src/scales/scale_continuous.ts index e6aaf3b8af..e74fd6ce08 100644 --- a/src/scales/scale_continuous.ts +++ b/src/scales/scale_continuous.ts @@ -28,6 +28,7 @@ import { ScalePower, ScaleTime, } from 'd3-scale'; +import { $Values } from 'utility-types'; import { ScaleContinuousType, Scale } from '.'; import { PrimitiveValue } from '../chart_types/partition_chart/layout/utils/group_by_rollup'; @@ -56,52 +57,101 @@ const SCALES = { * As log(0) = -Infinite, a log scale domain must be strictly-positive * or strictly-negative; the domain must not include or cross zero value. * We need to limit the domain scale to the right value on all possible cases. + * * @param domain the domain to limit * @internal */ -export function limitLogScaleDomain(domain: any[]) { - if (domain[0] === 0) { - if (domain[1] > 0) { - return [LOG_MIN_ABS_DOMAIN, domain[1]]; +export function limitLogScaleDomain([min, max]: [min: number, max: number], logMinLimit?: number) { + const absLimit = logMinLimit !== undefined ? Math.abs(logMinLimit) : undefined; + if (absLimit !== undefined && absLimit > 0) { + if (min > 0 && min < absLimit) { + if (max > absLimit) { + return [absLimit, max]; + } + if (max < absLimit) { + return [-absLimit, max]; + } + return [absLimit, absLimit]; + } + + if (max < 0 && max > -absLimit) { + if (min > -absLimit) { + return [min, absLimit]; + } + if (min < -absLimit) { + return [min, -absLimit]; + } + return [absLimit, absLimit]; + } + } + + if (min === 0) { + if (max > 0) { + return [LOG_MIN_ABS_DOMAIN, max]; } - if (domain[1] < 0) { - return [-LOG_MIN_ABS_DOMAIN, domain[1]]; + if (max < 0) { + return [-LOG_MIN_ABS_DOMAIN, max]; } return [LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]; } - if (domain[1] === 0) { - if (domain[0] > 0) { - return [domain[0], LOG_MIN_ABS_DOMAIN]; + if (max === 0) { + if (min > 0) { + return [min, LOG_MIN_ABS_DOMAIN]; } - if (domain[0] < 0) { - return [domain[0], -LOG_MIN_ABS_DOMAIN]; + if (min < 0) { + return [min, -LOG_MIN_ABS_DOMAIN]; } return [LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]; } - if (domain[0] < 0 && domain[1] > 0) { - const isD0Min = Math.abs(domain[1]) - Math.abs(domain[0]) >= 0; + if (min < 0 && max > 0) { + const isD0Min = Math.abs(max) - Math.abs(min) >= 0; if (isD0Min) { - return [LOG_MIN_ABS_DOMAIN, domain[1]]; + return [LOG_MIN_ABS_DOMAIN, max]; } - return [domain[0], -LOG_MIN_ABS_DOMAIN]; + return [min, -LOG_MIN_ABS_DOMAIN]; } - if (domain[0] > 0 && domain[1] < 0) { - const isD0Max = Math.abs(domain[0]) - Math.abs(domain[1]) >= 0; + if (min > 0 && max < 0) { + const isD0Max = Math.abs(min) - Math.abs(max) >= 0; if (isD0Max) { - return [domain[0], LOG_MIN_ABS_DOMAIN]; + return [min, LOG_MIN_ABS_DOMAIN]; } - return [-LOG_MIN_ABS_DOMAIN, domain[1]]; + return [-LOG_MIN_ABS_DOMAIN, max]; } - return domain; + return [min, max]; } +export const LogBase = Object.freeze({ + /** + * log base `10` + */ + Common: 'common' as const, + /** + * log base `2` + */ + Binary: 'binary' as const, + /** + * log base `e` (aka ln) + */ + Natural: 'natural' as const, +}); +/** + * Log bases + */ +export type LogBase = $Values; + +const logBaseMap: Record = { + [LogBase.Common]: 10, + [LogBase.Binary]: 2, + [LogBase.Natural]: Math.E, +}; + interface ScaleData { /** The Type of continuous scale */ type: ScaleContinuousType; /** The data input domain */ domain: any[]; /** The data output range */ - range: [number, number]; + range: [min: number, max: number]; } interface ScaleOptions { @@ -138,11 +188,25 @@ interface ScaleOptions { * @defaultValue 10 */ ticks: number; - /** true if the scale was adjusted to fit one single value histogram */ + /** + * true if the scale was adjusted to fit one single value histogram + */ isSingleValueHistogram: boolean; - /** Show only integer values */ + /** + * Show only integer values + */ integersOnly?: boolean; + /** + * Set base for log scales, otherwise ignored + * @defaultValue 10 + */ + logBase: LogBase; + /** + * Set min limit for log scales, otherwise ignored + */ + logMinLimit?: number; } + const defaultScaleOptions: ScaleOptions = { bandwidth: 0, minInterval: 0, @@ -152,6 +216,7 @@ const defaultScaleOptions: ScaleOptions = { ticks: 10, isSingleValueHistogram: false, integersOnly: false, + logBase: LogBase.Common, }; /** @@ -198,12 +263,20 @@ export class ScaleContinuous implements Scale { ticks, isSingleValueHistogram, integersOnly, - } = mergePartial(defaultScaleOptions, options); + logBase, + logMinLimit, + } = mergePartial(defaultScaleOptions, options, { mergeOptionalPartialValues: true }); this.d3Scale = SCALES[type](); - const cleanDomain = type === ScaleType.Log ? limitLogScaleDomain(domain) : domain; - this.domain = cleanDomain; - this.d3Scale.domain(cleanDomain); + + if (type === ScaleType.Log) { + (this.d3Scale as ScaleLogarithmic).base(logBaseMap[logBase]); + this.domain = limitLogScaleDomain(domain as [number, number], logMinLimit); + } else { + this.domain = domain; + } + + this.d3Scale.domain(this.domain); const safeBarPadding = maxValueWithUpperLimit(barsPadding, 0, 1); this.barsPadding = safeBarPadding; @@ -218,6 +291,7 @@ export class ScaleContinuous implements Scale { this.timeZone = timeZone; this.totalBarsInCluster = totalBarsInCluster; this.isSingleValueHistogram = isSingleValueHistogram; + if (type === ScaleType.Time) { const startDomain = getMomentWithTz(this.domain[0], this.timeZone); const endDomain = getMomentWithTz(this.domain[1], this.timeZone); diff --git a/src/specs/constants.ts b/src/specs/constants.ts index 60c26d945c..6bc0575259 100644 --- a/src/specs/constants.ts +++ b/src/specs/constants.ts @@ -20,6 +20,7 @@ import { $Values } from 'utility-types'; import { ChartTypes } from '../chart_types'; +import { LogBase } from '../scales/scale_continuous'; import { Position } from '../utils/common'; import { LIGHT_THEME } from '../utils/themes/light_theme'; import { SettingsSpec } from './settings'; @@ -142,4 +143,6 @@ export const DEFAULT_SETTINGS_SPEC: SettingsSpec = { baseTheme: LIGHT_THEME, brushAxis: BrushAxis.X, minBrushDelta: 2, + xLogBase: LogBase.Common, + yLogBase: LogBase.Common, }; diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 654b0b9cfe..02aeac91c6 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -29,6 +29,7 @@ import { SeriesIdentifier } from '../common/series_id'; import { TooltipPortalSettings } from '../components'; import { CustomTooltip } from '../components/tooltip/types'; import { ScaleContinuousType, ScaleOrdinalType } from '../scales'; +import { LogBase } from '../scales/scale_continuous'; import { LegendPath } from '../state/actions/legend'; import { getConnect, specComponentFactory } from '../state/spec_factory'; import { Accessor } from '../utils/accessor'; @@ -470,6 +471,32 @@ export interface SettingsSpec extends Spec { * Render component for no results UI */ noResults?: ComponentType | ReactChild; + /** + * Min log value to render y scale + * + * Defaults to min value of domain, or 0 if mixed polarity + */ + yLogMinLimit?: number; + + /** + * Min log value to render y scale + * + * Defaults to min value of domain, or 0 if mixed polarity + */ + yLogBase: LogBase; + /** + * Min log value to render x scale + * + * Defaults to min value of domain, or 0 if mixed polarity + */ + xLogMinLimit?: number; + + /** + * Min log value to render x scale + * + * Defaults to min value of domain, or 0 if mixed polarity + */ + xLogBase: LogBase; } /** @@ -528,7 +555,9 @@ export type DefaultSettingsProps = | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' - | 'externalPointerEvents'; + | 'externalPointerEvents' + | 'yLogBase' + | 'xLogBase'; export type SettingsSpecProps = Partial>; diff --git a/src/utils/domain.ts b/src/utils/domain.ts index b67c388d71..0dd085b0b9 100644 --- a/src/utils/domain.ts +++ b/src/utils/domain.ts @@ -23,7 +23,9 @@ import { YDomainRange } from '../specs'; import { AccessorFn } from './accessor'; import { getPercentageValue } from './common'; -export type Domain = any[]; +export type OrdinalDomain = (number | string)[]; +export type ContinousDomain = [min: number, max: number]; +export type Domain = OrdinalDomain | ContinousDomain; /** @internal */ export function computeOrdinalDataDomain( @@ -73,16 +75,17 @@ function getPaddedRange(start: number, end: number, domainOptions?: YDomainRange /** @internal */ export function computeDomainExtent( [start, end]: [number, number] | [undefined, undefined], + isLogScale: boolean, domainOptions?: YDomainRange, ): [number, number] { if (start != null && end != null) { const [paddedStart, paddedEnd] = getPaddedRange(start, end, domainOptions); if (paddedStart >= 0 && paddedEnd >= 0) { - return domainOptions?.fit ? [paddedStart, paddedEnd] : [0, paddedEnd]; + return domainOptions?.fit || isLogScale ? [paddedStart, paddedEnd] : [0, paddedEnd]; } if (paddedStart < 0 && paddedEnd < 0) { - return domainOptions?.fit ? [paddedStart, paddedEnd] : [paddedStart, 0]; + return domainOptions?.fit || isLogScale ? [paddedStart, paddedEnd] : [paddedStart, 0]; } return [paddedStart, paddedEnd]; @@ -101,6 +104,7 @@ export function computeDomainExtent( export function computeContinuousDataDomain( data: any[], accessor: (n: any) => number, + isLogScale: boolean, domainOptions?: YDomainRange | null, ): number[] { const range = extent(data, accessor); @@ -109,5 +113,5 @@ export function computeContinuousDataDomain( return [range[0] ?? 0, range[1] ?? 0]; } - return computeDomainExtent(range, domainOptions); + return computeDomainExtent(range, isLogScale, domainOptions); } diff --git a/stories/scales/7_log_scale_options.tsx b/stories/scales/7_log_scale_options.tsx new file mode 100644 index 0000000000..e4089427bf --- /dev/null +++ b/stories/scales/7_log_scale_options.tsx @@ -0,0 +1,146 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { boolean, number, select } from '@storybook/addon-knobs'; +import { range } from 'lodash'; +import numeral from 'numeral'; +import React from 'react'; + +import { Chart, Axis, LineSeries, Position, ScaleType, Settings, SettingsSpecProps } from '../../src'; +import { LogBase } from '../../src/scales/scale_continuous'; +import { getKnobsFromEnum } from '../utils/knobs'; +import { SB_SOURCE_PANEL } from '../utils/storybook'; + +type LogKnobs = Pick & { + xDataType: string; + yDataType: string; + xNegative: boolean; + yNegative: boolean; +}; + +const getDataType = (group: string, defaultType = 'increasing') => + select( + 'Data type', + { + Increasing: 'increasing', + Decreasing: 'decreasing', + 'Up Down': 'upDown', + 'Down Up': 'downUp', + }, + defaultType, + group, + ); + +const getScaleType = (type: ScaleType, group: string) => + getKnobsFromEnum('Scale Type', ScaleType, type, { group, include: ['linear', 'log'] }) as Extract< + ScaleType, + 'log' | 'linear' + >; + +const getLogKnobs = (): LogKnobs => { + const xGroup = 'X - Axis'; + const yGroup = 'Y - Axis'; + const yUseDefaultLimit = boolean('Use default limit', false, yGroup); + const yLimit = number('Log min limit', 1, { min: 0 }, yGroup); + const xUseDefaultLimit = boolean('Use default limit', false, xGroup); + const xLimit = number('Log min limit', 1, { min: 0 }, xGroup); + return { + xDataType: getDataType(xGroup), + yDataType: getDataType(yGroup, 'upDown'), + xNegative: boolean('Use negative values', false, xGroup), + yNegative: boolean('Use negative values', false, yGroup), + yLogMinLimit: yUseDefaultLimit ? undefined : yLimit, + xLogMinLimit: xUseDefaultLimit ? undefined : xLimit, + yLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: yGroup }), + xLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: xGroup }), + }; +}; + +const getDataValue = (type: string, v: number, i: number, length: number) => { + switch (type) { + case 'increasing': + return i - Math.round(length / 2); + case 'decreasing': + return -i + Math.round(length / 2); + case 'upDown': + return v; + case 'downUp': + default: + return -v; + } +}; + +const logBaseMap = { + [LogBase.Common]: 10, + [LogBase.Binary]: 2, + [LogBase.Natural]: Math.E, +}; + +const getInitalData = (rows: number) => { + const quart = Math.round(rows / 4); + return [...range(quart, -quart, -1), ...range(-quart, quart + 1, 1)]; +}; + +const getData = (rows: number, { yLogBase, xLogBase, yDataType, xDataType, yNegative, xNegative }: LogKnobs) => + getInitalData(rows).map((v, i, { length }) => { + const y0 = getDataValue(yDataType, v, i, length); + const x0 = getDataValue(xDataType, v, i, length); + return { + y: Math.pow(logBaseMap[yLogBase ?? LogBase.Common], y0) * (yNegative ? -1 : 1), + x: Math.pow(logBaseMap[xLogBase ?? LogBase.Common], x0) * (xNegative ? -1 : 1), + }; + }); + +const formatter = (n: number) => numeral(n).format('0,00e+0'); + +export const Example = () => { + const rows = number('Rows in dataset', 11, { min: 5, step: 2, max: 21 }); + const logOptions = getLogKnobs(); + const data = getData(rows, logOptions); + + return ( + + + + + + + ); +}; + +Example.story = { + parameters: { + options: { selectedPanel: SB_SOURCE_PANEL }, + info: { + text: `Log scales will try to best fit the data without setting a baseline to a set value. + If you provide a \`yLogMinLimit\` or \`xLogMinLimit\`, the scale will be limited to that value. + This does _not_ replace the min domain value, such that if all values are greater than this limit, + the domain min will be determined by the dataset.\n\nThe \`yLogBase\` and \`xLogBase\` + provides a way to set the base of the log to one of following: + [\`Common\`](https://en.wikipedia.org/wiki/Common_logarithm) (base 10), + [\`Binary\`](https://en.wikipedia.org/wiki/Binary_logarithm) (base 2), + [\`Natural\`](https://en.wikipedia.org/wiki/Natural_logarithm) (base e), the default is \`Common\``, + }, + }, +}; diff --git a/stories/scales/scales.stories.tsx b/stories/scales/scales.stories.tsx index 5a6fe64b56..5beae5f94c 100644 --- a/stories/scales/scales.stories.tsx +++ b/stories/scales/scales.stories.tsx @@ -32,3 +32,4 @@ export { Example as tooltipInUTC } from './3_utc_tooltip'; export { Example as specifiedTimezone } from './4_specified_timezone'; export { Example as removeDuplicateAxis } from './5_remove_duplicates'; export { Example as xScaleFallback } from './6_x_scale_fallback'; +export { Example as logScaleOptions } from './7_log_scale_options'; diff --git a/stories/utils/knobs.ts b/stories/utils/knobs.ts index a9ff4ceb1b..39d693f351 100644 --- a/stories/utils/knobs.ts +++ b/stories/utils/knobs.ts @@ -19,6 +19,7 @@ import { PopoverAnchorPosition } from '@elastic/eui'; import { select, array, number, optionsKnob } from '@storybook/addon-knobs'; +import { SelectTypeKnobValue } from '@storybook/addon-knobs/dist/components/types'; import { Rotation, Position, Placement, TooltipProps } from '../../src'; import { TooltipType } from '../../src/specs/constants'; @@ -63,6 +64,39 @@ export const getTooltipTypeKnob = ( groupId, ); +/** + * Generates storybook knobs from const enum + * + * TODO: cleanup types to infer T + */ +export const getKnobsFromEnum = >( + name: string, + options: O, + defaultValue: T, + { + group, + include, + exclude, + }: { + group?: string; + include?: Array; + exclude?: Array; + } = {}, +): T | undefined => + select( + name, + (Object.entries(options) as [keyof O, T][]) + .filter(([, v]) => !include || include.includes(v)) + .filter(([, v]) => !exclude || !exclude.includes(v)) + .reduce((acc, [key, value]) => { + // @ts-ignore + acc[key] = value; + return acc; + }, {} as O), + defaultValue, + group, + ) || undefined; + export const getPositionKnob = (name = 'chartRotation', defaultValue = Position.Right) => select( name, From 42ce4392d709b939b913c8a49245c78335f2a681 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 5 Feb 2021 11:08:46 -0600 Subject: [PATCH 02/12] chore: tighten Domain and Range types per x and y --- docs/charts.tsx | 4 +-- .../heatmap/layout/viewmodel/viewmodel.ts | 7 ++-- src/chart_types/xy_chart/domains/types.ts | 5 +-- src/chart_types/xy_chart/domains/x_domain.ts | 13 +++++-- src/chart_types/xy_chart/domains/y_domain.ts | 4 +-- .../compute_small_multiple_scales.ts | 4 +-- src/chart_types/xy_chart/state/utils/types.ts | 6 ++-- .../xy_chart/state/utils/utils.test.ts | 5 +-- src/chart_types/xy_chart/state/utils/utils.ts | 4 +-- src/chart_types/xy_chart/utils/scales.ts | 3 +- src/scales/scale_band.ts | 3 +- src/scales/scale_continuous.test.ts | 18 +++++----- src/specs/settings.tsx | 4 +-- src/utils/domain.ts | 6 ++-- stories/bar/32_scale_to_extent.tsx | 4 +-- yarn.lock | 36 ++----------------- 16 files changed, 53 insertions(+), 73 deletions(-) diff --git a/docs/charts.tsx b/docs/charts.tsx index 58153b9fa8..fe4fe38b99 100644 --- a/docs/charts.tsx +++ b/docs/charts.tsx @@ -100,7 +100,7 @@ function generateAnnotationData(values: any[]): LineAnnotationDatum[] { return values.map((value, index) => ({ dataValue: value, details: `detail-${index}` })); } -export const lineBasicXDomainContinous = () => { +export const lineBasicXDomainContinuous = () => { const data = arrayKnobs('data values', [2.5, 7.2]); const dataValues = generateAnnotationData(data); @@ -149,7 +149,7 @@ export const lineBasicXDomainContinous = () => { ); }; -lineBasicXDomainContinous.story = { +lineBasicXDomainContinuous.story = { name: '[line] basic xDomain continuous', }; diff --git a/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts b/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts index dcf5e99b43..20302ab943 100644 --- a/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts +++ b/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts @@ -104,7 +104,8 @@ export function shapeViewModel( const yInvertedScale = scaleQuantize().domain([0, height]).range(yValues); - let xValues = xDomain.domain; + // TODO: Fix domain type to be `Array` + let xValues = xDomain.domain as any[]; const timeScale = xDomain.scaleType === ScaleType.Time @@ -123,8 +124,8 @@ export function shapeViewModel( if (timeScale) { const result = []; - let [timePoint] = xDomain.domain; - while (timePoint < xDomain.domain[1]) { + let [timePoint] = xValues; + while (timePoint < xValues[1]) { result.push(timePoint); timePoint += xDomain.minInterval; } diff --git a/src/chart_types/xy_chart/domains/types.ts b/src/chart_types/xy_chart/domains/types.ts index bb3509d461..7939ba14cb 100644 --- a/src/chart_types/xy_chart/domains/types.ts +++ b/src/chart_types/xy_chart/domains/types.ts @@ -19,12 +19,11 @@ import { ScaleContinuousType } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; -import { Domain } from '../../../utils/domain'; +import { OrdinalDomain, ContinuousDomain } from '../../../utils/domain'; import { GroupId } from '../../../utils/ids'; export interface BaseDomain { scaleType: typeof ScaleType.Ordinal | ScaleContinuousType; - domain: Domain; /* if the scale needs to be a band scale: used when displaying bars */ isBandScale: boolean; } @@ -35,6 +34,7 @@ export type XDomain = BaseDomain & { minInterval: number; /** if x domain is time, we should also specify the timezone */ timeZone?: string; + domain: OrdinalDomain | ContinuousDomain; }; export type YDomain = BaseDomain & { @@ -42,4 +42,5 @@ export type YDomain = BaseDomain & { isBandScale: false; scaleType: ScaleContinuousType; groupId: GroupId; + domain: ContinuousDomain; }; diff --git a/src/chart_types/xy_chart/domains/x_domain.ts b/src/chart_types/xy_chart/domains/x_domain.ts index de97fedd5e..a0272222b9 100644 --- a/src/chart_types/xy_chart/domains/x_domain.ts +++ b/src/chart_types/xy_chart/domains/x_domain.ts @@ -21,7 +21,12 @@ import { Optional } from 'utility-types'; import { ScaleType } from '../../../scales/constants'; import { compareByValueAsc, identity } from '../../../utils/common'; -import { computeContinuousDataDomain, computeOrdinalDataDomain, Domain } from '../../../utils/domain'; +import { + computeContinuousDataDomain, + computeOrdinalDataDomain, + OrdinalDomain, + ContinuousDomain, +} from '../../../utils/domain'; import { Logger } from '../../../utils/logger'; import { isCompleteBound, isLowerBound, isUpperBound } from '../utils/axis_type_utils'; import { BasicSeriesSpec, DomainRange, SeriesTypes, XScaleType } from '../utils/specs'; @@ -39,7 +44,7 @@ import { XDomain } from './types'; export function mergeXDomain( specs: Optional, 'seriesType'>[], xValues: Set, - customXDomain?: DomainRange | Domain, + customXDomain?: DomainRange | OrdinalDomain | ContinuousDomain, fallbackScale?: XScaleType, ): XDomain { const mainXScaleType = convertXScaleTypes(specs); @@ -76,7 +81,9 @@ export function mergeXDomain( } } } else { - seriesXComputedDomains = computeContinuousDataDomain(values, identity, { fit: true }); + seriesXComputedDomains = computeContinuousDataDomain(values, identity, mainXScaleType.scaleType === ScaleType.Log, { + fit: true, + }); let customMinInterval: undefined | number; if (customXDomain) { diff --git a/src/chart_types/xy_chart/domains/y_domain.ts b/src/chart_types/xy_chart/domains/y_domain.ts index d3c1a76019..62cdea4e2f 100644 --- a/src/chart_types/xy_chart/domains/y_domain.ts +++ b/src/chart_types/xy_chart/domains/y_domain.ts @@ -20,7 +20,7 @@ import { ScaleContinuousType } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; import { identity } from '../../../utils/common'; -import { computeContinuousDataDomain } from '../../../utils/domain'; +import { computeContinuousDataDomain, ContinuousDomain } from '../../../utils/domain'; import { GroupId } from '../../../utils/ids'; import { Logger } from '../../../utils/logger'; import { getSpecDomainGroupId } from '../state/utils/spec'; @@ -76,7 +76,7 @@ function mergeYDomainForGroup( const groupId = getSpecDomainGroupId(spec); const isLogScale = groupYScaleType === ScaleType.Log; - let domain: number[]; + let domain: ContinuousDomain; if (stackMode === StackMode.Percentage) { domain = computeContinuousDataDomain([0, 1], identity, isLogScale, customDomain); } else { diff --git a/src/chart_types/xy_chart/state/selectors/compute_small_multiple_scales.ts b/src/chart_types/xy_chart/state/selectors/compute_small_multiple_scales.ts index 38521826b7..d655195fe2 100644 --- a/src/chart_types/xy_chart/state/selectors/compute_small_multiple_scales.ts +++ b/src/chart_types/xy_chart/state/selectors/compute_small_multiple_scales.ts @@ -26,7 +26,7 @@ import { DEFAULT_SM_PANEL_PADDING, SmallMultiplesSpec } from '../../../../specs/ import { GlobalChartState } from '../../../../state/chart_state'; import { getChartIdSelector } from '../../../../state/selectors/get_chart_id'; import { getSpecsFromStore } from '../../../../state/utils'; -import { Domain } from '../../../../utils/domain'; +import { OrdinalDomain } from '../../../../utils/domain'; import { computeChartDimensionsSelector } from './compute_chart_dimensions'; import { computeSeriesDomainsSelector } from './compute_series_domains'; @@ -62,7 +62,7 @@ export const computeSmallMultipleScalesSelector = createCachedSelector( }, )(getChartIdSelector); -function getScale(domain: Domain, maxRange: number, padding = DEFAULT_SM_PANEL_PADDING) { +function getScale(domain: OrdinalDomain, maxRange: number, padding = DEFAULT_SM_PANEL_PADDING) { const singlePanelSmallMultiple = domain.length <= 1; const defaultDomain = domain.length === 0 ? [undefined] : domain; return new ScaleBand(defaultDomain, [0, maxRange], undefined, singlePanelSmallMultiple ? 0 : padding); diff --git a/src/chart_types/xy_chart/state/utils/types.ts b/src/chart_types/xy_chart/state/utils/types.ts index 758a5517ef..4f2c9dcd41 100644 --- a/src/chart_types/xy_chart/state/utils/types.ts +++ b/src/chart_types/xy_chart/state/utils/types.ts @@ -18,7 +18,7 @@ */ import { Scale } from '../../../../scales'; -import { Domain } from '../../../../utils/domain'; +import { OrdinalDomain } from '../../../../utils/domain'; import { PointGeometry, BarGeometry, @@ -78,8 +78,8 @@ export interface ComputedGeometries { export interface SeriesDomainsAndData { xDomain: XDomain; yDomain: YDomain[]; - smVDomain: Domain; - smHDomain: Domain; + smVDomain: OrdinalDomain; + smHDomain: OrdinalDomain; formattedDataSeries: DataSeries[]; } diff --git a/src/chart_types/xy_chart/state/utils/utils.test.ts b/src/chart_types/xy_chart/state/utils/utils.test.ts index 6398c1c381..0a67d76263 100644 --- a/src/chart_types/xy_chart/state/utils/utils.test.ts +++ b/src/chart_types/xy_chart/state/utils/utils.test.ts @@ -27,6 +27,7 @@ import { ScaleContinuous } from '../../../../scales'; import { ScaleType } from '../../../../scales/constants'; import { Spec } from '../../../../specs'; import { BARCHART_1Y0G, BARCHART_1Y1G } from '../../../../utils/data_samples/test_dataset'; +import { ContinuousDomain, Range } from '../../../../utils/domain'; import { SpecId } from '../../../../utils/ids'; import { PointShape } from '../../../../utils/themes/theme'; import { getSeriesIndex, XYChartSeriesIdentifier } from '../../utils/series'; @@ -731,8 +732,8 @@ describe('Chart State utils', () => { }); test('can compute xScaleOffset dependent on histogram mode', () => { - const domain = [0, 10]; - const range: [number, number] = [0, 100]; + const domain: ContinuousDomain = [0, 10]; + const range: Range = [0, 100]; const bandwidth = 10; const barsPadding = 0.5; const scale = new ScaleContinuous( diff --git a/src/chart_types/xy_chart/state/utils/utils.ts b/src/chart_types/xy_chart/state/utils/utils.ts index 60c3f133c6..261a82fdba 100644 --- a/src/chart_types/xy_chart/state/utils/utils.ts +++ b/src/chart_types/xy_chart/state/utils/utils.ts @@ -24,7 +24,7 @@ import { OrderBy, SettingsSpec } from '../../../../specs/settings'; import { mergePartial, Rotation, Color, isUniqueArray } from '../../../../utils/common'; import { CurveType } from '../../../../utils/curves'; import { Dimensions, Size } from '../../../../utils/dimensions'; -import { Domain } from '../../../../utils/domain'; +import { ContinuousDomain, OrdinalDomain } from '../../../../utils/domain'; import { PointGeometry, BarGeometry, @@ -153,7 +153,7 @@ export function computeSeriesDomains( seriesSpecs: BasicSeriesSpec[], customYDomainsByGroupId: Map = new Map(), deselectedDataSeries: SeriesIdentifier[] = [], - customXDomain?: DomainRange | Domain, + customXDomain?: DomainRange | ContinuousDomain | OrdinalDomain, orderOrdinalBinsBy?: OrderBy, smallMultiples?: { vertical?: GroupBySpec; horizontal?: GroupBySpec }, sortSeriesBy?: SeriesCompareFn | SortSeriesByConfig, diff --git a/src/chart_types/xy_chart/utils/scales.ts b/src/chart_types/xy_chart/utils/scales.ts index 8339ea5a1f..0360d6a0d5 100644 --- a/src/chart_types/xy_chart/utils/scales.ts +++ b/src/chart_types/xy_chart/utils/scales.ts @@ -20,6 +20,7 @@ import { Scale, ScaleBand, ScaleContinuous } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; import { LogBase } from '../../../scales/scale_continuous'; +import { ContinuousDomain } from '../../../utils/domain'; import { GroupId } from '../../../utils/ids'; import { XDomain, YDomain } from '../domains/types'; @@ -79,7 +80,7 @@ export function computeXScale(options: XScaleOptions): Scale { return new ScaleBand(domain, range, bandwidth, barsPadding); } if (isBandScale) { - const [domainMin, domainMax] = domain; + const [domainMin, domainMax] = domain as ContinuousDomain; const isSingleValueHistogram = !!enableHistogramMode && domainMax - domainMin === 0; const adjustedDomainMax = isSingleValueHistogram ? domainMin + minInterval : domainMax; diff --git a/src/scales/scale_band.ts b/src/scales/scale_band.ts index 9ae92280cd..8e70cb829a 100644 --- a/src/scales/scale_band.ts +++ b/src/scales/scale_band.ts @@ -22,6 +22,7 @@ import { scaleBand, scaleQuantize, ScaleQuantize, ScaleBand as D3ScaleBand } fro import { Scale, ScaleBandType } from '.'; import { PrimitiveValue } from '../chart_types/partition_chart/layout/utils/group_by_rollup'; import { maxValueWithUpperLimit, stringifyNullsUndefined } from '../utils/common'; +import { Range } from '../utils/domain'; import { ScaleType } from './constants'; /** @@ -59,7 +60,7 @@ export class ScaleBand implements Scale { constructor( domain: any[], - range: [number, number], + range: Range, overrideBandwidth?: number, /** * The proportion of the range that is reserved for blank space between bands diff --git a/src/scales/scale_continuous.test.ts b/src/scales/scale_continuous.test.ts index 63280caafc..7d5bf0430c 100644 --- a/src/scales/scale_continuous.test.ts +++ b/src/scales/scale_continuous.test.ts @@ -22,13 +22,13 @@ import { DateTime, Settings } from 'luxon'; import { ScaleContinuous, ScaleBand } from '.'; import { XDomain } from '../chart_types/xy_chart/domains/types'; import { computeXScale } from '../chart_types/xy_chart/utils/scales'; -import { Domain } from '../utils/domain'; +import { ContinuousDomain, Range } from '../utils/domain'; import { ScaleType } from './constants'; import { isLogarithmicScale } from './types'; describe('Scale Continuous', () => { test('shall invert on continuous scale linear', () => { - const domain: Domain = [0, 2]; + const domain: ContinuousDomain = [0, 2]; const minRange = 0; const maxRange = 100; const scale = new ScaleContinuous({ type: ScaleType.Linear, domain, range: [minRange, maxRange] }); @@ -37,7 +37,7 @@ describe('Scale Continuous', () => { expect(scale.invert(100)).toBe(2); }); test('is value within domain', () => { - const domain: Domain = [0, 2]; + const domain: ContinuousDomain = [0, 2]; const minRange = 0; const maxRange = 100; const scale = new ScaleContinuous({ type: ScaleType.Linear, domain, range: [minRange, maxRange] }); @@ -59,8 +59,8 @@ describe('Scale Continuous', () => { expect(scale.invert(100)).toBe(endTime.toMillis()); }); test('check if a scale is log scale', () => { - const domain: Domain = [0, 2]; - const range: [number, number] = [0, 100]; + const domain: ContinuousDomain = [0, 2]; + const range: Range = [0, 100]; const scaleLinear = new ScaleContinuous({ type: ScaleType.Linear, domain, range }); const scaleLog = new ScaleContinuous({ type: ScaleType.Log, domain, range }); const scaleTime = new ScaleContinuous({ type: ScaleType.Time, domain, range }); @@ -73,9 +73,9 @@ describe('Scale Continuous', () => { expect(isLogarithmicScale(scaleBand)).toBe(false); }); test('can get the right x value on linear scale', () => { - const domain: Domain = [0, 2]; + const domain: ContinuousDomain = [0, 2]; const data = [0, 0.5, 0.8, 2]; - const range: [number, number] = [0, 2]; + const range: Range = [0, 2]; const scaleLinear = new ScaleContinuous({ type: ScaleType.Linear, domain, range }); expect(scaleLinear.bandwidth).toBe(0); expect(scaleLinear.invertWithStep(0, data)).toEqual({ value: 0, withinBandwidth: true }); @@ -127,7 +127,7 @@ describe('Scale Continuous', () => { // we tweak the maxRange removing the bandwidth to correctly compute // a band linear scale in computeXScale - const range: [number, number] = [0, 100 - 10]; + const range: Range = [0, 100 - 10]; const scaleLinear = new ScaleContinuous( { type: ScaleType.Linear, domain, range }, { bandwidth: 10, minInterval: 10 }, @@ -435,7 +435,7 @@ describe('Scale Continuous', () => { }); }); describe('ticks as integers or floats', () => { - const domain: Domain = [0, 7]; + const domain: ContinuousDomain = [0, 7]; const minRange = 0; const maxRange = 100; let scale: ScaleContinuous; diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 02aeac91c6..d0b72cf05b 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -34,7 +34,7 @@ import { LegendPath } from '../state/actions/legend'; import { getConnect, specComponentFactory } from '../state/spec_factory'; import { Accessor } from '../utils/accessor'; import { Color, Position, Rendering, Rotation } from '../utils/common'; -import { Domain } from '../utils/domain'; +import { ContinuousDomain, OrdinalDomain } from '../utils/domain'; import { GeometryValue } from '../utils/geometry'; import { GroupId } from '../utils/ids'; import { SeriesCompareFn } from '../utils/series_sort'; @@ -411,7 +411,7 @@ export interface SettingsSpec extends Spec { onLegendItemMinusClick?: LegendItemListener; onPointerUpdate?: PointerUpdateListener; onRenderChange?: RenderChangeListener; - xDomain?: Domain | DomainRange; + xDomain?: ContinuousDomain | OrdinalDomain | DomainRange; resizeDebounce?: number; /** * Render slot to render action for legend diff --git a/src/utils/domain.ts b/src/utils/domain.ts index 0dd085b0b9..9a38329b94 100644 --- a/src/utils/domain.ts +++ b/src/utils/domain.ts @@ -24,8 +24,8 @@ import { AccessorFn } from './accessor'; import { getPercentageValue } from './common'; export type OrdinalDomain = (number | string)[]; -export type ContinousDomain = [min: number, max: number]; -export type Domain = OrdinalDomain | ContinousDomain; +export type ContinuousDomain = [min: number, max: number]; +export type Range = [min: number, max: number]; /** @internal */ export function computeOrdinalDataDomain( @@ -106,7 +106,7 @@ export function computeContinuousDataDomain( accessor: (n: any) => number, isLogScale: boolean, domainOptions?: YDomainRange | null, -): number[] { +): ContinuousDomain { const range = extent(data, accessor); if (domainOptions === null) { diff --git a/stories/bar/32_scale_to_extent.tsx b/stories/bar/32_scale_to_extent.tsx index c015e96ce4..91e632e0aa 100644 --- a/stories/bar/32_scale_to_extent.tsx +++ b/stories/bar/32_scale_to_extent.tsx @@ -27,8 +27,8 @@ import { SB_SOURCE_PANEL } from '../utils/storybook'; const logDomains = (data: any[], customDomain: any) => { /* eslint-disable no-console */ console.clear(); - console.log('data domain:', JSON.stringify(computeContinuousDataDomain(data, (d) => d.y))); - console.log('computed domain:', JSON.stringify(computeContinuousDataDomain(data, (d) => d.y, customDomain))); + console.log('data domain:', JSON.stringify(computeContinuousDataDomain(data, (d) => d.y, false))); + console.log('computed domain:', JSON.stringify(computeContinuousDataDomain(data, (d) => d.y, false, customDomain))); /* eslint-enable */ }; diff --git a/yarn.lock b/yarn.lock index 7f760cdc4b..82e64fcc27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10032,7 +10032,7 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -13420,7 +13420,7 @@ import-modules@^2.0.0: resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw== -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -15620,11 +15620,6 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -15633,33 +15628,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -15785,11 +15758,6 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" From 7ef4e538f5611c87f33f52d4c2779c043503375a Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 5 Feb 2021 11:09:03 -0600 Subject: [PATCH 03/12] fix: broken unit tests and types --- .../xy_chart/utils/axis_utils.test.ts | 77 +++++++++++++------ src/utils/domain.test.ts | 37 +++++---- 2 files changed, 72 insertions(+), 42 deletions(-) diff --git a/src/chart_types/xy_chart/utils/axis_utils.test.ts b/src/chart_types/xy_chart/utils/axis_utils.test.ts index 589e5c2e17..d044e58545 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.test.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.test.ts @@ -25,6 +25,7 @@ import { MockGlobalSpec, MockSeriesSpec } from '../../../mocks/specs/specs'; import { MockStore } from '../../../mocks/store/store'; import { Scale } from '../../../scales'; import { ScaleType } from '../../../scales/constants'; +import { LogBase } from '../../../scales/scale_continuous'; import { SpecTypes } from '../../../specs/constants'; import { CanvasTextBBoxCalculator } from '../../../utils/bbox/canvas_text_bbox_calculator'; import { SvgTextBBoxCalculator } from '../../../utils/bbox/svg_text_bbox_calculator'; @@ -222,7 +223,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, ); @@ -235,7 +236,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, undefined, @@ -256,7 +257,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, ); @@ -279,7 +280,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, ); @@ -296,7 +297,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, ); @@ -313,7 +314,7 @@ describe('Axis computational utils', () => { [yDomain], 1, bboxCalculator, - 0, + MockGlobalSpec.settings(), axes, (v) => `${v}`, ); @@ -340,7 +341,7 @@ describe('Axis computational utils', () => { }); test('should generate a valid scale', () => { - const yScale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, 0, 100, 0); + const yScale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); expect(yScale).toBeDefined(); expect(yScale?.bandwidth).toBe(0); expect(yScale?.domain).toEqual([0, 1]); @@ -348,10 +349,10 @@ describe('Axis computational utils', () => { expect(yScale?.ticks()).toEqual([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]); const ungroupedAxisSpec = { ...verticalAxisSpec, groupId: 'foo' }; - const nullYScale = getScaleForAxisSpec(ungroupedAxisSpec, xDomain, [yDomain], 0, 0, 100, 0); + const nullYScale = getScaleForAxisSpec(ungroupedAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); expect(nullYScale).toBe(null); - const xScale = getScaleForAxisSpec(horizontalAxisSpec, xDomain, [yDomain], 0, 0, 100, 0); + const xScale = getScaleForAxisSpec(horizontalAxisSpec, xDomain, [yDomain], 0, false, 0, 100, LogBase.Common, 0); expect(xScale).toBeDefined(); }); @@ -372,7 +373,7 @@ describe('Axis computational utils', () => { describe('getAvailableTicks', () => { test('should compute to end of domain when histogram mode not enabled', () => { - const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, 0, 100, 0); + const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); const axisPositions = getAvailableTicks(verticalAxisSpec, scale!, 0, false, (v) => `${v}`, 0); const expectedAxisPositions = [ { label: '0', position: 100, value: 0 }, @@ -392,7 +393,7 @@ describe('Axis computational utils', () => { test('should compute positions with rotational offset', () => { const rotationalOffset = 2; - const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, 0, 100, 0); + const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); const axisPositions = getAvailableTicks(verticalAxisSpec, scale!, 0, false, (v) => `${v}`, rotationalOffset); const expectedAxisPositions = [ { label: '0', position: 100 + rotationalOffset, value: 0 }, @@ -419,7 +420,17 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 10, }; - const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, 0, 100, 0); + const xScale = getScaleForAxisSpec( + horizontalAxisSpec, + xBandDomain, + [yDomain], + 1, + false, + 0, + 100, + LogBase.Common, + 0, + ); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, @@ -441,7 +452,17 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 90000, }; - const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, 0, 100, 0); + const xScale = getScaleForAxisSpec( + horizontalAxisSpec, + xBandDomain, + [yDomain], + 1, + false, + 0, + 100, + LogBase.Common, + 0, + ); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, @@ -480,7 +501,17 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 90000, }; - const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, 0, 100, 0); + const xScale = getScaleForAxisSpec( + horizontalAxisSpec, + xBandDomain, + [yDomain], + 1, + false, + 0, + 100, + LogBase.Common, + 0, + ); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, @@ -960,8 +991,6 @@ describe('Axis computational utils', () => { }); test('should compute axis ticks positions with title', () => { - const chartRotation = 0; - // validate assumptions for test expect(verticalAxisSpec.id).toEqual(verticalAxisSpecWTitle.id); @@ -976,7 +1005,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - chartRotation, + MockGlobalSpec.settings(), axisSpecs, axisDims, axesStyles, @@ -1008,7 +1037,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - chartRotation, + MockGlobalSpec.settings(), axisSpecs, axisDims, axesStyles, @@ -1198,8 +1227,6 @@ describe('Axis computational utils', () => { }); test('should not compute axis ticks positions if missaligned specs', () => { - const chartRotation = 0; - const axisSpecs = [verticalAxisSpec]; const axisStyles = new Map(); const axisDims = new Map(); @@ -1211,7 +1238,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - chartRotation, + MockGlobalSpec.settings(), axisSpecs, axisDims, axisStyles, @@ -1284,7 +1311,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - 0, + MockGlobalSpec.settings(), invalidSpecs, axisDims, axisStyles, @@ -1675,7 +1702,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - 0, + MockGlobalSpec.settings(), axisSpecs, axisDims, axesStyles, @@ -1705,7 +1732,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - 0, + MockGlobalSpec.settings(), axisSpecs, axisDims, axesStyles, @@ -1741,7 +1768,7 @@ describe('Axis computational utils', () => { leftMargin: 0, }, LIGHT_THEME, - 0, + MockGlobalSpec.settings(), axisSpecs, axisDims, axesStyles, diff --git a/src/utils/domain.test.ts b/src/utils/domain.test.ts index 0f3a3233cf..27e8600102 100644 --- a/src/utils/domain.test.ts +++ b/src/utils/domain.test.ts @@ -87,7 +87,7 @@ describe('utils/domain', () => { test('should compute continuous data domain: data scaled to extent', () => { const data = [{ x: 12 }, { x: 6 }, { x: 8 }]; const accessor = (datum: any) => datum.x; - const continuousDataDomain = computeContinuousDataDomain(data, accessor, { fit: true }); + const continuousDataDomain = computeContinuousDataDomain(data, accessor, false, { fit: true }); const expectedContinuousDomain = [6, 12]; expect(continuousDataDomain).toEqual(expectedContinuousDomain); @@ -97,7 +97,7 @@ describe('utils/domain', () => { const data = [{ x: 12 }, { x: 6 }, { x: 8 }]; const accessor = (datum: any) => datum.x; - const continuousDataDomain = computeContinuousDataDomain(data, accessor); + const continuousDataDomain = computeContinuousDataDomain(data, accessor, false); const expectedContinuousDomain = [0, 12]; @@ -108,7 +108,7 @@ describe('utils/domain', () => { const data: any[] = []; const accessor = (datum: any) => datum.x; - const continuousDataDomain = computeContinuousDataDomain(data, accessor); + const continuousDataDomain = computeContinuousDataDomain(data, accessor, false); const expectedContinuousDomain = [0, 0]; @@ -117,68 +117,71 @@ describe('utils/domain', () => { describe('YDomainOptions', () => { it('should not effect domain when domain.fit is true', () => { - expect(computeDomainExtent([5, 10], { fit: true })).toEqual([5, 10]); + expect(computeDomainExtent([5, 10], false, { fit: true })).toEqual([5, 10]); }); describe('domain.fit is true', () => { it('should find domain when start & end are positive', () => { - expect(computeDomainExtent([5, 10], { fit: true })).toEqual([5, 10]); + expect(computeDomainExtent([5, 10], false, { fit: true })).toEqual([5, 10]); }); it('should find domain when start & end are negative', () => { - expect(computeDomainExtent([-15, -10], { fit: true })).toEqual([-15, -10]); + expect(computeDomainExtent([-15, -10], false, { fit: true })).toEqual([-15, -10]); }); it('should find domain when start is negative, end is positive', () => { - expect(computeDomainExtent([-15, 10], { fit: true })).toEqual([-15, 10]); + expect(computeDomainExtent([-15, 10], false, { fit: true })).toEqual([-15, 10]); }); }); describe('domain.fit is false', () => { it('should find domain when start & end are positive', () => { - expect(computeDomainExtent([5, 10])).toEqual([0, 10]); + expect(computeDomainExtent([5, 10], false)).toEqual([0, 10]); }); it('should find domain when start & end are negative', () => { - expect(computeDomainExtent([-15, -10])).toEqual([-15, 0]); + expect(computeDomainExtent([-15, -10], false)).toEqual([-15, 0]); }); it('should find domain when start is negative, end is positive', () => { - expect(computeDomainExtent([-15, 10])).toEqual([-15, 10]); + expect(computeDomainExtent([-15, 10], false)).toEqual([-15, 10]); }); }); describe('padding does NOT cause domain to cross zero baseline', () => { it('should get domain from positive domain', () => { - expect(computeDomainExtent([10, 70], { fit: true, padding: 5 })).toEqual([5, 75]); + expect(computeDomainExtent([10, 70], false, { fit: true, padding: 5 })).toEqual([5, 75]); }); it('should get domain from positive & negative domain', () => { - expect(computeDomainExtent([-30, 30], { fit: true, padding: 5 })).toEqual([-35, 35]); + expect(computeDomainExtent([-30, 30], false, { fit: true, padding: 5 })).toEqual([-35, 35]); }); it('should get domain from negative domain', () => { - expect(computeDomainExtent([-70, -10], { fit: true, padding: 5 })).toEqual([-75, -5]); + expect(computeDomainExtent([-70, -10], false, { fit: true, padding: 5 })).toEqual([-75, -5]); }); }); describe('padding caused domain to cross zero baseline', () => { describe('constrainPadding true - default', () => { it('should set min baseline as 0 if original domain is less than zero', () => { - expect(computeDomainExtent([5, 65], { fit: true, padding: 15 })).toEqual([0, 80]); + expect(computeDomainExtent([5, 65], false, { fit: true, padding: 15 })).toEqual([0, 80]); }); it('should set max baseline as 0 if original domain is less than zero', () => { - expect(computeDomainExtent([-65, -5], { fit: true, padding: 15 })).toEqual([-80, 0]); + expect(computeDomainExtent([-65, -5], false, { fit: true, padding: 15 })).toEqual([-80, 0]); }); }); describe('constrainPadding false', () => { it('should allow min past baseline as 0, even if original domain is less than zero', () => { - expect(computeDomainExtent([5, 65], { fit: true, padding: 15, constrainPadding: false })).toEqual([-10, 80]); + expect(computeDomainExtent([5, 65], false, { fit: true, padding: 15, constrainPadding: false })).toEqual([ + -10, + 80, + ]); }); it('should allow max past baseline as 0, even if original domain is less than zero', () => { - expect(computeDomainExtent([-65, -5], { fit: true, padding: 15, constrainPadding: false })).toEqual([ + expect(computeDomainExtent([-65, -5], false, { fit: true, padding: 15, constrainPadding: false })).toEqual([ -80, 10, ]); From d6dcfecf4cce5bc90152c11d8969ffeac79c4f2c Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 5 Feb 2021 11:16:40 -0600 Subject: [PATCH 04/12] WIP --- src/components/__snapshots__/chart.test.tsx.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/__snapshots__/chart.test.tsx.snap b/src/components/__snapshots__/chart.test.tsx.snap index ab35a43e06..186d310df5 100644 --- a/src/components/__snapshots__/chart.test.tsx.snap +++ b/src/components/__snapshots__/chart.test.tsx.snap @@ -54,7 +54,7 @@ exports[`Chart should render the legend name test 1`] = ` - + From ea7868c52ff3bbe6a360c5595b9e9fd8170dcb34 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 5 Feb 2021 22:26:17 -0600 Subject: [PATCH 05/12] fix: mixed polarity, area baseline, add vrt, improve tick formatter --- ...-negative-values-with-log-scale-1-snap.png | Bin 31976 -> 35885 bytes ...ixed-polarity-domain-with-limit-1-snap.png | Bin 0 -> 30955 bytes ...polarity-domain-with-limit-of-0-1-snap.png | Bin 0 -> 34348 bytes ...should-render-proper-tick-count-1-snap.png | Bin 0 -> 23195 bytes ...should-render-proper-tick-count-2-snap.png | Bin 0 -> 15720 bytes ...should-render-proper-tick-count-3-snap.png | Bin 0 -> 15761 bytes integration/tests/area_stories.test.ts | 12 +++++ integration/tests/scales_stories.test.ts | 29 ++++++++++ src/chart_types/xy_chart/rendering/utils.ts | 11 ++-- src/scales/scale_continuous.ts | 22 ++++---- stories/area/17_negative.tsx | 5 +- stories/area/18_negative_positive.tsx | 4 +- stories/scales/7_log_scale_options.tsx | 39 +++++++++----- stories/utils/formatters.ts | 51 ++++++++++++++++++ 14 files changed, 139 insertions(+), 34 deletions(-) create mode 100644 integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-1-snap.png create mode 100644 integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-of-0-1-snap.png create mode 100644 integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-1-snap.png create mode 100644 integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-2-snap.png create mode 100644 integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-3-snap.png create mode 100644 integration/tests/scales_stories.test.ts create mode 100644 stories/utils/formatters.ts diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-negative-values-with-log-scale-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-negative-values-with-log-scale-1-snap.png index cb29697295b2d2d214c81cd7bc2ae0b61e2085ea..26cbef674853ca08dabb7b68d07d1314c7df2b39 100644 GIT binary patch literal 35885 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 diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d555330e5aa6fcd3336e21dc86cd268a7d4fcace GIT binary patch literal 30955 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 Cq?RK9 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-of-0-1-snap.png b/integration/tests/__image_snapshots__/area-stories-test-ts-area-series-stories-negative-log-areas-shows-only-positive-domain-mixed-polarity-domain-with-limit-of-0-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5f41d12a689ed344730be2295b2f539abe4a96 GIT binary patch literal 34348 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 Y0;EG`z8Mz9VZr}oB^4#|#PnbPKj0-gPyhe` literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-1-snap.png b/integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..222617d063e53dfd00ff91932468dd359365ea5c GIT binary patch literal 23195 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 DJ-K8< literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-2-snap.png b/integration/tests/__image_snapshots__/scales-stories-test-ts-scales-stories-should-render-proper-tick-count-2-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..610ea9253f9c7c2f7f2dbf296846d2f0c841a9ee GIT binary patch literal 15720 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

BuB=MPiFC84 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 nNR`xt3*?Z-fl{-Z!I~m2X$03`HQYo^>kzF#5 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 { ); }); + it('shows only positive domain mixed polarity domain with limit', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/area-chart--with-negative-and-positive&knob-Y scale=log&knob-Y log limit=0.01', + ); + }); + + it('shows only positive domain mixed polarity domain with limit of 0', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/area-chart--with-negative-and-positive&knob-Y scale=log&knob-Y log limit=0', + ); + }); + it('shows only positive values when hiding negative one', async () => { const action = async () => { await common.disableAnimations(); diff --git a/integration/tests/scales_stories.test.ts b/integration/tests/scales_stories.test.ts new file mode 100644 index 0000000000..1cc2ab6025 --- /dev/null +++ b/integration/tests/scales_stories.test.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { LogBase } from '../../src/scales/scale_continuous'; +import { common } from '../page_objects'; + +describe('Scales stories', () => { + it.each(Object.values(LogBase))('should render proper tick count', async (base) => { + await common.expectChartAtUrlToMatchScreenshot( + `http://localhost:9001/?path=/story/scales--log-scale-options&knob-Log base_Y - Axis=${base}`, + ); + }); +}); diff --git a/src/chart_types/xy_chart/rendering/utils.ts b/src/chart_types/xy_chart/rendering/utils.ts index 7da29bfe24..523daa19af 100644 --- a/src/chart_types/xy_chart/rendering/utils.ts +++ b/src/chart_types/xy_chart/rendering/utils.ts @@ -19,7 +19,6 @@ import { LegendItem } from '../../../common/legend'; import { Scale } from '../../../scales'; -import { LOG_MIN_ABS_DOMAIN } from '../../../scales/constants'; import { getDomainPolarity } from '../../../scales/scale_continuous'; import { isLogarithmicScale } from '../../../scales/types'; import { MarkBuffer } from '../../../specs'; @@ -161,11 +160,6 @@ export function isPointOnGeometry( * The default zero baseline for area charts. */ const DEFAULT_ZERO_BASELINE = 0; -/** - * The zero baseline for log scales. - * We are currently limiting to 1 as min accepted domain for a log scale. - */ -const DEFAULT_LOG_ZERO_BASELINE = LOG_MIN_ABS_DOMAIN; /** @internal */ export type YDefinedFn = ( @@ -201,12 +195,13 @@ export function getY1ScaledValueOrThrowFn(yScale: Scale): (datum: DataSeriesDatu export function getY0ScaledValueOrThrowFn(yScale: Scale): (datum: DataSeriesDatum) => number { const isLogScale = isLogarithmicScale(yScale); const domainPolarity = getDomainPolarity(yScale.domain); + const logBaseline = domainPolarity >= 0 ? Math.min(...yScale.domain) : Math.max(...yScale.domain); return ({ y0 }) => { if (y0 === null) { if (isLogScale) { // if all positive domain use 1 as baseline, -1 otherwise - return yScale.scaleOrThrow(domainPolarity >= 0 ? DEFAULT_LOG_ZERO_BASELINE : -DEFAULT_LOG_ZERO_BASELINE); + return yScale.scaleOrThrow(logBaseline); } return yScale.scaleOrThrow(DEFAULT_ZERO_BASELINE); } @@ -214,7 +209,7 @@ export function getY0ScaledValueOrThrowFn(yScale: Scale): (datum: DataSeriesDatu // wrong y0 polarity if ((domainPolarity >= 0 && y0 <= 0) || (domainPolarity < 0 && y0 >= 0)) { // if all positive domain use 1 as baseline, -1 otherwise - return yScale.scaleOrThrow(domainPolarity >= 0 ? DEFAULT_LOG_ZERO_BASELINE : -DEFAULT_LOG_ZERO_BASELINE); + return yScale.scaleOrThrow(logBaseline); } // if negative value, use -1 as max reference, 1 otherwise return yScale.scaleOrThrow(y0); diff --git a/src/scales/scale_continuous.ts b/src/scales/scale_continuous.ts index e74fd6ce08..cb273f7100 100644 --- a/src/scales/scale_continuous.ts +++ b/src/scales/scale_continuous.ts @@ -85,37 +85,39 @@ export function limitLogScaleDomain([min, max]: [min: number, max: number], logM } } + const fallbackLimit = absLimit || LOG_MIN_ABS_DOMAIN; + if (min === 0) { if (max > 0) { - return [LOG_MIN_ABS_DOMAIN, max]; + return [fallbackLimit, max]; } if (max < 0) { - return [-LOG_MIN_ABS_DOMAIN, max]; + return [-fallbackLimit, max]; } - return [LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]; + return [fallbackLimit, fallbackLimit]; } if (max === 0) { if (min > 0) { - return [min, LOG_MIN_ABS_DOMAIN]; + return [min, fallbackLimit]; } if (min < 0) { - return [min, -LOG_MIN_ABS_DOMAIN]; + return [min, -fallbackLimit]; } - return [LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]; + return [fallbackLimit, fallbackLimit]; } if (min < 0 && max > 0) { const isD0Min = Math.abs(max) - Math.abs(min) >= 0; if (isD0Min) { - return [LOG_MIN_ABS_DOMAIN, max]; + return [fallbackLimit, max]; } - return [min, -LOG_MIN_ABS_DOMAIN]; + return [min, -fallbackLimit]; } if (min > 0 && max < 0) { const isD0Max = Math.abs(min) - Math.abs(max) >= 0; if (isD0Max) { - return [min, LOG_MIN_ABS_DOMAIN]; + return [min, fallbackLimit]; } - return [-LOG_MIN_ABS_DOMAIN, max]; + return [-fallbackLimit, max]; } return [min, max]; } diff --git a/stories/area/17_negative.tsx b/stories/area/17_negative.tsx index 6c409e8b46..dd44c88f57 100644 --- a/stories/area/17_negative.tsx +++ b/stories/area/17_negative.tsx @@ -17,10 +17,10 @@ * under the License. */ -import { select } from '@storybook/addon-knobs'; +import { select, number } from '@storybook/addon-knobs'; import React from 'react'; -import { AreaSeries, Axis, Chart, Position, ScaleType, timeFormatter } from '../../src'; +import { AreaSeries, Axis, Chart, Position, ScaleType, timeFormatter, Settings } from '../../src'; import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; import { SB_SOURCE_PANEL } from '../utils/storybook'; @@ -40,6 +40,7 @@ export const Example = () => { ); return ( + Number(d).toFixed(2)} /> diff --git a/stories/area/18_negative_positive.tsx b/stories/area/18_negative_positive.tsx index f5002af184..c75dbbbe42 100644 --- a/stories/area/18_negative_positive.tsx +++ b/stories/area/18_negative_positive.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { select } from '@storybook/addon-knobs'; +import { select, number } from '@storybook/addon-knobs'; import React from 'react'; import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, timeFormatter } from '../../src'; @@ -39,7 +39,7 @@ export const Example = () => { return ( - + { } }; -const logBaseMap = { - [LogBase.Common]: 10, - [LogBase.Binary]: 2, - [LogBase.Natural]: Math.E, +const seriesMap = { + line: LineSeries, + area: AreaSeries, }; +const getSeriesType = () => + select( + 'Series Type', + { + Line: 'line', + Area: 'area', + }, + 'line', + ); + const getInitalData = (rows: number) => { const quart = Math.round(rows / 4); return [...range(quart, -quart, -1), ...range(-quart, quart + 1, 1)]; @@ -107,22 +116,28 @@ const getData = (rows: number, { yLogBase, xLogBase, yDataType, xDataType, yNega }; }); -const formatter = (n: number) => numeral(n).format('0,00e+0'); - export const Example = () => { const rows = number('Rows in dataset', 11, { min: 5, step: 2, max: 21 }); const logOptions = getLogKnobs(); const data = getData(rows, logOptions); + const type = getSeriesType(); + const Series = seriesMap[type]; return ( - - - + + diff --git a/stories/utils/formatters.ts b/stories/utils/formatters.ts new file mode 100644 index 0000000000..26809a0da5 --- /dev/null +++ b/stories/utils/formatters.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import numeral from 'numeral'; + +import { LogBase } from '../../src/scales/scale_continuous'; + +const superStringMap: Record = { + 0: '⁰', + 1: '¹', + 2: '²', + 3: '³', + 4: '⁴', + 5: '⁵', + 6: '⁶', + 7: '⁷', + 8: '⁸', + 9: '⁹', +}; + +export const getSuperScriptNumber = (n: number) => `${n > 0 ? '' : '⁻'}${superStringMap[Math.abs(n)]}`; + +export const logBaseMap = { + [LogBase.Common]: 10, + [LogBase.Binary]: 2, + [LogBase.Natural]: Math.E, +}; + +export const logFormatter = (base: LogBase = LogBase.Common) => (n: number) => { + const exp = Math.log(n) / Math.log(logBaseMap[base]) + Number.EPSILON; + const roundedExp = Math.floor(exp); + const constant = numeral(n / Math.pow(logBaseMap[base], roundedExp)).format('0[.]00'); + const baseLabel = base === LogBase.Natural ? 'e' : logBaseMap[base]; + return `${constant} x ${baseLabel}${getSuperScriptNumber(roundedExp)}`; +}; From af1c9836d485cea0555799760116ee3a14bcfab8 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Mon, 8 Feb 2021 12:17:34 -0600 Subject: [PATCH 06/12] test: revert original to args, fix new args --- .../xy_chart/state/utils/utils.test.ts | 8 ++-- .../xy_chart/utils/axis_utils.test.ts | 46 ++++--------------- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/chart_types/xy_chart/state/utils/utils.test.ts b/src/chart_types/xy_chart/state/utils/utils.test.ts index 8ac4393d5a..54f549002c 100644 --- a/src/chart_types/xy_chart/state/utils/utils.test.ts +++ b/src/chart_types/xy_chart/state/utils/utils.test.ts @@ -87,14 +87,14 @@ describe('Chart State utils', () => { }); expect(domains.yDomains).toEqual([ { - domain: [0, 10], + domain: [1, 10], scaleType: ScaleType.Log, groupId: 'group1', isBandScale: false, type: 'yDomain', }, { - domain: [0, 10], + domain: [1, 10], scaleType: ScaleType.Log, groupId: 'group2', isBandScale: false, @@ -135,14 +135,14 @@ describe('Chart State utils', () => { }); expect(domains.yDomains).toEqual([ { - domain: [0, 5], + domain: [1, 5], scaleType: ScaleType.Log, groupId: 'group1', isBandScale: false, type: 'yDomain', }, { - domain: [0, 9], + domain: [1, 9], scaleType: ScaleType.Log, groupId: 'group2', isBandScale: false, diff --git a/src/chart_types/xy_chart/utils/axis_utils.test.ts b/src/chart_types/xy_chart/utils/axis_utils.test.ts index 8d685cfc1f..7be490c741 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.test.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.test.ts @@ -353,7 +353,7 @@ describe('Axis computational utils', () => { }); test('should generate a valid scale', () => { - const yScale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); + const yScale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 100, 0, LogBase.Common); expect(yScale).toBeDefined(); expect(yScale?.bandwidth).toBe(0); expect(yScale?.domain).toEqual([0, 1]); @@ -361,10 +361,10 @@ describe('Axis computational utils', () => { expect(yScale?.ticks()).toEqual([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]); const ungroupedAxisSpec = { ...verticalAxisSpec, groupId: 'foo' }; - const nullYScale = getScaleForAxisSpec(ungroupedAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); + const nullYScale = getScaleForAxisSpec(ungroupedAxisSpec, xDomain, [yDomain], 0, true, 100, 0, LogBase.Common); expect(nullYScale).toBe(null); - const xScale = getScaleForAxisSpec(horizontalAxisSpec, xDomain, [yDomain], 0, false, 0, 100, LogBase.Common, 0); + const xScale = getScaleForAxisSpec(horizontalAxisSpec, xDomain, [yDomain], 0, false, 100, 0, LogBase.Common); expect(xScale).toBeDefined(); }); @@ -385,7 +385,7 @@ describe('Axis computational utils', () => { describe('getAvailableTicks', () => { test('should compute to end of domain when histogram mode not enabled', () => { - const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); + const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 100, 0, LogBase.Common); const axisPositions = getAvailableTicks(verticalAxisSpec, scale!, 0, false, (v) => `${v}`, 0); const expectedAxisPositions = [ { label: '0', position: 100, value: 0 }, @@ -405,7 +405,7 @@ describe('Axis computational utils', () => { test('should compute positions with rotational offset', () => { const rotationalOffset = 2; - const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 0, 100, LogBase.Common, 0); + const scale = getScaleForAxisSpec(verticalAxisSpec, xDomain, [yDomain], 0, true, 100, 0, LogBase.Common); const axisPositions = getAvailableTicks(verticalAxisSpec, scale!, 0, false, (v) => `${v}`, rotationalOffset); const expectedAxisPositions = [ { label: '0', position: 100 + rotationalOffset, value: 0 }, @@ -432,17 +432,7 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 10, }; - const xScale = getScaleForAxisSpec( - horizontalAxisSpec, - xBandDomain, - [yDomain], - 1, - false, - 0, - 100, - LogBase.Common, - 0, - ); + const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, false, 100, 0, LogBase.Common); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, @@ -464,17 +454,7 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 90000, }; - const xScale = getScaleForAxisSpec( - horizontalAxisSpec, - xBandDomain, - [yDomain], - 1, - false, - 0, - 100, - LogBase.Common, - 0, - ); + const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, false, 100, 0, LogBase.Common); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, @@ -513,17 +493,7 @@ describe('Axis computational utils', () => { isBandScale: true, minInterval: 90000, }; - const xScale = getScaleForAxisSpec( - horizontalAxisSpec, - xBandDomain, - [yDomain], - 1, - false, - 0, - 100, - LogBase.Common, - 0, - ); + const xScale = getScaleForAxisSpec(horizontalAxisSpec, xBandDomain, [yDomain], 1, false, 100, 0, LogBase.Common); const histogramAxisPositions = getAvailableTicks( horizontalAxisSpec, xScale!, From 52f1e0d8238737e9a08eaf916cad3c2a9298932c Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Mon, 8 Feb 2021 14:12:26 -0600 Subject: [PATCH 07/12] fix: upgrade api extractor and fix type issues --- api/charts.api.md | 75 +++++++++++++-------- package.json | 4 +- src/index.ts | 1 + yarn.lock | 168 +++++++++++++++++++--------------------------- 4 files changed, 120 insertions(+), 128 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index a47d23fc8f..16ae60a637 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -6,7 +6,7 @@ import { $Values } from 'utility-types'; import { ComponentType } from 'react'; -import React from 'react'; +import { default as React_2 } from 'react'; import { ReactChild } from 'react'; // @public @@ -103,7 +103,7 @@ export interface ArcStyle { // Warning: (ae-missing-release-tag) "AreaSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const AreaSeries: React.FunctionComponent; +export const AreaSeries: React_2.FunctionComponent; // @public export type AreaSeriesSpec = BasicSeriesSpec & HistogramConfig & Postfixes & { @@ -160,7 +160,7 @@ export interface ArrayNode extends NodeDescriptor { // Warning: (ae-missing-release-tag) "Axis" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const Axis: React.FunctionComponent; +export const Axis: React_2.FunctionComponent; // @public (undocumented) export type AxisId = string; @@ -262,7 +262,7 @@ export interface BandFillColorAccessorInput { // Warning: (ae-missing-release-tag) "BarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const BarSeries: React.FunctionComponent; +export const BarSeries: React_2.FunctionComponent; // @public export type BarSeriesSpec = BasicSeriesSpec & Postfixes & { @@ -360,7 +360,7 @@ export type BrushEndListener = (brushArea: XYBrushArea) => void; // Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts // // @alpha -export const BubbleSeries: React.FunctionComponent; +export const BubbleSeries: React_2.FunctionComponent; // @alpha export type BubbleSeriesSpec = BasicSeriesSpec & { @@ -419,7 +419,7 @@ export interface Cell { // Warning: (ae-missing-release-tag) "Chart" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class Chart extends React.Component { +export class Chart extends React_2.Component { constructor(props: ChartProps); // (undocumented) componentDidMount(): void; @@ -428,9 +428,9 @@ export class Chart extends React.Component { // (undocumented) static defaultProps: ChartProps; // (undocumented) - dispatchExternalPointerEvent(event: PointerEvent): void; + dispatchExternalPointerEvent(event: PointerEvent_2): void; // (undocumented) - getChartContainerRef: () => React.RefObject; + getChartContainerRef: () => React_2.RefObject; // (undocumented) getPNGSnapshot(options?: { backgroundColor: string; @@ -461,7 +461,7 @@ export interface ChartSizeObject { // Warning: (ae-missing-release-tag) "ChartTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // -// @public (undocumented) +// @public export const ChartTypes: Readonly<{ Global: "global"; Goal: "goal"; @@ -517,6 +517,11 @@ export type ColorVariant = $Values; // @public (undocumented) export type CompleteBoundedDomain = DomainBase & LowerBound & UpperBound; +// Warning: (ae-missing-release-tag) "ContinuousDomain" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ContinuousDomain = [min: number, max: number]; + // Warning: (ae-missing-release-tag) "CrosshairStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -696,7 +701,7 @@ export const DEFAULT_TOOLTIP_TYPE: "vertical"; // Warning: (ae-missing-release-tag) "DefaultSettingsProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents'; +export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents' | 'yLogBase' | 'xLogBase'; // Warning: (ae-missing-release-tag) "DEPTH_KEY" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -858,7 +863,7 @@ export function getNodeName(node: ArrayNode): string; // Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts // // @alpha (undocumented) -export const Goal: React.FunctionComponent; +export const Goal: React_2.FunctionComponent; // @alpha (undocumented) export interface GoalSpec extends Spec { @@ -923,7 +928,7 @@ export interface GroupBrushExtent { } // @alpha (undocumented) -export const GroupBy: React.FunctionComponent; +export const GroupBy: React_2.FunctionComponent; // @alpha (undocumented) export type GroupByAccessor = (spec: Spec, datum: any) => string | number; @@ -952,7 +957,7 @@ export interface GroupBySpec extends Spec { export type GroupId = string; // @alpha (undocumented) -export const Heatmap: React.FunctionComponent & Partial>>; +export const Heatmap: React_2.FunctionComponent & Partial>>; // Warning: (ae-missing-release-tag) "HeatmapBrushEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1131,7 +1136,7 @@ export type HierarchyOfArrays = Array; // Warning: (ae-missing-release-tag) "HistogramBarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const HistogramBarSeries: React.FunctionComponent; +export const HistogramBarSeries: React_2.FunctionComponent; // @public export type HistogramBarSeriesSpec = Omit & { @@ -1273,7 +1278,7 @@ export const LIGHT_THEME: Theme; // Warning: (ae-missing-release-tag) "LineAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const LineAnnotation: React.FunctionComponent; +export const LineAnnotation: React_2.FunctionComponent; // @public export interface LineAnnotationDatum { @@ -1308,7 +1313,7 @@ export interface LineAnnotationStyle { // Warning: (ae-missing-release-tag) "LineSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const LineSeries: React.FunctionComponent; +export const LineSeries: React_2.FunctionComponent; // @public export type LineSeriesSpec = BasicSeriesSpec & HistogramConfig & { @@ -1410,6 +1415,11 @@ export interface OrderBy { direction?: Direction; } +// Warning: (ae-missing-release-tag) "OrdinalDomain" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type OrdinalDomain = (number | string)[]; + // Warning: (ae-missing-release-tag) "PARENT_KEY" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1428,7 +1438,7 @@ export type PartialTheme = RecursivePartial; // Warning: (ae-missing-release-tag) "Partition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const Partition: React.FunctionComponent; +export const Partition: React_2.FunctionComponent; // Warning: (ae-forgotten-export) The symbol "StaticConfig" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "Config" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1520,7 +1530,9 @@ export type Placement = $Values; // Warning: (ae-missing-release-tag) "PointerEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type PointerEvent = PointerOverEvent | PointerOutEvent; +type PointerEvent_2 = PointerOverEvent | PointerOutEvent; + +export { PointerEvent_2 as PointerEvent } // Warning: (ae-missing-release-tag) "PointerEventType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1558,7 +1570,7 @@ export interface PointerOverEvent extends BasePointerEvent { // Warning: (ae-missing-release-tag) "PointerUpdateListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type PointerUpdateListener = (event: PointerEvent) => void; +export type PointerUpdateListener = (event: PointerEvent_2) => void; // Warning: (ae-missing-release-tag) "PointShape" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1640,7 +1652,7 @@ export type RawTextGetter = (node: ShapeTreeNode) => string; // Warning: (ae-missing-release-tag) "RectAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const RectAnnotation: React.FunctionComponent & Partial>>; +export const RectAnnotation: React_2.FunctionComponent & Partial>>; // Warning: (ae-missing-release-tag) "RectAnnotationDatum" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1724,7 +1736,9 @@ export interface ScalesConfig { histogramPadding: number; } -// @public +// Warning: (ae-missing-release-tag) "ScaleType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) export const ScaleType: Readonly<{ Linear: "linear"; Ordinal: "ordinal"; @@ -1736,7 +1750,7 @@ export const ScaleType: Readonly<{ Threshold: "threshold"; }>; -// @public (undocumented) +// @public export type ScaleType = $Values; // Warning: (ae-missing-release-tag) "SectorGeomSpecY" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1847,6 +1861,8 @@ export interface SeriesSpec extends Spec { // @public (undocumented) export type SeriesSpecs = Array; +// Warning: (ae-missing-release-tag) "SeriesTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// // @public (undocumented) export const SeriesTypes: Readonly<{ Area: "area"; @@ -1855,13 +1871,13 @@ export const SeriesTypes: Readonly<{ Bubble: "bubble"; }>; -// @public (undocumented) +// @public export type SeriesTypes = $Values; // Warning: (ae-missing-release-tag) "Settings" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const Settings: React.FunctionComponent; +export const Settings: React_2.FunctionComponent; // @public export interface SettingsSpec extends Spec { @@ -1923,10 +1939,13 @@ export interface SettingsSpec extends Spec { showLegendExtra: boolean; theme?: PartialTheme | PartialTheme[]; tooltip: TooltipSettings; - // Warning: (ae-forgotten-export) The symbol "Domain" needs to be exported by the entry point index.d.ts - // // (undocumented) - xDomain?: Domain | DomainRange; + xDomain?: ContinuousDomain | OrdinalDomain | DomainRange; + xLogBase: LogBase; + xLogMinLimit?: number; + // Warning: (ae-forgotten-export) The symbol "LogBase" needs to be exported by the entry point index.d.ts + yLogBase: LogBase; + yLogMinLimit?: number; } // Warning: (ae-missing-release-tag) "SettingsSpecProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1980,7 +1999,7 @@ export interface SimplePadding { } // @alpha (undocumented) -export const SmallMultiples: React.FunctionComponent; +export const SmallMultiples: React_2.FunctionComponent; // @alpha (undocumented) export type SmallMultiplesProps = Partial>; diff --git a/package.json b/package.json index 906e7427de..74c8dbd620 100644 --- a/package.json +++ b/package.json @@ -87,8 +87,8 @@ "@elastic/eui": "^27.0.0", "@elastic/github-checks-reporter": "^0.0.20-b3", "@mdx-js/loader": "^1.6.6", - "@microsoft/api-documenter": "^7.7.20", - "@microsoft/api-extractor": "^7.7.9", + "@microsoft/api-documenter": "^7.12.7", + "@microsoft/api-extractor": "^7.13.1", "@semantic-release/changelog": "^5.0.1", "@semantic-release/commit-analyzer": "^8.0.1", "@semantic-release/git": "^9.0.0", diff --git a/src/index.ts b/src/index.ts index 62d049c7b5..4e4ebdffb3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,7 @@ export { SpecId, GroupId, AxisId, AnnotationId } from './utils/ids'; export * from './specs'; export { DebugState } from './state/types'; export { CurveType } from './utils/curves'; +export { ContinuousDomain, OrdinalDomain } from './utils/domain'; export { SimplePadding } from './utils/dimensions'; export { timeFormatter, niceTimeFormatter, niceTimeFormatByDay } from './utils/data/formatters'; export { SeriesIdentifier } from './common/series_id'; diff --git a/yarn.lock b/yarn.lock index 82e64fcc27..85db2c216f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4151,59 +4151,48 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.6.tgz#9c70eb7e7e4abc1083c8edf7151d35a19e442c00" integrity sha512-PKTHVgMHnK5p+kcMWWNnZuoR7O19VmHiOujmVcyN50hya7qIdDb5vvsYC+dwLxApEXiABhLozq0dlIwFeS3yjg== -"@microsoft/api-documenter@^7.7.20": - version "7.7.20" - resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.7.20.tgz#034fe4df720d62ebcc6af311168fdb0faf89da9c" - integrity sha512-B2gOOoYJDOqAn9iPg4Z9ay03MYtjmY2ldF3u1povTkzl5eJWERMDuuK5BLOdGdDTMr6TUd/FrhERFEeJNeQ3rg== - dependencies: - "@microsoft/api-extractor-model" "7.7.11" - "@microsoft/tsdoc" "0.12.19" - "@rushstack/node-core-library" "3.19.7" - "@rushstack/ts-command-line" "4.3.14" +"@microsoft/api-documenter@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.12.7.tgz#7b1742999bc083a237f78e658b3351e92012b3f7" + integrity sha512-GD3Z52yzDz8ZN3efB0mL2ogXLoL/I/cpoZmwLm8KiXL6o5g9K25fQ7HrFt4fvk9XTvcYX/EvZw4TBjrWz7cj5A== + dependencies: + "@microsoft/api-extractor-model" "7.12.2" + "@microsoft/tsdoc" "0.12.24" + "@rushstack/node-core-library" "3.36.0" + "@rushstack/ts-command-line" "4.7.8" colors "~1.2.1" js-yaml "~3.13.1" - resolve "1.8.1" - -"@microsoft/api-extractor-model@7.7.11": - version "7.7.11" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.7.11.tgz#9dfc5425f4a6a2b6b1ebc39332ae8101ab8da36a" - integrity sha512-Kf3RytYDq7sP4ASaaA9IcvaOPbVj1Xj34E2Wxd9DznI7sG4HzcpoOGmxaZHCzyYVh7wfAaAlvcXf3SV+djhNZw== - dependencies: - "@microsoft/tsdoc" "0.12.19" - "@rushstack/node-core-library" "3.19.7" - -"@microsoft/api-extractor-model@7.7.8": - version "7.7.8" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.7.8.tgz#fe2bb3a9ec90c1181ad0447fcf5ed912c54a7f5c" - integrity sha512-OWiIC3+Rnv6WzmwuOZkbpHGw9kSKTlzFZBrBwDVEkXp0SP1LsWOy7BALIR1RdTmaM9tRMzKZsjRWz4MWqXJdCQ== - dependencies: - "@microsoft/tsdoc" "0.12.14" - "@rushstack/node-core-library" "3.19.4" - -"@microsoft/api-extractor@^7.7.9": - version "7.7.9" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.7.9.tgz#c8a37a053af01cea66f1950f79a3d0df5558477b" - integrity sha512-sXobUDKsKx2apisLFhk5gxBPBfnCbM31hpmQwqHAbwZ7ak4Sj7I+OcN41hSwbIQksZnk2OSbu+WElEehHiS+xA== - dependencies: - "@microsoft/api-extractor-model" "7.7.8" - "@microsoft/tsdoc" "0.12.14" - "@rushstack/node-core-library" "3.19.4" - "@rushstack/ts-command-line" "4.3.11" + resolve "~1.17.0" + +"@microsoft/api-extractor-model@7.12.2": + version "7.12.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.12.2.tgz#d48b35e8ed20643b1c19d7a4f80c90c42dc7d1d8" + integrity sha512-EU+U09Mj65zUH0qwPF4PFJiL6Y+PQQE/RRGEHEDGJJzab/mRQDpKOyrzSdb00xvcd/URehIHJqC55cY2Y4jGOA== + dependencies: + "@microsoft/tsdoc" "0.12.24" + "@rushstack/node-core-library" "3.36.0" + +"@microsoft/api-extractor@^7.13.1": + version "7.13.1" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.13.1.tgz#0ed26ac18ccda075553e9fbe26dce4104d8d042f" + integrity sha512-mnWb5Vuyn/JnjC359HfsRmLDM4/vzyKcJuxQr5Cg/apbkMHuTB1hQrqA8zBda4N+MJZ5ET2BPsrKaUX1qhz8jw== + dependencies: + "@microsoft/api-extractor-model" "7.12.2" + "@microsoft/tsdoc" "0.12.24" + "@rushstack/node-core-library" "3.36.0" + "@rushstack/rig-package" "0.2.9" + "@rushstack/ts-command-line" "4.7.8" colors "~1.2.1" lodash "~4.17.15" - resolve "1.8.1" + resolve "~1.17.0" + semver "~7.3.0" source-map "~0.6.1" - typescript "~3.7.2" - -"@microsoft/tsdoc@0.12.14": - version "0.12.14" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.14.tgz#0e0810a0a174e50e22dfe8edb30599840712f22d" - integrity sha512-518yewjSga1jLdiLrcmpMFlaba5P+50b0TWNFUpC+SL9Yzf0kMi57qw+bMl+rQ08cGqH1vLx4eg9YFUbZXgZ0Q== + typescript "~4.1.3" -"@microsoft/tsdoc@0.12.19": - version "0.12.19" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.19.tgz#2173ccb92469aaf62031fa9499d21b16d07f9b57" - integrity sha512-IpgPxHrNxZiMNUSXqR1l/gePKPkfAmIKoDRP9hp7OwjU29ZR8WCJsOJ8iBKgw0Qk+pFwR+8Y1cy8ImLY6e9m4A== +"@microsoft/tsdoc@0.12.24": + version "0.12.24" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.24.tgz#30728e34ebc90351dd3aff4e18d038eed2c3e098" + integrity sha512-Mfmij13RUTmHEMi9vRUhMXD7rnGR2VvxeNYtaGtaJ4redwwjT4UXYJ+nzmVJF7hhd4pn/Fx5sncDKxMVFJSWPg== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -4489,49 +4478,39 @@ prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" -"@rushstack/node-core-library@3.19.4": - version "3.19.4" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.19.4.tgz#1ad4d18f00a746beaa2e3403cf805a9518d54149" - integrity sha512-xH/eXMZycx9t69lHXZifnzuXADOqLp23lOkP6K4avgvdPoZcVIQHeL80/jdzARp5cm+HaHsNxNycqkvH7b7mxQ== +"@rushstack/node-core-library@3.36.0": + version "3.36.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.36.0.tgz#95dace39d763c8695d6607c421f95c6ac65b0ed4" + integrity sha512-bID2vzXpg8zweXdXgQkKToEdZwVrVCN9vE9viTRk58gqzYaTlz4fMId6V3ZfpXN6H0d319uGi2KDlm+lUEeqCg== dependencies: "@types/node" "10.17.13" colors "~1.2.1" fs-extra "~7.0.1" + import-lazy "~4.0.0" jju "~1.4.0" - semver "~5.3.0" + resolve "~1.17.0" + semver "~7.3.0" timsort "~0.3.0" z-schema "~3.18.3" -"@rushstack/node-core-library@3.19.7": - version "3.19.7" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.19.7.tgz#8d8a193fd6f99536c92dd797ab50fd5fcb7630ea" - integrity sha512-gKE/OXH5GAj8yJ1kEyRW68UekJernilZ3QTRgmQ0MUHBCQmtZ9Q6T5PQ1sVbcL4teH8BMdpZeFy1DKnHs8h3PA== +"@rushstack/rig-package@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.2.9.tgz#57ef94e7f7703b18e275b603d3f59a1a16580716" + integrity sha512-4tqsZ/m+BjeNAGeAJYzPF53CT96TsAYeZ3Pq3T4tb1pGGM3d3TWfkmALZdKNhpRlAeShKUrb/o/f/0sAuK/1VQ== dependencies: "@types/node" "10.17.13" - colors "~1.2.1" - fs-extra "~7.0.1" - jju "~1.4.0" - semver "~5.3.0" - timsort "~0.3.0" - z-schema "~3.18.3" - -"@rushstack/ts-command-line@4.3.11": - version "4.3.11" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.3.11.tgz#79e4ee20c42ad849e0d257790bcb3f2865c7f15a" - integrity sha512-Jzu52EzzHmIuc4dCrK+jLKwFCrrCtVBPCxeMFtHlODXkZ61IlVW+a+rRATkNNlSykv3G0dmedOFxQsVpVgoUpA== - dependencies: - "@types/argparse" "1.0.33" - argparse "~1.0.9" - colors "~1.2.1" + resolve "~1.17.0" + strip-json-comments "~3.1.1" -"@rushstack/ts-command-line@4.3.14": - version "4.3.14" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.3.14.tgz#5d7a437d4e9c564ff1b8e876215fca96c74858a1" - integrity sha512-YJZIyKvkm3f6ZdKSfMntHS9542Y2mmMWzaiPPoXxLFZntKxEIDE3WfUNlvOSo3yK4fNd09Tz3hfvTivQNHSiKQ== +"@rushstack/ts-command-line@4.7.8": + version "4.7.8" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.7.8.tgz#3aa77cf544c571be3206fc2bcba20c7a096ed254" + integrity sha512-8ghIWhkph7NnLCMDJtthpsb7TMOsVGXVDvmxjE/CeklTqjbbUFBjGXizJfpbEkRQTELuZQ2+vGn7sGwIWKN2uA== dependencies: - "@types/argparse" "1.0.33" + "@types/argparse" "1.0.38" argparse "~1.0.9" colors "~1.2.1" + string-argv "~0.3.1" "@semantic-release/changelog@^5.0.1": version "5.0.1" @@ -5593,10 +5572,10 @@ multimatch "^4.0.0" typescript "~3.9.7" -"@types/argparse@1.0.33": - version "1.0.33" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.33.tgz#2728669427cdd74a99e53c9f457ca2866a37c52d" - integrity sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ== +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== "@types/babel__core@^7.0.0": version "7.1.12" @@ -13399,6 +13378,11 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -18142,7 +18126,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -20311,13 +20295,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - resolve@^1.1.6, resolve@^1.10.0, resolve@^1.18.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -20333,7 +20310,7 @@ resolve@^1.11.0, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" -resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0: +resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -20745,7 +20722,7 @@ semver@7.3.2, semver@^7.2.1: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@7.x, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4: +semver@7.x, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@~7.3.0: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -21483,7 +21460,7 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= -string-argv@0.3.1: +string-argv@0.3.1, string-argv@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== @@ -21755,7 +21732,7 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== -strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -22541,16 +22518,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.3: +typescript@^4.1.3, typescript@~4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== -typescript@~3.7.2: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== - typescript@~3.9.7: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" From ada219d4745545e8f8f94433ae118b1f560453f4 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Mon, 8 Feb 2021 14:13:10 -0600 Subject: [PATCH 08/12] fix: export LogBase type from top --- api/charts.api.md | 14 +++++++++++++- src/index.ts | 2 +- src/scales/index.ts | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index 16ae60a637..2d4793daf8 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -1345,6 +1345,19 @@ export interface LineStyle { visible: boolean; } +// Warning: (ae-missing-release-tag) "LogBase" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "LogBase" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const LogBase: Readonly<{ + Common: "common"; + Binary: "binary"; + Natural: "natural"; +}>; + +// @public +export type LogBase = $Values; + // @public (undocumented) export type LowerBoundedDomain = DomainBase & LowerBound; @@ -1943,7 +1956,6 @@ export interface SettingsSpec extends Spec { xDomain?: ContinuousDomain | OrdinalDomain | DomainRange; xLogBase: LogBase; xLogMinLimit?: number; - // Warning: (ae-forgotten-export) The symbol "LogBase" needs to be exported by the entry point index.d.ts yLogBase: LogBase; yLogMinLimit?: number; } diff --git a/src/index.ts b/src/index.ts index 4e4ebdffb3..fcf1ad6eb9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,7 +55,7 @@ export { CustomTooltip, TooltipInfo } from './components/tooltip/types'; // scales export { ScaleType } from './scales/constants'; -export { ScaleContinuousType, ScaleOrdinalType, ScaleBandType } from './scales'; +export { ScaleContinuousType, ScaleOrdinalType, ScaleBandType, LogBase } from './scales'; // theme export * from './utils/themes/theme'; diff --git a/src/scales/index.ts b/src/scales/index.ts index 8664e12064..04d04d47e4 100644 --- a/src/scales/index.ts +++ b/src/scales/index.ts @@ -76,3 +76,5 @@ export { ScaleBand } from './scale_band'; /** @internal */ export { ScaleContinuous } from './scale_continuous'; + +export { LogBase } from './scale_continuous'; From c8066f51de3fe334fe9d6de425729813ae7ca9d6 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Tue, 9 Feb 2021 17:41:26 -0600 Subject: [PATCH 09/12] test: add tests for log changes - test all limitLogScaleDomain variations - prevent negative domain padding --- src/chart_types/xy_chart/utils/specs.ts | 2 +- src/scales/scale_continuous.test.ts | 46 ++++++++++++++++++++++++- src/scales/scale_continuous.ts | 11 ++---- src/utils/common.ts | 6 ++-- src/utils/domain.test.ts | 13 +++++++ src/utils/domain.ts | 8 ++--- stories/scales/7_log_scale_options.tsx | 9 ++++- 7 files changed, 75 insertions(+), 20 deletions(-) diff --git a/src/chart_types/xy_chart/utils/specs.ts b/src/chart_types/xy_chart/utils/specs.ts index 35d9070658..ff9c19cab1 100644 --- a/src/chart_types/xy_chart/utils/specs.ts +++ b/src/chart_types/xy_chart/utils/specs.ts @@ -282,7 +282,7 @@ export interface YDomainBase { */ fit?: boolean; /** - * Padding for computed domain. Pixel number or percent string. + * Padding for computed domain. Positive pixel number or percent string. * * Setting `max` or `min` will override this functionality. */ diff --git a/src/scales/scale_continuous.test.ts b/src/scales/scale_continuous.test.ts index 7d5bf0430c..84345fe663 100644 --- a/src/scales/scale_continuous.test.ts +++ b/src/scales/scale_continuous.test.ts @@ -23,7 +23,8 @@ import { ScaleContinuous, ScaleBand } from '.'; import { XDomain } from '../chart_types/xy_chart/domains/types'; import { computeXScale } from '../chart_types/xy_chart/utils/scales'; import { ContinuousDomain, Range } from '../utils/domain'; -import { ScaleType } from './constants'; +import { LOG_MIN_ABS_DOMAIN, ScaleType } from './constants'; +import { limitLogScaleDomain } from './scale_continuous'; import { isLogarithmicScale } from './types'; describe('Scale Continuous', () => { @@ -476,4 +477,47 @@ describe('Scale Continuous', () => { expect(() => scale.scaleOrThrow()).toThrow(); }); }); + + describe('#limitLogScaleDomain', () => { + const LIMIT = 2; + const ZERO_LIMIT = 0; + + test.each` + domain | logMinLimit | expectedDomain + ${[0, 10]} | ${undefined} | ${[LOG_MIN_ABS_DOMAIN, 10]} + ${[0, 10]} | ${ZERO_LIMIT} | ${[LOG_MIN_ABS_DOMAIN, 10]} + ${[0, -10]} | ${undefined} | ${[-LOG_MIN_ABS_DOMAIN, -10]} + ${[0, -10]} | ${ZERO_LIMIT} | ${[-LOG_MIN_ABS_DOMAIN, -10]} + ${[0, 10]} | ${LIMIT} | ${[LIMIT, 10]} + ${[0, -10]} | ${LIMIT} | ${[-LIMIT, -10]} + ${[10, 0]} | ${undefined} | ${[10, LOG_MIN_ABS_DOMAIN]} + ${[10, 0]} | ${ZERO_LIMIT} | ${[10, LOG_MIN_ABS_DOMAIN]} + ${[-10, 0]} | ${undefined} | ${[-10, -LOG_MIN_ABS_DOMAIN]} + ${[-10, 0]} | ${ZERO_LIMIT} | ${[-10, -LOG_MIN_ABS_DOMAIN]} + ${[10, 0]} | ${LIMIT} | ${[10, LIMIT]} + ${[-10, 0]} | ${LIMIT} | ${[-10, -LIMIT]} + ${[0, 0]} | ${undefined} | ${[LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]} + ${[0, 0]} | ${ZERO_LIMIT} | ${[LOG_MIN_ABS_DOMAIN, LOG_MIN_ABS_DOMAIN]} + ${[0, 0]} | ${LIMIT} | ${[LIMIT, LIMIT]} + ${[-10, 10]} | ${undefined} | ${[1, 10]} + ${[-10, 10]} | ${ZERO_LIMIT} | ${[1, 10]} + ${[-10, 10]} | ${LIMIT} | ${[LIMIT, 10]} + ${[10, -10]} | ${undefined} | ${[10, 1]} + ${[10, -10]} | ${ZERO_LIMIT} | ${[10, 1]} + ${[10, -10]} | ${LIMIT} | ${[10, LIMIT]} + ${[10, 100]} | ${undefined} | ${[10, 100]} + ${[10, 100]} | ${ZERO_LIMIT} | ${[10, 100]} + ${[10, 100]} | ${LIMIT} | ${[10, 100]} + ${[LIMIT + 1, 100]} | ${LIMIT} | ${[LIMIT + 1, 100]} + ${[0.1, 100]} | ${LIMIT} | ${[LIMIT, 100]} + ${[0.1, 0.12]} | ${LIMIT} | ${[LIMIT, LIMIT]} + ${[-100, -0.1]} | ${LIMIT} | ${[-100, -LIMIT]} + ${[-0.12, -0.1]} | ${LIMIT} | ${[-LIMIT, -LIMIT]} + `( + 'should limit $domain with limit of $logMinLimit to $expectedDomain', + ({ domain, logMinLimit, expectedDomain }) => { + expect(limitLogScaleDomain(domain, logMinLimit)).toEqual(expectedDomain); + }, + ); + }); }); diff --git a/src/scales/scale_continuous.ts b/src/scales/scale_continuous.ts index cb273f7100..6b85c9596a 100644 --- a/src/scales/scale_continuous.ts +++ b/src/scales/scale_continuous.ts @@ -68,20 +68,14 @@ export function limitLogScaleDomain([min, max]: [min: number, max: number], logM if (max > absLimit) { return [absLimit, max]; } - if (max < absLimit) { - return [-absLimit, max]; - } return [absLimit, absLimit]; } if (max < 0 && max > -absLimit) { - if (min > -absLimit) { - return [min, absLimit]; - } if (min < -absLimit) { return [min, -absLimit]; } - return [absLimit, absLimit]; + return [-absLimit, -absLimit]; } } @@ -141,7 +135,8 @@ export const LogBase = Object.freeze({ */ export type LogBase = $Values; -const logBaseMap: Record = { +/** @internal */ +export const logBaseMap: Record = { [LogBase.Common]: 10, [LogBase.Binary]: 2, [LogBase.Natural]: Math.E, diff --git a/src/utils/common.ts b/src/utils/common.ts index 121a26562b..8bd9002764 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -526,18 +526,18 @@ export const round = (value: number, fractionDigits = 0): number => { */ export const getPercentageValue = (ratio: string | number, relativeValue: number, defaultValue: T): number | T => { if (typeof ratio === 'number') { - return ratio; + return Math.abs(ratio); } const ratioStr = ratio.trim(); if (/\d+%$/.test(ratioStr)) { - const percentage = Number.parseInt(ratioStr.slice(0, -1), 10); + const percentage = Math.abs(Number.parseInt(ratioStr.slice(0, -1), 10)); return relativeValue * (percentage / 100); } const num = Number.parseFloat(ratioStr); - return num && !isNaN(num) ? num : defaultValue; + return num && !isNaN(num) ? Math.abs(num) : defaultValue; }; /** diff --git a/src/utils/domain.test.ts b/src/utils/domain.test.ts index 27e8600102..5171e15b31 100644 --- a/src/utils/domain.test.ts +++ b/src/utils/domain.test.ts @@ -120,6 +120,15 @@ describe('utils/domain', () => { expect(computeDomainExtent([5, 10], false, { fit: true })).toEqual([5, 10]); }); + // Note: padded domains are possible with log scale but not very practical + it('should not effect positive domain if log scale with padding', () => { + expect(computeDomainExtent([0.001, 10], false, { padding: 5 })).toEqual([0, 15]); + }); + + it('should not effect negative domain if log scale with padding', () => { + expect(computeDomainExtent([-10, -0.001], false, { padding: 5 })).toEqual([-15, 0]); + }); + describe('domain.fit is true', () => { it('should find domain when start & end are positive', () => { expect(computeDomainExtent([5, 10], false, { fit: true })).toEqual([5, 10]); @@ -159,6 +168,10 @@ describe('utils/domain', () => { it('should get domain from negative domain', () => { expect(computeDomainExtent([-70, -10], false, { fit: true, padding: 5 })).toEqual([-75, -5]); }); + + it('should use absolute padding value', () => { + expect(computeDomainExtent([10, 70], false, { fit: true, padding: -5 })).toEqual([5, 75]); + }); }); describe('padding caused domain to cross zero baseline', () => { diff --git a/src/utils/domain.ts b/src/utils/domain.ts index 9a38329b94..6cfcd1c6d3 100644 --- a/src/utils/domain.ts +++ b/src/utils/domain.ts @@ -51,12 +51,8 @@ function getPaddedRange(start: number, end: number, domainOptions?: YDomainRange let computedPadding = 0; - if (typeof domainOptions.padding === 'string') { - const delta = Math.abs(end - start); - computedPadding = getPercentageValue(domainOptions.padding, delta, 0); - } else { - computedPadding = domainOptions.padding; - } + const delta = Math.abs(end - start); + computedPadding = getPercentageValue(domainOptions.padding, delta, 0); if (computedPadding === 0) { return [start, end]; diff --git a/stories/scales/7_log_scale_options.tsx b/stories/scales/7_log_scale_options.tsx index 92fc0980fd..204c11d714 100644 --- a/stories/scales/7_log_scale_options.tsx +++ b/stories/scales/7_log_scale_options.tsx @@ -32,6 +32,7 @@ type LogKnobs = Pick @@ -69,6 +70,7 @@ const getLogKnobs = (): LogKnobs => { xLogMinLimit: xUseDefaultLimit ? undefined : xLimit, yLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: yGroup }), xLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: xGroup }), + yPadding: number('Padding', 0, { min: 0 }, yGroup), }; }; @@ -126,7 +128,12 @@ export const Example = () => { return ( - + Date: Wed, 10 Feb 2021 10:40:17 -0600 Subject: [PATCH 10/12] test: update vrt screenshot --- ...le-options-visually-looks-correct-1-snap.png | Bin 0 -> 23195 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-scales-log-scale-options-visually-looks-correct-1-snap.png diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-scales-log-scale-options-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-scales-log-scale-options-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..222617d063e53dfd00ff91932468dd359365ea5c GIT binary patch literal 23195 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 DJ-K8< literal 0 HcmV?d00001 From a26fd2c6068367d03802533cd2277e40df79bcca Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Tue, 16 Feb 2021 12:54:12 -0600 Subject: [PATCH 11/12] fix: x domain scale issue, refactor log options - move all log options together - fix x domain being different across other xScale getters - update log option wording --- ...-options-visually-looks-correct-1-snap.png | Bin 23195 -> 21041 bytes ...should-render-proper-tick-count-1-snap.png | Bin 23195 -> 21041 bytes ...should-render-proper-tick-count-2-snap.png | Bin 15720 -> 13415 bytes ...should-render-proper-tick-count-3-snap.png | Bin 15761 -> 13461 bytes src/chart_types/xy_chart/state/utils/utils.ts | 12 +++- src/chart_types/xy_chart/utils/axis_utils.ts | 6 +- .../__snapshots__/chart.test.tsx.snap | 2 +- src/specs/constants.ts | 3 - src/specs/settings.tsx | 63 ++++++++++-------- stories/area/17_negative.tsx | 2 +- stories/area/18_negative_positive.tsx | 2 +- stories/scales/7_log_scale_options.tsx | 37 ++++++---- stories/utils/knobs.ts | 4 +- 13 files changed, 79 insertions(+), 52 deletions(-) diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-scales-log-scale-options-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-scales-log-scale-options-visually-looks-correct-1-snap.png index 222617d063e53dfd00ff91932468dd359365ea5c..b53713482d2b76a004ba5087466eb8343a76458e 100644 GIT binary patch delta 4231 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 delta 6402 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 delta 6402 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 literal 15720 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

BuB=MPiFC84 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 njZXGK6j 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 B-Z=mO literal 15761 zcmbVzcRbbo`#&vO8j{eVLRLr!$0{>NR`xt3*?Z-fl{-Z!I~m2X$03`HQYo^>kzF#5 znQX%EdY``c{r%qe=kxhK9^cvYiiZy{9-yG0IIMI{?gjMi^-1n)Kt0=b~*0r8+s8 zan$$X3LMQ2ic`Lgq1dlz&)X>F))*c~aB?3MhC|3}N$1i@p> z;SH>?ABwPJ)@bB6U{Rxk5`KeT;&;OjjjR$C{G5IeK?6UchuBf@<8%sxygPC+$_;+% z%sAl?6an>eh64D~Qk{b*FQ{8sqD5ef>;DIEo~~3<7*9(VV@$pQNE50H5T{j9u;?Y_u$~*S7T!E9z{k09^dfc1Gl84 zaeKQxOB^9Lx9hdn;&+#duC6Y81B<_rwzf9Cq{HZkP}~M7W4TLHjZ{K3iEJ8+U{gtw z(AP}A-u|^dDDUCGRHCo=QcDdgrezNW#g(;eQSDUvQhW9HS&Ye+dM=g9-uU!%Zb3oK z`P!YD_~*}sJ!bUM@c4w)xcGQRUTlrg>VRu_N@{9}Rr|R-y+Rq|O1Jiv*?#w#UV%Zk zPL&vo4TS}4bk|v(W5H#Yscu0rfBwcJSjps#~sn2Mrh+F+(5v$K}0tV$yU*(5cM4et-b{xu`nzB*4AuD@7j755G zagm*kt$2M{H|Vjtie~DZai#iB<@fnM_v{C$lQ7kfrc~N=tMMTJ_JjRB)BP;fd5Y(a zCOQ+STgPZb$|Cz`dlJN4y9Nd>#5Sdsmx~U%6OE?;KGWtpc?M~`hNY8+!y7RJ4rNJR z;|zm7i_MHeR&8EI$S#gZtzCg50dP8&NS(q?BUk)cOGyN}v7dJ&8nIi2rM{!g@`_H= zcaQ_6J8fmy*jZ}~2dY+iOaMfyu zq`5I3;Q%Pu;~XA%7~`=92_wLu{YNT=ujk)#R#SPkh)eP@pprScBY@0g0w@jSl`F zBXK!G{+*aa8;47%y~y&WD^qFl(UMBe8a;!92@!t#6IPH>E4_ZN43f2GiJlL_O5OO_ zw~jl^iCoJtZr)gHlj_ufkt3#i)82Cz{}76WP1$ocHfu^Lb^<2b9uPeodY0?Sy;^VYO@rB>yG}|>@15kVF7uBi z3(JWjXa12NSJaXR=jTtFR~hJ^!g&I#Kp)$_N7XR)r9IDUl~r;K;zOaQhF^V{E-Xoo zLj*-3%V=m6U*u46JG`oAWg-P%);ajheCg_#!)(5!85*&>hp69K^I2+iRIA4cs_eBe zl7oL9b&!(uxuVE4EiB2)dZtxTY4z>9B;Tm`Hhupu)y?G7>`}j}UwFWEm+J}R6uft6 z$Tg7C+a|%WoaMCQL(B6~rwS(UcyF%rmu}Ra@(g7*sCY*n)|Ap>j4M(@;dg!EZk7G=cre7%tqEbn%whkeLbykQQMdRAi0x zw$gIpuYP47Nfu7Q-K^BfeM!&D{* zyDUaw8?E_a-j^vq-SUP8id3XOGdf<_%|57xWx9CX+g8n{yHGYg72c@ZRn!o zp-ur#l8%?vOgGMD^g#Dzk!R#vVfp2iF^MzEji?g+ijZeF;pF7iG0XoFBHt>nRCcQD7FcL%KL4Q- z`TMkyLZ#lpB+fie(#dJmu#zCv?Ws>HJSvKCKUc)R$DYjjcvZ2T9aG6W#}u8qlh=!9 zJ)A*)T4ynUU3ohG{kkw}^jwtN^AqFOH7UtJ6YY60#mY?(%XXw`yo4G<9$ue~Os9FO zfva`-4bbvE97*FYC)o!T$N(C-&hIe%Vj#&^IM-IBQ-kkOghMKVO)CA-rRkEU-|I;y zSX;N7+e)|dH(+hinCG0N%T*k%xhLm_v#Q-W$nON;@4dQ7H!iwJR!GV^^3AoVdgbdGs0!`O+jaGa8oXsMRXJH+D@Xp4>S=N%DAJ5v0 zIe$h_6;N!WAB)$Z{kpIiMBMOz>wPsf=0*T3SZN7kHqZuDRXTyWCQW06&xFB>K%u_ z4Iz=n${ovL8h28ghHl1^AnH9wl-vD%9Otbu$wFJs(`d5UlEGYLk&opheb}-Cl-`tm zHf7ZOd#=DB;)PEC$Bh~?2uh_=@!}NZedw7tWHIuJmFs#QZn}(m&mZMRRi3tEnrMek zwb0%q-y5~fn>%Vt$}jQaavBavKgHr9BpNB&=`WGr4FJtY0O|+x$tAC;R@$4UC-oI~ zkj3-j#0-5%Qb@$ynH>RcMSjQO%+%0j@^1D-?-(sSWqvNIeJuUHUSP!B#os_n4DD7d zF5JkRJC$I84z}PV(Fo?L#iy{Qf|27RAMl=xpY7H2=(40YUzvscSVK*+iDwlC$el$X&|7yC>qSC(Q&_#z@gf`n@1|5 z!R;t4Na5`x`>aOz79RKE!}GA?M`3vVAlT(A~iTaVsXKm|s`iFN(n(T=)eFyYH&PdgGzrE{T&l{R1VmRul-Q$eFcb`PR00j6bu&dXXXJ<^An&CtQlQAG{2P)lDwYhkou zy2sG5 za+HbptZ;=9pHfFhnsRh}eD+Xv{c8HktZ1N;)UW3b~bMGxf`Dfozq#xRO>L6Y{vdu%kk3wH9&iWeK(duYHDqXeBE7Llj{@7 zv24O3BDOz9-c*v(pSv{+6Yp&KK=`cdbKTW-(PC%s89m9@xU3$(S-$u34OZ$C`P@c3 zStbcTEjkN9+v57wedWYewWnv9EHM$xhE+!XeH!^yf(@rs$1hOYXTVH0Ha0hul|zj9 zV$p7sPD87b%;67cP}vNExAlJd%vPN5xi@_q#U-=~W+ZS=Yeg--#0Yc6@y*%?CdbJK zOb%^v0_Md|U*Cq*NCO$LA9}6d-Q695fAC-*O4@H=VnX@aweoNN^xH3va{CD{pjG^L zc9sTWgmF$|H|ZWH-9oM*K!JT#tE^Yl*S?)8z8aUM!;;q_LS^|ZY)mxfw327lV7#DZ z7*NGAmkKQtll-c=O66+YvW@TOZ0(#AbaZJmGjS zoPaEU?XOpGFUVV@&Ws$xG6$V^hj;|3ZrSL?IvBVXV`y;u2 zP@k8%jQO-{^v!eYlSv2lU6PkfPX@0l)kYQXRkNK(NeiLCPzP2FJ8)`h-NO4x+`I=G z^dX$rEQM1S*w- z$~hjv;7)zD0ZgPuO-`&4;8EqU9!ANPA07X)x;72Eqm zBbaad3CuCl2)u5k&6mXB$8 zjmU+5x2P8~N=Ia|s!i(d=J%zGt8R{zy!X9j*+&C-Db8AHG9*^hmbdk^gE`HEq3xZ?GOJBj;-eYD*Mc`R( zg?9FPa~JO{k=^Z;Cm;z8vlcMpGP~GOc?VoGvR?cSz=jNgU9J!lyTDorqS)EgJKAkr z2wLvpp`C`_Jmkpm>I3f-!;pxuMJL4Y|LAcw?3sGdMakG!kwfA4*o zj2Qki)Co2Y9i7j0rtS)WoQ~h%B$a;z0@=f%y;-t#s|0zc?rS+mr6fFHQ}u@EQ}@;P zHmUBacz4&@tLdqMr!iY(nt0>#JS#_h*zs4eP_E-4#{4{vFx$a}da@4> z8WE!3)aY=QCx=BX2Ic-4-%`!pjOVvu2SONhzST9zZA5pd@!J_XA{e>&*pP4EK6cdX zCGP>@_@X&Y;nH%lgdRwguF!5dz1ze7!R;c7{kuj-y92^ZuB`PLd&{tB&Gi6<1P6RD z%B{G6srV4e)~@YmeKfL*0E*F@?R6>mdY(TjIp6(4s59Xb+)@Q(253q<_sD^U9VIo2 zDCWy)f1b-+Ro?ue*QU(S7(LjhgJ z^@|fWah&^--q=|}mUM`dn%g2L>4%}2L(&1!*}W72PYR|c&(7wFXAuscx(ySj;_DrC zmoeIq!WbGdB-894w2JMCcOz(&$*_Af51EXq4S-!Q0y{HM5aoCB@;PU`Bm63U!>*31 zq*(=L(}|H39p~=UIDnpT2gFN%dM(I4ozRblWb4?1BN>H9i*UmGchW=sWoBK zL%(?#(jYrml!DSexJ{>>HLfC+Bt9q0dG_7=lonZ~ps@q4=~*vw-?<%v)CP^3gFzPI z2xER!ImB^JG#Ip<0EcDv9RKD=V2c8o+#~r@+3X0a4c_Em0Ka9I=73&b6(4ot3*Kdkou>1-+ ziBPWBmBmRa=$>&VP7$Z2+MmUoMC?wT^e^13%hnm&gi5zbEA)Xrn0giwIK@P-ruU6` z?YS<=XXYx3Z!FY1%&H7KA52~wwf4oW1t2#WSp5r_qjP-7s7A-Jqko8badVPEaDK~T z^>W&Iw;o7nTvvQUrw&hn5CX+!zyUu*)}=N?cz8k7q9WDTIf5Kh}UXpF1Onm=n zyDU%aWZ@&t>xy@Qs$Kl1$ogTLzp9K>M=~JqSbu<4@{UG_*&!t4G)>lSps{YvimbFB zx!9>OvKxbbT!CiSHWq(Jn&0F`l>E&16Hzgl7d_)ir+yq`M=8*at3vvXOo{@dq#cYi zvV1#)I0ZhromhJqL6dqs#e9h+)n(~Nyal2HM~?$XM5vzB~`9V zmtjL*V3IECWX?qh|L>#NQDN$F&ol1b-~*Ce$D*9GGOg9gFxcT=04D|!gxKnl}Tx)n=aZahRVvF9+~$-|OSZlbDWQi`aqhZkfp&~gga zHpu`|)3X@#X-hq#LnG;nBES7GfDY3A4ICj4&cg%J*99V}UAW2Z!{ANw17XWSmq9_F z+)9s!!muK!ePMY&z`(xW(DTOpTz?i2MR;%-c3W5zAtk51oS}{TPKKu_4Zy%2w!(X}wkl6La!v0y)KUt`&Mhc#V#)cUCRcdi?E8 zQfXB}k<*(FwCeJ<-!~`dG<@WQbFgC2_hcabG!`2Z7e+}Dpkb(bx-*zHXleE=tBT^? zW=<0I0TDb+RMTJzq%06z*To?!>>RJG_X5vq^|`sZ^8#{RfmwUS8-)R!kjM~1?WH{W zzwwLgY;InY*LuJN;xAbQrxi_4Pme9!iF)$Hlw{O9nx(?iJ>xMgtuRKuJJTyEDQP%3f2tHn-Ch6m}Z@19)BT%cQYj70AFVlpXmj zgxXKp^?&9QLUz3ud5tTzN=izm`pXEHE?wG1$3!Fa!c`ZQNzm4=x854g=dG;t^xul= z#8Ob4{SIpEJ3s2_ZeDxWpxiO&{L+YQ$lFl%34C(N&G!dTP-+bGGsMmDmbiSsG%PU4kMlCFs;4oOZzT`72 zhW1;TTpe5=<8=ni!P zgTy($qvAQ9KKJHW1eGczH{-(sDT`i4wfs<}VHTEP*z z9B^IKszb6nS8qaYtGb9F1D9lpK5#lPBJ7DEt8XSv4>5b@<5gsQdCIR2aIl4(d{>kd zuOaEi0Mj4iNwb(oY9qAr&c`rlnHvTfe3cc$XSRqj!ibe>ODAV@olc!|q4F~pTt+1iKtTGA2>7f9KahhjawFX&72bhjssz*OTwTDChvcLI^57C;pdzYKLoMI9EzFNqK! zJ!_3I2YCfKPJ&}4iIe&!{J;9E(x7m@x8oKtKmSsd@u0@#s}0 zs+Oli6(J7SQJE8^xnw!X9l$7S#UVltJc>a(-KF|qlr|hq==hW_h@A6Y-Ap$Nu)|Nm zp~06?d(Q?&&=~DPJb0gZ|EEy{6Zb2_3~0!G21422X}`!aQ>KD$$VrwyTkzm@Z+@aZ}pD5O>3)9X_u$MT(pG~U>_7CXOP+>{zbh)l-tOG-&HPoJViijuB4w{ zzuIXck?Js%j?O-Y{k|!w-ptW-dptB)+X>eju-mDSa~DvP;`)IBiRN#>lme^awu#+b zTT$)okdg=##h}}09toh9QjgItP4=lF`f;kG?OVryd$P?+xh-75DY$~!rLE5b8wD<9 z9^FY7VN<3Q85L)qaFPP(5fysd$q~e(J=pt#Kf@v}?A}F?{_Bf1ijK?kUGl&XyAh;O zG;{N|4;VRAJgkGB3KMQf@A^nRg0Uaw8+C1QxCfAOgPXf317lC1j%8uPYIUG=k1*=G z+YPNklk0iYT0kB_hJsOUbyS|WAGcMS2bE-vXCg9W0&8_0CYJg$Epp}K#*aD&c}^KG z-%b@c1i(eA5i^x9FsQjyOZOZ(XYY#_#d3du*k$1$EI7>(CD(?OaArLCw3VmfT_J&AsHPj{x*kDt@;gWRuPMu%0(~!kLjWwJD{l z>s?y)4$6ZFB@BE}wyKk9XqRw)6$3yt3yYx9Gc}#auat5R@T;}RLspY^YLXY-%Z@7e zc;7s~a3M_)HGyS^tU5>X`BftK44bkWWQsPc~QGXYPsvt0Ig^i5p zO^31cKzU*r>f5jpKDa(R7syNmhlKTbZ+apIuzU~rI8_CBpcNOHaqkl3ivl`d7uerF zpRv^4#y1F80YyZb-c047u#K|Z1)SY12cnSMFALwNL9NCXU-Euh+ zikVB(^{_)Q@>Yh-k41ySMnGnV?$~`hv1K=QyyT7q47hTQ#{io>e+ZQ~2N~#83KLlM zfz!MjMS<=Z$)LKz@;PKKpiWq43##x0QWNP=RV{%`1#(6Ku{WDWouJ#NCQXoB>$mp-1pgv zr9vp9g<_JjLDB6{h$7KQbBsaZP5HVcdTRX8LZXl>R3!(t0hPzD9K*@YjiKdGEoQwmate~L%NY5JR}tP;SLG{A z5;iQz3BQ9Brze1jPac5`Rq5Sl+~T+^o<~^B(Z@|03^6!pa=P7;kj0U7N2a2p0;2}~ zR|5TIj>MO;K}!R!tx6F{tZ!_b7ZnxK$~xVi8dUQ$ns6sEwWek}INaL7A*Nx}nrKd0 zWuGgSJ{o!$x0(Jd0ajlZy|n0HITS z5u_z`=jg9D>|#?A5D=h8;a48;vKw#A+-wCrOm$^x+DqMTjN)RH?5iw~s*M%7@)?C`nN+ zc^?xo)YkT*YzU`}wAl^$EUMTKlrN-I)g5BEB-a$nuM77MWuO{HR;8 ze?Q}^S{YBjr5L1lpnicB=R6e~?bJfz1IdA~Vzy1hnv#i&7qCC|*G+_kh1Y+1r$fh_ zv$J!|FA9ch9{CpjCapz2pDf3`+k1O6fxjiMyeur#SXfxNx_bY4qV1R8qlJZpIM1H_ z`uh0l$9G)u+uJ+V<1fDA+#7B;*G}#0-DeDDYC2D+jG#P-+p6j-k(6Zdtatz zhH75;r(~Wt`JzZ6nbG6!vjqXEf_8 z-8$n_wQ=n8I%)6rV!ihDeREe*Q&S`EJ|f}trQvgeSkW@kxXMHO>eV;wEU~e%8LuTA zqW2hCA=#y46lXXeW9G6nK1r%HP+Vv@i!_G*)e#Eb6#o48t)$lj8?snR_QUf)t}y&= z`2D~1n*M!eT4C>%nJ?+Gdph3Sr_weu%FQz@;}#ImNEG+Hj3P;Rj2GQ3EfdTgV!=*` zZTUJ9f`bo0k7;vZQFWr(^7b0KwT0MiBP=Y8cK#NK_MFSD_Fm1lCFY04&o`~;%tsOy zXZ-AEU4D#Qh0C-8;|(SWbN#womk+kI443SaXt`=@OCQ_B4kqf=t4qssgN9F^_Ao~- zd)Dyx8&<2;v=nWYNa_~bN1|-Hv$ZS7Vhq`o=BrnekWN_9_Vt<1mhbHxE%mCUYg$}4 zHvPmx==mMCmdBf)M?Zb~HS^0*O99RwR+*T#$$$o0W5`8eR8+cK62+rqV#YJqYwR4C zrPk4{bHpA#r1}fRL}B+St?Jbw?+v2=maby+s)cvX>L;R?M{TKx7u2S^%N(&Ni971z zo^xG^o-aBFkA6<&MkIsu*w!BhraXUg^P>J2^JPdbcff!h;6XSQx|IF zl^(O%ep?${e0(h$f9)J@SQT0VBymgX1_tq93C0w?w-W#7{dQz&avWxnGU~9TI*VJG z`I}67_#hb-{P?k!yL$FIv$9BQ38>;nxsrD{A$!C;_$FtRj&FBgA z_cQ3shXaCrjAw6oI`~g)zLKIsxw)Tf=L zEu{|wXE^?vc3a$I#_C^HZzu+Qi|yig^MnP9lutQ3OP%>&n)xpW{%c;{lOF6_Kfc!E zrt`{>nC{&>IWGz3M6^2w`X$<-6FC&S=jPu5;R$ucMLjnM@3uG*$0SQwk-4mYa6`DP zfA&kUb)@CcYp;Egz8_kAbUy#7VHvgaHAr6xO7cJ7>3AU-GHXV?iIIpe{rvg!V$I28 z$6n^$fk=ELQA71$=D_f zpFhp;zeT`l+qbo31n71+)^2&^=@%(jSXiLplFywx7Zn$m38x5U5d7dKVfc@QR56&~ zbk)S{CjfXS=L_jn~jEOCs5fwZ{KAV*9O8k2cv{Wle>t)DN*-(9K`AUTxoBy7%Izw14OqbYhGk#@2s12U}tydgo`VBT=;s|ilW9{%G!U#Ls)dHqqL`M=l{iQk%# z98zp|<4K%^m&@}EDI@o8ZQ$(!;(r%vSwjw?CVOLJqi2VZpWnl>{e!CEFEIX7HgA&- zd3>in0kbpAe01j0D6(u#vM0#}DJv`6E*1wZEiL_F!j;BZ~idsTyBXm0rPQVP~&_!M)Vysyyd==KXiP-#0W&H%MJg#X!%b#eOu!N=Nm6N zFGcU+=_!_zk|NV8z4KZ%Ng_)&h=$}@yP3$y#H7+-WAP808yzj|FBsQ*qM2=ZB4ePZhVha6LR@} z4O;Z9XZuRfuH%nMdU^lw;>_I8OQoV1aKC`r>1@v)zIXBEdc8w~V_z(jyLrn7QUH?% zV55nJ<_$~4+HLJf4z%&lHKTjL_N?cYB|@~@L@gJ@7U zCR!5Nm7u>5qO%_8;B#O5VYWO!jMdQ4Fqy4C$p88UZ~%4=4)0~PPK&VlbE` zQbuw%Tmn#ssiEpBU4~tsT9(hO*PefEeB`+8TWszl9&?p~^L!@`*`Bjg^R%|J(*j22 zg%$T%E5I#JS#bVqgvfDH}|!n z18!~YPFi|;HX!)RmoG?upt|uGr$;{3ryb$1v$*n$BDQb6|2pys+qWIw?x5P z;lR@FNHD9x=S~x9{u_}Kt^V6Z8EI+n7bjE0HzfN<7w*8_Si(M%fT)Hyj4s%$0KFOY z8jIGIfW|)h=ISU{xFvC->-cAe@P@@NHS4dWEz7KJY<}h%mbEN?3*pE4tv6wDCcews ztvz{${R8=#nVHK(hq8V_;7iDq2|!90KeC43Nn}-@F*;&7;Vn@^*zZWZ-%ua_gP!aJ zavznBi+QQY8S1W5_P&|*DBJGDf|zQymkHAlO}GD7Rj&4Sav~G>Uik8i=hDxjCarU< ztYg*_(yx3MLa-1gL=W8=J$(4I=#OB=BxJqCFv*NuWzap zv)JAfc0S8N*pGpb?Eb#PH$Wv6!cKFMilk4}E~W8XFMNC7SLvREEdq>ZS5`uV+C_Tp z&plAe*b%Rp7XKY-cKpCouH)8pW-IgXbK(oE7 zj{pOv_vPi|Q-!3A#C*~k{YFP@4PJVCAv^+~naMfmHIW#BkB^UUaszoGKa6j$!hBlC)wxMCp_SR+&*swe-KjevYbYfav zp&_)?ahOku@zSk_EAztyXa~*&-_zLAQuF-}#@U4qWquMM+M|lO%6ruTCF*nqj>9N% zr-0a6a_iG^h%eUNoE6|QkT?>I2{&ZlfJYE}3(cdSJQ-QOkl|D{n5TF#;TyzpXwb-g zG^ef5jdT#;brXq58e(F3o-LPZ2O_VA_=_RJUu&=A?T631a?9i1Vj*ck{PsQsacC$> zoECPok7%&->HV+|#5bkfJUn9_RnZXP{+sKOHHB1M&*n*bEUo^W%q}P*JYLkVOQRMOC$Dr}gduepGtbH=A5RMR@Bd*KbPJf zq-&r%#{q%FaCw39()MgH3wv%@HjfopdmdSdpPSsU4l2bSP9F zU=QnT2vItY&;vH6Y0PE)HOuaOhuQ)tcMJJ$xM^!?SpmsKjK1IYVlvj{`NxkRd-}y8 zp;qP>paJRJuHN2BP2@Y;sz75U762?Lfq`19s4g(lyK)mqW)Vzve>^+rj_06ztclkc z9k7T-!WZad&!fi;fDg+k@3cg4E_G<6&m<#EtBJBD%}8v zt4n_kJ`&lpYXUF+`4KG#8|k$gRiqS8ITC5TxO(3wY1VpF^EKjr;6R=4~JY`ix$Z@hI2w)FXN#V!ol;z-k, chartTheme: Theme, - { rotation: chartRotation, yLogBase, yLogMinLimit }: SettingsSpec, + { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, axesSpecs: AxisSpec[], smallMultiplesScales: SmallMultipleScales, enableHistogramMode: boolean, @@ -256,6 +256,8 @@ export function computeSeriesGeometries( chartTheme, enableHistogramMode, chartRotation, + xLogBase, + xLogMinLimit, ); const totalBarsInCluster = Object.values(barIndexByPanel).reduce((acc, curr) => { @@ -268,6 +270,8 @@ export function computeSeriesGeometries( range: [0, isHorizontalRotation(chartRotation) ? horizontal.bandwidth : vertical.bandwidth], barsPadding: enableHistogramMode ? chartTheme.scales.histogramPadding : chartTheme.scales.barsPadding, enableHistogramMode, + logBase: xLogBase, + logMinLimit: xLogMinLimit, }); return { @@ -344,6 +348,8 @@ function renderGeometries( chartTheme: Theme, enableHistogramMode: boolean, chartRotation: Rotation, + xLogBase?: LogBase, + xLogMinLimit?: number, ): Omit { const len = dataSeries.length; let i; @@ -388,6 +394,8 @@ function renderGeometries( range: [0, isHorizontalRotation(chartRotation) ? smHScale.bandwidth : smVScale.bandwidth], barsPadding, enableHistogramMode, + logBase: xLogBase, + logMinLimit: xLogMinLimit, }); const { stackMode } = ds; diff --git a/src/chart_types/xy_chart/utils/axis_utils.ts b/src/chart_types/xy_chart/utils/axis_utils.ts index 607092fac1..4cceb4f5ad 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.ts @@ -95,7 +95,7 @@ export function computeAxisTicksDimensions( yDomains: YDomain[], totalBarsInCluster: number, bboxCalculator: BBoxCalculator, - { rotation: chartRotation, yLogBase, yLogMinLimit, xLogBase, xLogMinLimit }: SettingsSpec, + { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, { gridLine, tickLabel }: AxisStyle, fallBackTickFormatter: TickFormatter, barsPadding?: number, @@ -162,7 +162,7 @@ export function getScaleForAxisSpec( axisIsYDomain: boolean, minRange: number, maxRange: number, - logBase: LogBase, + logBase?: LogBase, logMinLimit?: number, barsPadding?: number, enableHistogramMode?: boolean, @@ -756,7 +756,7 @@ export function getAxesGeometries( leftMargin: number; }, { chartPaddings, chartMargins, axes: sharedAxesStyle }: Theme, - { rotation: chartRotation, yLogBase, yLogMinLimit, xLogBase, xLogMinLimit }: SettingsSpec, + { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, axisSpecs: AxisSpec[], axisDimensions: Map, axesStyles: Map, diff --git a/src/components/__snapshots__/chart.test.tsx.snap b/src/components/__snapshots__/chart.test.tsx.snap index 8f328e72a6..a354f9c450 100644 --- a/src/components/__snapshots__/chart.test.tsx.snap +++ b/src/components/__snapshots__/chart.test.tsx.snap @@ -54,7 +54,7 @@ exports[`Chart should render the legend name test 1`] = ` - + diff --git a/src/specs/constants.ts b/src/specs/constants.ts index 6bc0575259..60c26d945c 100644 --- a/src/specs/constants.ts +++ b/src/specs/constants.ts @@ -20,7 +20,6 @@ import { $Values } from 'utility-types'; import { ChartTypes } from '../chart_types'; -import { LogBase } from '../scales/scale_continuous'; import { Position } from '../utils/common'; import { LIGHT_THEME } from '../utils/themes/light_theme'; import { SettingsSpec } from './settings'; @@ -143,6 +142,4 @@ export const DEFAULT_SETTINGS_SPEC: SettingsSpec = { baseTheme: LIGHT_THEME, brushAxis: BrushAxis.X, minBrushDelta: 2, - xLogBase: LogBase.Common, - yLogBase: LogBase.Common, }; diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 4050cefaff..6b13572674 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -321,6 +321,38 @@ export type LegendColorPicker = ComponentType; */ export type MarkBuffer = number | ((radius: number) => number); +export interface LogOptions { + /** + * Min log value to render y scale + * + * Defaults to min value of domain, or LOG_MIN_ABS_DOMAIN if mixed polarity + */ + yLogMinLimit?: number; + + /** + * Base for log y scales + * + * @defaultValue `common` {@link (LogBase:type) | LogBase.Common} + * (i.e. log base 10) + */ + yLogBase?: LogBase; + + /** + * Min log value to render x scale + * + * Defaults to min value of domain, or LOG_MIN_ABS_DOMAIN if mixed polarity + */ + xLogMinLimit?: number; + + /** + * Base for log x scales + * + * @defaultValue `common` {@link (LogBase:type) | LogBase.Common} + * (i.e. log base 10) + */ + xLogBase?: LogBase; +} + /** * The Spec used for Chart settings * @public @@ -472,31 +504,10 @@ export interface SettingsSpec extends Spec { */ noResults?: ComponentType | ReactChild; /** - * Min log value to render y scale - * - * Defaults to min value of domain, or 0 if mixed polarity - */ - yLogMinLimit?: number; - - /** - * Min log value to render y scale - * - * Defaults to min value of domain, or 0 if mixed polarity - */ - yLogBase: LogBase; - /** - * Min log value to render x scale - * - * Defaults to min value of domain, or 0 if mixed polarity - */ - xLogMinLimit?: number; - - /** - * Min log value to render x scale - * - * Defaults to min value of domain, or 0 if mixed polarity + * Options to configure log scales + * TODO: move into scales component to be per scale not per chart */ - xLogBase: LogBase; + logOptions?: LogOptions; } /** @@ -555,9 +566,7 @@ export type DefaultSettingsProps = | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' - | 'externalPointerEvents' - | 'yLogBase' - | 'xLogBase'; + | 'externalPointerEvents'; export type SettingsSpecProps = Partial>; diff --git a/stories/area/17_negative.tsx b/stories/area/17_negative.tsx index dd44c88f57..f52c24009e 100644 --- a/stories/area/17_negative.tsx +++ b/stories/area/17_negative.tsx @@ -40,7 +40,7 @@ export const Example = () => { ); return ( - + Number(d).toFixed(2)} /> diff --git a/stories/area/18_negative_positive.tsx b/stories/area/18_negative_positive.tsx index c75dbbbe42..f8a86e2d3d 100644 --- a/stories/area/18_negative_positive.tsx +++ b/stories/area/18_negative_positive.tsx @@ -39,7 +39,7 @@ export const Example = () => { return ( - + & { +type LogKnobs = Pick & { xDataType: string; yDataType: string; xNegative: boolean; @@ -59,17 +59,25 @@ const getLogKnobs = (): LogKnobs => { const yGroup = 'Y - Axis'; const yUseDefaultLimit = boolean('Use default limit', false, yGroup); const yLimit = number('Log min limit', 1, { min: 0 }, yGroup); - const xUseDefaultLimit = boolean('Use default limit', false, xGroup); + const xUseDefaultLimit = boolean('Use default limit', true, xGroup); const xLimit = number('Log min limit', 1, { min: 0 }, xGroup); return { xDataType: getDataType(xGroup), yDataType: getDataType(yGroup, 'upDown'), xNegative: boolean('Use negative values', false, xGroup), yNegative: boolean('Use negative values', false, yGroup), - yLogMinLimit: yUseDefaultLimit ? undefined : yLimit, - xLogMinLimit: xUseDefaultLimit ? undefined : xLimit, - yLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: yGroup }), - xLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { group: xGroup }), + logOptions: { + yLogMinLimit: yUseDefaultLimit ? undefined : yLimit, + xLogMinLimit: xUseDefaultLimit ? undefined : xLimit, + yLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { + group: yGroup, + allowUndefined: true, + }), + xLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { + group: xGroup, + allowUndefined: true, + }), + }, yPadding: number('Padding', 0, { min: 0 }, yGroup), }; }; @@ -108,7 +116,10 @@ const getInitalData = (rows: number) => { return [...range(quart, -quart, -1), ...range(-quart, quart + 1, 1)]; }; -const getData = (rows: number, { yLogBase, xLogBase, yDataType, xDataType, yNegative, xNegative }: LogKnobs) => +const getData = ( + rows: number, + { logOptions: { yLogBase, xLogBase } = {}, yDataType, xDataType, yNegative, xNegative }: LogKnobs, +) => getInitalData(rows).map((v, i, { length }) => { const y0 = getDataValue(yDataType, v, i, length); const x0 = getDataValue(xDataType, v, i, length); @@ -120,23 +131,23 @@ const getData = (rows: number, { yLogBase, xLogBase, yDataType, xDataType, yNega export const Example = () => { const rows = number('Rows in dataset', 11, { min: 5, step: 2, max: 21 }); - const logOptions = getLogKnobs(); - const data = getData(rows, logOptions); + const logKnobs = getLogKnobs(); + const data = getData(rows, logKnobs); const type = getSeriesType(); const Series = seriesMap[type]; return ( - + diff --git a/stories/utils/knobs.ts b/stories/utils/knobs.ts index 6c524727fc..c2adbdc127 100644 --- a/stories/utils/knobs.ts +++ b/stories/utils/knobs.ts @@ -75,10 +75,12 @@ export const getKnobsFromEnum = ; exclude?: Array; } = {}, @@ -92,7 +94,7 @@ export const getKnobsFromEnum = Date: Tue, 16 Feb 2021 13:03:57 -0600 Subject: [PATCH 12/12] fix: rename options and update api.md --- api/charts.api.md | 17 ++++++++++++----- src/chart_types/xy_chart/state/utils/utils.ts | 2 +- src/chart_types/xy_chart/utils/axis_utils.ts | 4 ++-- src/specs/settings.tsx | 4 ++-- stories/area/17_negative.tsx | 2 +- stories/area/18_negative_positive.tsx | 2 +- stories/scales/7_log_scale_options.tsx | 10 +++++----- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index d91281a6e4..f4e708d85f 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -701,7 +701,7 @@ export const DEFAULT_TOOLTIP_TYPE: "vertical"; // Warning: (ae-missing-release-tag) "DefaultSettingsProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents' | 'yLogBase' | 'xLogBase'; +export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents'; // Warning: (ae-missing-release-tag) "DEPTH_KEY" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1736,6 +1736,16 @@ export type ScaleBandType = ScaleOrdinalType; // @public (undocumented) export type ScaleContinuousType = typeof ScaleType.Linear | typeof ScaleType.Time | typeof ScaleType.Log | typeof ScaleType.Sqrt; +// Warning: (ae-missing-release-tag) "ScaleLogOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ScaleLogOptions { + xLogBase?: LogBase; + xLogMinLimit?: number; + yLogBase?: LogBase; + yLogMinLimit?: number; +} + // Warning: (ae-missing-release-tag) "ScaleOrdinalType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1952,6 +1962,7 @@ export interface SettingsSpec extends Spec { // (undocumented) rotation: Rotation; roundHistogramBrushValues?: boolean; + scaleLogOptions?: ScaleLogOptions; // (undocumented) showLegend: boolean; showLegendExtra: boolean; @@ -1959,10 +1970,6 @@ export interface SettingsSpec extends Spec { tooltip: TooltipSettings; // (undocumented) xDomain?: ContinuousDomain | OrdinalDomain | DomainRange; - xLogBase: LogBase; - xLogMinLimit?: number; - yLogBase: LogBase; - yLogMinLimit?: number; } // Warning: (ae-missing-release-tag) "SettingsSpecProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/src/chart_types/xy_chart/state/utils/utils.ts b/src/chart_types/xy_chart/state/utils/utils.ts index fb70f6b20c..000b0d85c0 100644 --- a/src/chart_types/xy_chart/state/utils/utils.ts +++ b/src/chart_types/xy_chart/state/utils/utils.ts @@ -183,7 +183,7 @@ export function computeSeriesGeometries( { xDomain, yDomains, formattedDataSeries: nonFilteredDataSeries }: SeriesDomainsAndData, seriesColorMap: Map, chartTheme: Theme, - { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, + { rotation: chartRotation, scaleLogOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, axesSpecs: AxisSpec[], smallMultiplesScales: SmallMultipleScales, enableHistogramMode: boolean, diff --git a/src/chart_types/xy_chart/utils/axis_utils.ts b/src/chart_types/xy_chart/utils/axis_utils.ts index 4cceb4f5ad..a0a51674a2 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.ts @@ -95,7 +95,7 @@ export function computeAxisTicksDimensions( yDomains: YDomain[], totalBarsInCluster: number, bboxCalculator: BBoxCalculator, - { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, + { rotation: chartRotation, scaleLogOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, { gridLine, tickLabel }: AxisStyle, fallBackTickFormatter: TickFormatter, barsPadding?: number, @@ -756,7 +756,7 @@ export function getAxesGeometries( leftMargin: number; }, { chartPaddings, chartMargins, axes: sharedAxesStyle }: Theme, - { rotation: chartRotation, logOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, + { rotation: chartRotation, scaleLogOptions: { yLogBase, yLogMinLimit, xLogBase, xLogMinLimit } = {} }: SettingsSpec, axisSpecs: AxisSpec[], axisDimensions: Map, axesStyles: Map, diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx index 3c0d0effde..3f339ade26 100644 --- a/src/specs/settings.tsx +++ b/src/specs/settings.tsx @@ -321,7 +321,7 @@ export type LegendColorPicker = ComponentType; */ export type MarkBuffer = number | ((radius: number) => number); -export interface LogOptions { +export interface ScaleLogOptions { /** * Min log value to render y scale * @@ -507,7 +507,7 @@ export interface SettingsSpec extends Spec { * Options to configure log scales * TODO: move into scales component to be per scale not per chart */ - logOptions?: LogOptions; + scaleLogOptions?: ScaleLogOptions; } /** diff --git a/stories/area/17_negative.tsx b/stories/area/17_negative.tsx index f52c24009e..e0090e199a 100644 --- a/stories/area/17_negative.tsx +++ b/stories/area/17_negative.tsx @@ -40,7 +40,7 @@ export const Example = () => { ); return ( - + Number(d).toFixed(2)} /> diff --git a/stories/area/18_negative_positive.tsx b/stories/area/18_negative_positive.tsx index f8a86e2d3d..be7a9d3b6b 100644 --- a/stories/area/18_negative_positive.tsx +++ b/stories/area/18_negative_positive.tsx @@ -39,7 +39,7 @@ export const Example = () => { return ( - + & { +type LogKnobs = Pick & { xDataType: string; yDataType: string; xNegative: boolean; @@ -66,7 +66,7 @@ const getLogKnobs = (): LogKnobs => { yDataType: getDataType(yGroup, 'upDown'), xNegative: boolean('Use negative values', false, xGroup), yNegative: boolean('Use negative values', false, yGroup), - logOptions: { + scaleLogOptions: { yLogMinLimit: yUseDefaultLimit ? undefined : yLimit, xLogMinLimit: xUseDefaultLimit ? undefined : xLimit, yLogBase: getKnobsFromEnum('Log base', LogBase, LogBase.Common as LogBase, { @@ -118,7 +118,7 @@ const getInitalData = (rows: number) => { const getData = ( rows: number, - { logOptions: { yLogBase, xLogBase } = {}, yDataType, xDataType, yNegative, xNegative }: LogKnobs, + { scaleLogOptions: { yLogBase, xLogBase } = {}, yDataType, xDataType, yNegative, xNegative }: LogKnobs, ) => getInitalData(rows).map((v, i, { length }) => { const y0 = getDataValue(yDataType, v, i, length); @@ -141,13 +141,13 @@ export const Example = () => {