2017-05-03 5 views
0

그래프를 시각화하기 위해 Jung 라이브러리를 사용하기 시작했습니다. 현재 주요 문제는 내 정점에 레이블/메타 데이터를 설정하는 방법을 모른다는 것입니다. 정점의 특정 속성에 따라 정점을 다르게 색칠하고 싶습니다. Node 클래스의 객체에는 추가 Integer-value가 포함되어 있으며, 정점에 대한 추가 속성 (getGroup()에 의해)으로 추가하고 싶습니다. 다음 코드는 각 노드의 getId() - 문자열 만 시각화합니다.Jung 라이브러리를 사용하는 정점 레이블

권장 사항은 무엇입니까?

메인 클래스 내 다음 코드를

Graph<String,Double> g = new SparseGraph<String,Double>(); 
    List<Link> linkList = new ArrayList<Link>(); 
    List<Node> nodeList = new ArrayList<Node>(); 
    linkList = f.getLinks(); 
    nodeList = f.getNodes(); 
    for(Node nodeElement:nodeList){ 
     g.addVertex(nodeElement.getId()); 
    } 
    for(Link linkElement:linkList){ 
     g.addEdge(linkElement.getValue(), linkElement.getSource(), linkElement.getTarget()); 
    } 

    VisualizationImageServer vs = 
       new VisualizationImageServer(
       new SpringLayout(g), new Dimension(500, 500)); 

    vs.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() { 
     public String transform(Object v) { 
      return Integer.toString(((Node)v).getGroup()); 
     } 
    }); 

    JFrame frame = new JFrame(""); 
    frame.getContentPane().add(vs); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

답변

0

당신은 당신이 사용하고 JUNG의 버전을 지정하지 않았지만, 당신이 바로 일반적인 생각이있어 : (setVertexLabelTransformer 전화를)와 노드를 렌더링하려는 문자열로 변환하는 함수입니다.

그렇다면 작성한 코드에는 몇 가지 문제가 있으며 위에 인용 된 코드로보고 된 동작을 어떻게 얻고 있는지 잘 모르겠습니다.

(0) 왜 Node이 아닌 노드 ID를 꼭지점으로 추가하는지 이해할 수 없습니다. Link 노드 ID 또는 Node의 끝 점이 있습니까? 어떤 경우에도 Node을 추가하지 않으면 코드에서 정점 그룹을 사용할 수 있다고 예상되는 방법이 작성된 것으로 분명하지 않습니다.

(1) 그래프의 정점은 Node이 아니라 노드 ID이지만, transform()에 전달 된 정점 개체는 Node으로 전송 중입니다. 나는 이것이 ClassCastException을 던질 것을 기대합니다.

(2) 꼭지점이 실제로 Node 개의 객체라고 가정해도, 그룹에있는 꼭지점 ID가 레이블에 표시된다는 사실에 놀랐습니다. 당신은 정점 레이블에서 요구하는 것이 그룹입니다; 나는 ID가 전혀 나타나지 않을 것이라고 기대한다.

즉, 꼭지점이 Node 개의 개체이고 여러 요소가 나타나기를 원한다면 매우 쉽습니다. Node 개체에서 원하는 것을 수행하는 함수를 제공하면됩니다.
* 해당 기능이 toString() 인 경우 ToStringLabeller을 사용할 수 있습니다 (실제로는 기본값이어야하므로 지정할 필요가 없습니다). 그 아래에 더. * 그 함수 인 경우 (예를 들어) getLabel()를, 다음이 (자바 8) 작동합니다 : 당신이

자바 (8)를 사용하지 않는 경우

// either of these should work 
setVertexLabelTransformer(Node::getLabel()) 
setVertexLabelTransformer(v -> v.getLabel())  

하거나 익명의 내부 클래스 일을 할 수 이 아니면 Node 개체가되어야하므로 노드에 정점 개체 (노드 ID)를 매핑하는 방법 (예 : Map<String, Node>)을 제공 한 다음 변환하는 함수에 해당 맵을 제공해야합니다 레이블에 대한 정점 :

setVertexLabelTransformer(v -> labelToNode.get(v).getLabel()) 

참고 : ToStringLabeller()은 일반적으로 transform() 메서드를 재정의하지 않아야합니다. 객체 자체의 toString()을 레이블로 사용하도록 지정합니다.

// These two are equivalent 
setVertexLabelTransformer(v -> v.toString()) 
setVertexLabelTransformer(new ToStringLabeller()) 

는 힌트를

+0

감사 (말할 필요도없이, ToStringLabeller() 자바 (8) : 선행). 나는 정 2.1.1을 사용하고 있는데, 최신 버전이다. 함수를 구현 (재정의)하여 새 함수를 정의합니다. 이제는 작동하지만 약 500 노드의 성능으로 인해 8GB RAM 노트북에 약간의 문제가 발생합니다. – Matzka