UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

128 lines (127 loc) 5.23 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { isBandScaleConfig, isPointScaleConfig, isContinuousScaleConfig } from "../../../../models/axis.mjs"; import { getColorScale, getOrdinalColorScale } from "../../../colorScale.mjs"; import { getDefaultTickNumber, getTickNumber } from "../../../ticks.mjs"; import { getScale } from "../../../getScale.mjs"; import { isDateData, createDateFormatter } from "../../../dateHelpers.mjs"; import { getAxisExtremum } from "./getAxisExtremum.mjs"; import { deg2rad } from "../../../angleConversion.mjs"; import { getAxisTriggerTooltip } from "./getAxisTriggerTooltip.mjs"; import { scaleBand, scalePoint } from "../../../scales/index.mjs"; function getRange(drawingArea, axisDirection, axis) { if (axisDirection === 'rotation') { if (axis.scaleType === 'point') { const angles = [deg2rad(axis.startAngle, 0), deg2rad(axis.endAngle, 2 * Math.PI)]; const diff = angles[1] - angles[0]; if (diff > Math.PI * 2 - 0.1) { // If we cover a full circle, we remove a slice to avoid having data point at the same place. angles[1] -= diff / axis.data.length; } return angles; } return [deg2rad(axis.startAngle, 0), deg2rad(axis.endAngle, 2 * Math.PI)]; } const availableRadius = Math.min(drawingArea.height, drawingArea.width) / 2; return [axis.minRadius ?? 0, axis.maxRadius ?? availableRadius]; } const DEFAULT_CATEGORY_GAP_RATIO = 0.2; const DEFAULT_BAR_GAP_RATIO = 0.1; export function computeAxisValue({ drawingArea, formattedSeries, axis: allAxis, seriesConfig, axisDirection }) { if (allAxis === undefined) { return { axis: {}, axisIds: [] }; } const axisIdsTriggeringTooltip = getAxisTriggerTooltip(axisDirection, seriesConfig, formattedSeries, allAxis[0].id); const completeAxis = {}; allAxis.forEach((eachAxis, axisIndex) => { const axis = eachAxis; const range = getRange(drawingArea, axisDirection, axis); const [minData, maxData] = getAxisExtremum(axis, axisDirection, seriesConfig, axisIndex, formattedSeries); const triggerTooltip = !axis.ignoreTooltip && axisIdsTriggeringTooltip.has(axis.id); const data = axis.data ?? []; if (isBandScaleConfig(axis)) { const categoryGapRatio = axis.categoryGapRatio ?? DEFAULT_CATEGORY_GAP_RATIO; const barGapRatio = axis.barGapRatio ?? DEFAULT_BAR_GAP_RATIO; completeAxis[axis.id] = _extends({ offset: 0, categoryGapRatio, barGapRatio, triggerTooltip }, axis, { data, scale: scaleBand(axis.data, range).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2), tickNumber: axis.data.length, colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({ values: axis.data }, axis.colorMap)) : getColorScale(axis.colorMap)) }); if (isDateData(axis.data)) { const dateFormatter = createDateFormatter(axis.data, range, axis.tickNumber); completeAxis[axis.id].valueFormatter = axis.valueFormatter ?? dateFormatter; } } if (isPointScaleConfig(axis)) { completeAxis[axis.id] = _extends({ offset: 0, triggerTooltip }, axis, { data, scale: scalePoint(axis.data, range), tickNumber: axis.data.length, colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({ values: axis.data }, axis.colorMap)) : getColorScale(axis.colorMap)) }); if (isDateData(axis.data)) { const dateFormatter = createDateFormatter(axis.data, range, axis.tickNumber); completeAxis[axis.id].valueFormatter = axis.valueFormatter ?? dateFormatter; } } if (!isContinuousScaleConfig(axis)) { // Could be merged with the two previous "if conditions" but then TS does not get that `axis.scaleType` can't be `band` or `point`. return; } const scaleType = axis.scaleType ?? 'linear'; const domainLimit = axis.domainLimit ?? 'nice'; const axisExtremums = [axis.min ?? minData, axis.max ?? maxData]; if (typeof domainLimit === 'function') { const { min, max } = domainLimit(minData, maxData); axisExtremums[0] = min; axisExtremums[1] = max; } // Use degrees to display more ticks by default const ratio = axisDirection === 'rotation' ? 180 / 3 : 1; const tickNumber = axis.tickNumber ?? getTickNumber(axis, axisExtremums, getDefaultTickNumber(ratio * Math.abs(range[1] - range[0]))); const scale = getScale(scaleType, axisExtremums, range); const finalScale = domainLimit === 'nice' ? scale.nice(tickNumber) : scale; const [minDomain, maxDomain] = finalScale.domain(); const domain = [axis.min ?? minDomain, axis.max ?? maxDomain]; completeAxis[axis.id] = _extends({ offset: 0, triggerTooltip }, axis, { data, scaleType: scaleType, scale: finalScale.domain(domain), tickNumber, colorScale: axis.colorMap && getColorScale(axis.colorMap) }); }); return { axis: completeAxis, axisIds: allAxis.map(({ id }) => id) }; }