【发布时间】:2009-09-14 16:40:43
【问题描述】:
我目前正在使用Jung 绘制图表(我的意思是图表而不是图表!)。问题是顶点和边标签与顶点和边重叠。这会导致看起来很奇怪的图表。问题与特定的布局算法无关(尽管我一直在使用 FRLayout)。
是否有可能告诉 JUNG 防止这些重叠?我希望这已经实现了,唯一的问题是找到正确的选择!
【问题讨论】:
我目前正在使用Jung 绘制图表(我的意思是图表而不是图表!)。问题是顶点和边标签与顶点和边重叠。这会导致看起来很奇怪的图表。问题与特定的布局算法无关(尽管我一直在使用 FRLayout)。
是否有可能告诉 JUNG 防止这些重叠?我希望这已经实现了,唯一的问题是找到正确的选择!
【问题讨论】:
你只需要设置标签偏移量:
vv.getRenderContext().setLabelOffset(20);
vv 是您的 VisualizationViewer 对象。
【讨论】:
顺便说一句,如果您确实想更改颜色,起初看起来很痛苦。但我最近发现了这个小技巧:
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);
【讨论】:
(以下答案假设 Jung2;我对 pre-Jung2 不熟悉)。
Jung 的优势之一是它非常可扩展,并且很容易扩展。 Jung 允许您插入各种转换器(简单的渲染属性)、渲染器(更复杂的渲染)等等,以在默认值不太正确时自定义行为。这些通常安装在 RenderContext 上(您可以从 VisualizationViewer 中获取)。
另一方面,它的缺点是其复杂性和缺乏体面的文档。如果您要进行任何中度到重度自定义,则需要深入研究 Jung 源代码。
例如,可以通过插入新的顶点标签渲染器(Renderer.VertexLabel 接口)来自定义顶点标签渲染。例如,您可以实例化 BasicVertexLabelRenderer 并指定不同的位置(北、西、中心等)。如果您愿意将形状更改为大于该圆圈的形状,则可以将标签放在中心(为此,请安装您自己的顶点形状转换器——Transformer 的一个实例)。或者,您可以创建自己的此接口的自定义实现,在标签文本下呈现背景。
您还可以安装自己的 Renderer.EdgeLabel 调整版本(请参阅 Jung 的 BasicEdgeLabelRenderer)来自定义边缘标签的位置。
【讨论】:
我认为这就是它的实现方式,代码的作者可能不认为这是一个问题。 JUNG 库是开源的,因此欢迎您根据需要对其进行更改。
如果您不想更改代码,使标签更具可读性的简单解决方法是简单地更改标签的颜色,使其与边缘不同。
【讨论】:
我也遇到过边缘标签重叠的问题。我用来定位边缘标签的一个快速而肮脏的解决方案是在字符串值中用空格填充一定长度。
//pad some white spaces to value of edge when adding edges to the graph
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2);
它将避免边缘标签在中心出现模糊和重叠,尤其是在构建二分图时。希望这对你们中的一些人有所帮助!
【讨论】: