插件窝 干货文章 G6图可视化中,如何优雅地处理Dagre布局下节点文本过长的问题?

G6图可视化中,如何优雅地处理Dagre布局下节点文本过长的问题?

节点 文本 const node 491    来源:    2025-03-21

在G6图可视化中,使用Dagre布局时,节点文本过长可能会导致节点宽度过大,影响整体布局的美观性和可读性。为了优雅地处理这个问题,可以考虑以下几种方法:

1. 文本截断与省略号

将过长的文本截断,并在末尾添加省略号(...),以保持节点的宽度在合理范围内。

const maxTextLength = 10; // 设置最大文本长度
const truncatedText = text.length > maxTextLength ? text.substring(0, maxTextLength) + '...' : text;

// 在节点配置中使用截断后的文本
node.set('label', truncatedText);

2. 自动换行

通过设置节点的 labelCfg 属性,使文本在达到一定宽度时自动换行。

const node = {
  id: 'node1',
  label: '这是一个非常长的节点文本,需要自动换行',
  labelCfg: {
    style: {
      width: 100, // 设置文本宽度
      textAlign: 'center',
      textBaseline: 'middle',
      lineHeight: 20, // 设置行高
    },
  },
};

3. 动态调整节点大小

根据文本长度动态调整节点的大小,确保节点能够容纳文本内容。

const node = {
  id: 'node1',
  label: '这是一个非常长的节点文本',
  size: [text.length * 10, 30], // 根据文本长度动态调整节点宽度
};

4. 使用Tooltip显示完整文本

在节点上添加Tooltip,当用户将鼠标悬停在节点上时,显示完整的文本内容。

const node = {
  id: 'node1',
  label: '这是一个非常长的节点文本',
  tooltip: '这是一个非常长的节点文本,鼠标悬停时显示完整内容',
};

// 在G6配置中启用Tooltip
const graph = new G6.Graph({
  container: 'mountNode',
  width: 800,
  height: 600,
  modes: {
    default: ['drag-node', 'zoom-canvas'],
  },
  defaultNode: {
    type: 'circle',
    labelCfg: {
      style: {
        fill: '#333',
      },
    },
  },
  plugins: [new G6.Tooltip()],
});

5. 使用自定义节点

通过自定义节点的方式,完全控制节点的渲染逻辑,包括文本的显示方式。

G6.registerNode('custom-node', {
  draw(cfg, group) {
    const { label, size } = cfg;
    const width = size[0];
    const height = size[1];

    const rect = group.addShape('rect', {
      attrs: {
        x: -width / 2,
        y: -height / 2,
        width,
        height,
        fill: '#fff',
        stroke: '#000',
      },
    });

    const text = group.addShape('text', {
      attrs: {
        x: 0,
        y: 0,
        text: label,
        textAlign: 'center',
        textBaseline: 'middle',
        fill: '#000',
        fontSize: 12,
      },
    });

    return rect;
  },
});

const graph = new G6.Graph({
  container: 'mountNode',
  width: 800,
  height: 600,
  defaultNode: {
    type: 'custom-node',
    size: [100, 30],
  },
});

6. 使用外部库进行文本处理

可以使用一些外部库(如 text-metrics)来精确测量文本的宽度和高度,从而更好地控制节点的布局。

import TextMetrics from 'text-metrics';

const textMetrics = new TextMetrics();
const textWidth = textMetrics.width(text, { fontSize: 12 });

// 根据文本宽度调整节点大小
const node = {
  id: 'node1',
  label: text,
  size: [textWidth + 20, 30], // 增加一些边距
};

总结

处理Dagre布局下节点文本过长的问题,可以通过文本截断、自动换行、动态调整节点大小、使用Tooltip、自定义节点或外部库等方法来实现。根据具体的应用场景和需求,选择合适的方法来优化图的可视化效果。