@mui/x-charts
Version:
The community edition of MUI X Charts components.
128 lines • 5.03 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { scaleBand, scalePoint } from '@mui/x-charts-vendor/d3-scale';
import { isBandScaleConfig, isPointScaleConfig } from "../../../../models/axis.js";
import { getColorScale, getOrdinalColorScale } from "../../../colorScale.js";
import { getTickNumber, scaleTickNumberByRange } from "../../../ticks.js";
import { getScale } from "../../../getScale.js";
import { isDateData, createDateFormatter } from "../../../dateHelpers.js";
import { getAxisExtremum } from "./getAxisExtremum.js";
import { deg2rad } from "../../../angleConversion.js";
import { getAxisTriggerTooltip } from "./getAxisTriggerTooltip.js";
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)];
}
return [0, Math.min(drawingArea.height, drawingArea.width) / 2];
}
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, range);
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, range);
completeAxis[axis.id].valueFormatter = axis.valueFormatter ?? dateFormatter;
}
}
if (axis.scaleType === 'band' || axis.scaleType === 'point') {
// 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;
}
const rawTickNumber = getTickNumber(_extends({}, axis, {
range,
domain: axisExtremums
}));
const tickNumber = scaleTickNumberByRange(rawTickNumber, range);
const scale = getScale(scaleType, axisExtremums, range);
const finalScale = domainLimit === 'nice' ? scale.nice(rawTickNumber) : 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)
};
}