JUNG(자바 그래프):정점 및 가장자리 레이블이 겹치는 것을 방지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1422665

  •  07-07-2019
  •  | 
  •  

문제

나는 현재 사용하고 있습니다 그래프를 그리는 것입니다(실제로는 차트가 아니라 그래프를 의미합니다!).문제는 Vertex 및 Edge Label이 Vertex 및 Edge와 겹치는 것입니다.이로 인해 이상하게 보이는 그래프가 나타납니다.문제는 특정 레이아웃 알고리즘에 국한되지 않습니다(FRLayout을 사용하고 있지만).

이러한 중복을 방지하도록 JUNG에게 지시할 가능성이 있습니까?나는 이것이 이미 구현되기를 바랐으며 유일한 문제는 올바른 옵션을 찾는 것입니다!

도움이 되었습니까?

해결책

(다음 답변은 Jung2를 가정합니다.pre-Jung2)에 대해서는 잘 모르겠습니다.

Jung의 장점 중 하나는 확장성이 매우 뛰어나고 쉽게 확장할 수 있다는 점입니다.Jung을 사용하면 다양한 변환기(간단한 렌더링 속성), 렌더러(보다 복잡한 렌더링) 등을 연결하여 기본값이 올바르지 않을 때 동작을 사용자 정의할 수 있습니다.이는 일반적으로 RenderContext(VisualizationViewer에서 얻을 수 있음)에 설치됩니다.

반면에 단점은 복잡성과 적절한 문서가 부족하다는 것입니다.중간 수준에서 높은 수준의 사용자 정의를 수행하려면 Jung 소스를 자세히 조사해야 합니다.

예를 들어, 새로운 정점 레이블 렌더러(Renderer.VertexLabel 인터페이스)를 연결하여 정점 레이블 렌더링을 사용자 정의할 수 있습니다.예를 들어 BasicVertexLabelRenderer를 인스턴스화하고 다른 위치(북쪽, 서쪽, 중앙 등)를 지정할 수 있습니다.모양을 해당 원보다 더 큰 것으로 변경하려는 경우 레이블을 중앙에 배치할 수 있습니다. 이렇게 하려면 자체 정점 모양 변환기(Transformer 인스턴스)를 설치하십시오.또는 레이블 텍스트 아래에 배경을 렌더링하는 이 인터페이스의 사용자 정의 구현을 직접 만들 수 있습니다.

또한 자신만의 조정된 Renderer.EdgeLabel 버전(Jung의 BasicEdgeLabelRenderer 참조)을 설치하여 가장자리 라벨의 위치를 ​​맞춤 설정할 수도 있습니다.

다른 팁

레이블 오프셋을 설정하면됩니다.

vv.getRenderContext().setLabelOffset(20);

어디에 VV 너의 시각화 뷰어 물체.

그건 그렇고, 당신이 색상을 바꾸고 싶다면 처음에는 큰 고통 인 것 같습니다. 그러나 나는 최근 에이 작은 트릭을 발견했습니다.

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);

나는 이것이 구현 된 방식이라고 생각합니다. 코드의 저자는 아마도 그것을 문제로 보지 못할 것입니다. Jung Library는 오픈 소스이므로 적합한대로 변경할 수 있습니다.

코드를 변경하지 않으려면 레이블을 더 읽기 쉽게 만드는 데 쉽게 수정되면 라벨의 색상을 간단히 변경하여 가장자리와 다릅니다.

에지 라벨이 겹치는 것과 동일한 문제가 발생했습니다. 가장자리 라벨을 배치하는 데 사용한 빠르고 더러운 솔루션은 문자열 값의 흰색 공간으로 특정 길이를 패딩하는 것입니다.

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

특히 양자당 그래프를 만들 때 중앙에서 흐리고 중심에서 겹치는 가장자리 라벨을 피할 수 있습니다. 이것이 여러분 중 일부를 도와주기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top