2009-09-14 111 views
6

我目前使用Jung繪製圖形(我的意思是圖形不是圖表!)。問題是頂點和邊緣標籤與頂點和邊緣重疊。這導致了奇怪的外觀圖。這個問題沒有被綁定到一個特定的佈局算法(儘管我一直在使用FRLayout)。JUNG(Java Graph):如何防止頂點和邊緣標籤重疊?

有沒有可能告訴JUNG防止這些重疊?我希望這已經實施,唯一的問題是找到正確的選擇!

回答

5

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

Jung的優勢之一是它具有很強的擴展性,並且易於擴展。 Jung允許你插入各種變換器(簡單的渲染屬性),渲染器(更復雜的渲染)等等,以在缺省不正確時自定義行爲。這些通常安裝在RenderContext上(可以從VisualizationViewer中獲得)。

另一方面,它的缺點是它的複雜性和缺乏體面的文檔。如果你打算做任何中度到重度的定製,你需要挖掘Jung的來源。

例如,可以通過插入新的頂點標籤渲染器(Renderer.VertexLabel接口)來定製頂點標籤渲染。例如,您可以實例化BasicVertexLabelRenderer並指定不同的位置(北,西,中心等)。你可以把你的標籤,在該中心,如果你願意改變形狀到的東西比大圈(這樣做,安裝自己的頂點形狀變壓器 - 變壓器的一個實例)。或者,您可以創建您自己的此接口的自定義實現,從而在標籤文本下呈現背景。

您還可以安裝Renderer.EdgeLabel你自己扭捏版本(見榮格的BasicEdgeLabelRenderer)來定製邊標籤的定位。

2

我認爲這只是它的實現方式,代碼的作者可能並不認爲它是一個問題。 JUNG圖書館是開放源代碼的,因此歡迎您根據需要對其進行更改。

如果您不想更改代碼,那麼只需更改標籤的顏色即可輕鬆修改標籤的顏色,使其與邊緣不同。

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 2014-11-24 08:43:37

7

你只需要設置標籤偏移:

vv.getRenderContext().setLabelOffset(20); 

VV是你VisualizationViewer對象。

1

我曾經遇到過邊的標籤同樣的問題重疊。我用來定位邊緣標籤的一個快速和骯髒的解決方案是用字符串值中的空白填充一定的長度。

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

這樣可以避免邊緣標籤在中心發生混濁和重疊,特別是在構建二分圖時。希望這可以幫助你們中的一些人!