@antv/g2
Version:
the Grammar of Graphics in Javascript
100 lines • 3.89 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Line = void 0;
const d3_array_1 = require("d3-array");
const coordinate_1 = require("../utils/coordinate");
const shape_1 = require("../shape");
const transform_1 = require("../transform");
const utils_1 = require("./utils");
const shape = {
line: shape_1.LineShape,
smooth: shape_1.LineSmooth,
hv: shape_1.LineHV,
vh: shape_1.LineVH,
hvh: shape_1.LineHVH,
trail: shape_1.LineTrail,
};
const line = (index, scale, value, coordinate) => {
var _a, _b;
const { series: S, x: X, y: Y } = value;
const { x, y } = scale;
// Because x and y channel is not strictly required in Line.props,
// it should throw error with empty x or y channels.
if (X === undefined || Y === undefined) {
throw new Error('Missing encode for x or y channel.');
}
// Group data into series.
// There is only one series without specified series encode.
const series = S ? Array.from((0, d3_array_1.group)(index, (i) => S[i]).values()) : [index];
const I = series.map((group) => group[0]).filter((i) => i !== undefined);
// A group of data corresponds to one line.
const xoffset = (((_a = x === null || x === void 0 ? void 0 : x.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(x)) || 0) / 2;
const yoffset = (((_b = y === null || y === void 0 ? void 0 : y.getBandWidth) === null || _b === void 0 ? void 0 : _b.call(y)) || 0) / 2;
const P = Array.from(series, (I) => {
return I.map((i) => coordinate.map([+X[i] + xoffset, +Y[i] + yoffset]));
});
return [I, P, series];
};
const parallel = (index, scale, value, coordinate) => {
// Extract all value for position[number] channels.
const PV = Object.entries(value)
.filter(([key]) => key.startsWith('position'))
.map(([, value]) => value);
// Because position channel is not strictly required in Line.props,
// it should throw error with empty position values.
if (PV.length === 0) {
throw new Error('Missing encode for position channel.');
}
// One data corresponds to one line.
const P = Array.from(index, (i) => {
// Transform high dimension vector to a list of two-dimension vectors.
// [a, b, c] -> [d, e, f, g, h, i]
const vector = PV.map((pv) => +pv[i]);
const vectors = coordinate.map(vector);
// Two-dimension vectors are stored in a flat array, so extract them.
// [d, e, f, g, h, i] -> [d, e], [f, g], [h, i]
const points = [];
for (let i = 0; i < vectors.length; i += 2) {
points.push([vectors[i], vectors[i + 1]]);
}
return points;
});
return [index, P];
};
/**
* Convert value for each channel to line shapes.
*/
const Line = () => {
return (index, scale, value, coordinate) => {
const mark = (0, coordinate_1.isParallel)(coordinate) ? parallel : line;
return mark(index, scale, value, coordinate);
};
};
exports.Line = Line;
exports.Line.props = {
defaultShape: 'line',
defaultLabelShape: 'label',
composite: false,
shape,
channels: [
...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),
{ name: 'x' },
{ name: 'y' },
{ name: 'position', independent: true },
{ name: 'size' },
{ name: 'series', scale: 'band' },
],
preInference: [
...(0, utils_1.basePreInference)(),
// !!!Note This order is very important.
{ type: transform_1.MaybeGradient },
{ type: transform_1.MaybeSeries },
],
postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)(), ...(0, utils_1.tooltipXd)()],
interaction: {
shareTooltip: true,
seriesTooltip: true,
crosshairs: true,
},
};
//# sourceMappingURL=line.js.map
;