update at 2026-02-14 12:05:14
This commit is contained in:
@@ -496,6 +496,23 @@ function buildSankeyLayout(links, width, height, renderOptions) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 与 Web 端 nodeAlign='justify' 对齐:
|
||||||
|
// - 无入边节点固定在最左列
|
||||||
|
// - 无出边节点固定在最右列
|
||||||
|
// 这样可避免“短路径末端节点停在中间列”的视觉差异。
|
||||||
|
const baseMaxDepth = nodeNames.reduce((max, name) => Math.max(max, depthMap[name] || 0), 0);
|
||||||
|
nodeNames.forEach((name) => {
|
||||||
|
const incomingCount = incomingCountMap[name] || 0;
|
||||||
|
const outgoingCount = outgoingCountMap[name] || 0;
|
||||||
|
if (incomingCount === 0 && outgoingCount > 0) {
|
||||||
|
depthMap[name] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (outgoingCount === 0 && incomingCount > 0) {
|
||||||
|
depthMap[name] = baseMaxDepth;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const maxDepth = nodeNames.reduce((max, name) => Math.max(max, depthMap[name] || 0), 0);
|
const maxDepth = nodeNames.reduce((max, name) => Math.max(max, depthMap[name] || 0), 0);
|
||||||
const columns = Array.from({ length: maxDepth + 1 }, () => []);
|
const columns = Array.from({ length: maxDepth + 1 }, () => []);
|
||||||
nodeNames.forEach((name) => {
|
nodeNames.forEach((name) => {
|
||||||
@@ -591,7 +608,9 @@ function buildSankeyLayout(links, width, height, renderOptions) {
|
|||||||
x: nodeX,
|
x: nodeX,
|
||||||
y: cursorY,
|
y: cursorY,
|
||||||
h: nodeHeight,
|
h: nodeHeight,
|
||||||
colorIndex: Number.isFinite(nodeColorIndexMap[name]) ? nodeColorIndexMap[name] : 0
|
colorIndex: Number.isFinite(nodeColorIndexMap[name]) ? nodeColorIndexMap[name] : 0,
|
||||||
|
incomingCount: incomingCountMap[name] || 0,
|
||||||
|
outgoingCount: outgoingCountMap[name] || 0
|
||||||
};
|
};
|
||||||
nodes.push(node);
|
nodes.push(node);
|
||||||
nodePositionMap[name] = node;
|
nodePositionMap[name] = node;
|
||||||
@@ -696,8 +715,8 @@ function buildSankeySvgText(links, width, height, renderOptions) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
layout.nodes.forEach((node) => {
|
layout.nodes.forEach((node) => {
|
||||||
const isSource = node.depth === 0;
|
const isSource = node.incomingCount === 0 && node.outgoingCount > 0;
|
||||||
const isTarget = node.depth === layout.maxDepth;
|
const isTarget = node.outgoingCount === 0 && node.incomingCount > 0;
|
||||||
const textY = getClampedLabelY(
|
const textY = getClampedLabelY(
|
||||||
node.y,
|
node.y,
|
||||||
node.h,
|
node.h,
|
||||||
@@ -1407,8 +1426,8 @@ Page({
|
|||||||
});
|
});
|
||||||
|
|
||||||
layout.nodes.forEach((node) => {
|
layout.nodes.forEach((node) => {
|
||||||
const isSource = node.depth === 0;
|
const isSource = node.incomingCount === 0 && node.outgoingCount > 0;
|
||||||
const isTarget = node.depth === layout.maxDepth;
|
const isTarget = node.outgoingCount === 0 && node.incomingCount > 0;
|
||||||
const labelPlacement = getCanvasLabelPlacement(
|
const labelPlacement = getCanvasLabelPlacement(
|
||||||
node.x,
|
node.x,
|
||||||
layout.nodeWidth,
|
layout.nodeWidth,
|
||||||
|
|||||||
Reference in New Issue
Block a user