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

6
我目前正在使用Jung绘制图形(我的意思是图形而不是图表!)。问题在于顶点和边标签与顶点和边重叠。这导致图形看起来很奇怪。问题不限于特定的布局算法(尽管我一直在使用FRLayout)。
有没有可能告诉JUNG防止这些重叠?我希望这已经实现了,唯一的问题是找到正确的选项!
5个回答

7

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

vv.getRenderContext().setLabelOffset(20);

其中vv是您的VisualizationViewer对象。


6

顺便说一下,如果你想改变颜色,起初似乎很麻烦。但最近我发现了一个小技巧:

Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{
            new ToStringLabeller<String>(),
            new Transformer<String,String>() {
            public String transform(String input) {
                return "<html><font color=\"yellow\">"+input;
            }}});

context.setVertexLabelTransformer(labelTransformer);

3
你知道在JUNG中这种使用HTML的文档在哪里吗?换句话说,在JUNG中使用HTML的可能性和限制是什么? - madewael

5
以下答案假设使用Jung2;我不熟悉早期版本。
Jung的一个优点是它非常可扩展且易于扩展。Jung允许您插入各种变压器(简单的渲染属性)、渲染器(更复杂的渲染)等,以在默认行为不完全正确时自定义行为。这些通常安装在RenderContext上(您可以从VisualizationViewer获取)。
另一方面,它的缺点是复杂性和缺乏良好的文档。如果您要进行任何中度到重度的自定义,则需要深入了解Jung源代码。
例如,可以通过插入新的顶点标签渲染器(Renderer.VertexLabel接口)来自定义顶点标签渲染。例如,您可以实例化BasicVertexLabelRenderer并指定不同的位置(北、西、中心等)。如果您愿意将形状改变为比那个圆形更大的东西,则可以将标签放在中心。为此,请安装自己的顶点形状变换器(Transformer的实例)。或者,您还可以创建自己的自定义实现,该实现在标签文本下方呈现背景。
您还可以安装自己调整过的Renderer.EdgeLabel(请参见Jung的BasicEdgeLabelRenderer)以自定义边缘标签的定位。

2
我认为这只是实现方式,代码的作者可能并不认为这是一个问题。JUNG库是开源的,因此您可以根据需要对其进行更改。
如果您不想更改代码,使标签更易读的简单方法是仅更改标签的颜色,使其与边缘不同。

1
我遇到了边缘标签重叠的同样问题。我使用的一个快速而且不太完美的解决方案是,在字符串值中添加一定长度的空格来定位边缘标签。
//pad some white spaces to value of edge when adding edges to the graph
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2);

当构建二分图时,它将避免边缘标签在中心模糊和重叠。希望这能帮助到你们中的一些人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接