update at 2026-02-14 11:47:31
This commit is contained in:
@@ -539,27 +539,31 @@ function buildSankeyLayout(links, width, height, renderOptions) {
|
|||||||
const columnNodeHeightMap = {};
|
const columnNodeHeightMap = {};
|
||||||
const columnGapMap = {};
|
const columnGapMap = {};
|
||||||
const columnBlockHeightMap = {};
|
const columnBlockHeightMap = {};
|
||||||
|
const baseColumnBlockHeightMap = {};
|
||||||
columns.forEach((names, depth) => {
|
columns.forEach((names, depth) => {
|
||||||
const totalNodeHeight = names.reduce((sum, name) => sum + (nodeValueMap[name] || 0) * unitHeight, 0);
|
const totalNodeHeight = names.reduce((sum, name) => sum + (nodeValueMap[name] || 0) * unitHeight, 0);
|
||||||
|
columnNodeHeightMap[depth] = totalNodeHeight;
|
||||||
|
baseColumnBlockHeightMap[depth] =
|
||||||
|
totalNodeHeight + Math.max(0, names.length - 1) * effectiveGap;
|
||||||
|
});
|
||||||
|
|
||||||
|
const globalSpanHeight = columns.reduce((max, _names, depth) => {
|
||||||
|
return Math.max(max, baseColumnBlockHeightMap[depth] || 0);
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
columns.forEach((names, depth) => {
|
||||||
|
const totalNodeHeight = columnNodeHeightMap[depth] || 0;
|
||||||
let columnGap = effectiveGap;
|
let columnGap = effectiveGap;
|
||||||
if (depth === maxDepth && targetAlignMode === 'between' && names.length > 1) {
|
if (targetAlignMode === 'between' && names.length > 1) {
|
||||||
const sourceNames = columns[0] || [];
|
// 全局两端对齐:每一列都按同一纵向跨度拉伸。
|
||||||
const sourceTotalNodeHeight = sourceNames.reduce(
|
columnGap = (globalSpanHeight - totalNodeHeight) / (names.length - 1);
|
||||||
(sum, name) => sum + (nodeValueMap[name] || 0) * unitHeight,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
const sourceSpanHeight =
|
|
||||||
sourceTotalNodeHeight + Math.max(0, sourceNames.length - 1) * effectiveGap;
|
|
||||||
columnGap = (sourceSpanHeight - totalNodeHeight) / (names.length - 1);
|
|
||||||
}
|
}
|
||||||
columnGap = Math.max(0, columnGap);
|
columnGap = Math.max(0, columnGap);
|
||||||
const blockHeight = totalNodeHeight + Math.max(0, names.length - 1) * columnGap;
|
const blockHeight = totalNodeHeight + Math.max(0, names.length - 1) * columnGap;
|
||||||
columnNodeHeightMap[depth] = totalNodeHeight;
|
|
||||||
columnGapMap[depth] = columnGap;
|
columnGapMap[depth] = columnGap;
|
||||||
columnBlockHeightMap[depth] = blockHeight;
|
columnBlockHeightMap[depth] = blockHeight;
|
||||||
});
|
});
|
||||||
|
|
||||||
const sourceSpanHeight = columnBlockHeightMap[0] || 0;
|
|
||||||
const leftX = padding;
|
const leftX = padding;
|
||||||
const rightX = Math.max(padding + nodeWidth + 80, width - padding - nodeWidth);
|
const rightX = Math.max(padding + nodeWidth + 80, width - padding - nodeWidth);
|
||||||
const columnStep = maxDepth > 0 ? (rightX - leftX) / maxDepth : 0;
|
const columnStep = maxDepth > 0 ? (rightX - leftX) / maxDepth : 0;
|
||||||
@@ -570,12 +574,10 @@ function buildSankeyLayout(links, width, height, renderOptions) {
|
|||||||
const blockHeight = columnBlockHeightMap[depth] || 0;
|
const blockHeight = columnBlockHeightMap[depth] || 0;
|
||||||
const columnGap = columnGapMap[depth] || 0;
|
const columnGap = columnGapMap[depth] || 0;
|
||||||
let startY = padding;
|
let startY = padding;
|
||||||
if (depth === maxDepth) {
|
|
||||||
if (targetAlignMode === 'middle') {
|
if (targetAlignMode === 'middle') {
|
||||||
startY = padding + Math.max(0, (sourceSpanHeight - blockHeight) / 2);
|
startY = padding + Math.max(0, (globalSpanHeight - blockHeight) / 2);
|
||||||
} else if (targetAlignMode === 'bottom') {
|
} else if (targetAlignMode === 'bottom') {
|
||||||
startY = padding + Math.max(0, sourceSpanHeight - blockHeight);
|
startY = padding + Math.max(0, globalSpanHeight - blockHeight);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let cursorY = startY;
|
let cursorY = startY;
|
||||||
|
|||||||
Reference in New Issue
Block a user