JUNG(Java Graph):如何防止顶点和边缘标签重叠?

我目前正在使用Jung绘制图形(我的意思是图形不是图表!)。 问题是顶点和边缘标签与顶点和边缘重叠。 这会导致奇怪的图形。 问题不受特定布局算法的约束(尽管我一直在使用FRLayout)。

有没有可能告诉JUNG防止这些重叠? 我希望这已经实施,唯一的问题是找到合适的选择!

(以下答案假定Jung2;我不熟悉Jung2之前)。

Jung的优势之一是它非常易于扩展,并且易于扩展。 Jung允许您插入各种变换器(简单渲染属性),渲染器(更复杂的渲染)等等,以在默认设置不正确时自定义行为。 这些通常安装在RenderContext上(您可以从VisualizationViewer获取)。

另一方面,它的缺点是它的复杂性和缺乏体面的文档。 如果您要进行任何中等到重度的定制,您需要深入了解Jung来源。

例如,可以通过插入新的顶点标签渲染器(Renderer.VertexLabel接口)来自定义顶点标签渲染。 例如,您可以实例化BasicVertexLabelRenderer并指定其他位置(北,西,中等)。 如果您愿意将形状更改为大于该圆的大小(为此,请安装自己的顶点形状变换器 – Transformer的一个实例),您可以将标签放在中心位置。 或者,您可以创建自己的此接口自定义实现,在标签文本下呈现背景。

您还可以安装自己的Renderer.EdgeLabel调整版本(请参阅Jung的BasicEdgeLabelRenderer)来自定义边缘标签的位置。

您只需要设置标签偏移量:

vv.getRenderContext().setLabelOffset(20); 

其中vvVisualizationViewer对象。

顺便说一句,如果你想改变颜色,起初它似乎是一个主要的痛苦。 但我最近发现了这个小技巧:

 Transformer labelTransformer = new ChainedTransformer(new Transformer[]{ new ToStringLabeller(), new Transformer() { public String transform(String input) { return ""+input; }}}); context.setVertexLabelTransformer(labelTransformer); 

我认为这只是它的实现方式,代码的作者可能不认为它是一个问题。 JUNG库是开源的,欢迎您根据需要对其进行更改。

如果您不想更改代码,只需更改标签的颜色即可轻松修复标签,因此它们与边缘不同。

我遇到了边缘标签重叠的相同问题。 我用来定位边缘标签的快速而肮脏的解决方案是在字符串值中用空格填充一定长度。

 //pad some white spaces to value of edge when adding edges to the graph graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2); 

它将避免边缘标签在中心发生混浊和重叠,尤其是在构建二分图时。 希望这有助于你们中的一些人!