@mui/x-charts
Version:
The community edition of MUI X Charts components.
55 lines • 2.09 kB
JavaScript
import { findMinMax } from "./findMinMax.js";
import { getBandSize } from "./getBandSize.js";
function shouldInvertStartCoordinate(verticalLayout, baseValue, reverse) {
const isVerticalAndPositive = verticalLayout && baseValue > 0;
const isHorizontalAndNegative = !verticalLayout && baseValue < 0;
const invertStartCoordinate = isVerticalAndPositive || isHorizontalAndNegative;
return reverse ? !invertStartCoordinate : invertStartCoordinate;
}
export function getBarDimensions(params) {
const {
verticalLayout,
xAxisConfig,
yAxisConfig,
series,
dataIndex,
numberOfGroups,
groupIndex
} = params;
const baseScaleConfig = verticalLayout ? xAxisConfig : yAxisConfig;
const reverse = (verticalLayout ? yAxisConfig.reverse : xAxisConfig.reverse) ?? false;
const {
barWidth,
offset
} = getBandSize(baseScaleConfig.scale.bandwidth(), numberOfGroups, baseScaleConfig.barGapRatio);
const barOffset = groupIndex * (barWidth + offset);
const xScale = xAxisConfig.scale;
const yScale = yAxisConfig.scale;
const baseValue = baseScaleConfig.data[dataIndex];
const seriesValue = series.data[dataIndex];
if (seriesValue == null) {
return null;
}
const values = series.visibleStackedData[dataIndex];
const valueCoordinates = values.map(v => verticalLayout ? yScale(v) : xScale(v));
const [minValueCoord, maxValueCoord] = findMinMax(valueCoordinates).map(v => Math.round(v));
let barSize = 0;
if (seriesValue !== 0) {
if (!series.hidden) {
barSize = Math.max(series.minBarSize, maxValueCoord - minValueCoord);
}
}
const shouldInvert = shouldInvertStartCoordinate(verticalLayout, seriesValue, reverse);
let startCoordinate = 0;
if (shouldInvert) {
startCoordinate = maxValueCoord - barSize;
} else {
startCoordinate = minValueCoord;
}
return {
x: verticalLayout ? xScale(baseValue) + barOffset : startCoordinate,
y: verticalLayout ? startCoordinate : yScale(baseValue) + barOffset,
height: verticalLayout ? barSize : barWidth,
width: verticalLayout ? barWidth : barSize
};
}