在JUNG图形可视化中如何添加自定义顶点标签?

7

如何在JUNG图形可视化中使用自定义顶点标签?

我正在遵循Jung 2.0教程,其中我发现setVertexLabelTransformer()可以用于为顶点添加标签,但据我所知这些标签无法自定义。

例如,以下代码生成三个顶点,其顶点标签为1、2、4:

import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseMultigraph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import java.awt.Dimension;
import javax.swing.JFrame;

public class SimpleGraphView {
    Graph<Integer, String> g;

    public SimpleGraphView() {       
        g = new SparseMultigraph<Integer, String>();
        g.addVertex((Integer)1);
        g.addVertex((Integer)2);
        g.addVertex((Integer)4); 
    }

    public static void main(String[] args) {
        SimpleGraphView sgv = new SimpleGraphView(); 
        Layout<Integer, String> layout = new CircleLayout(sgv.g);
        layout.setSize(new Dimension(800,800));  
        BasicVisualizationServer<Integer,String> vv =
            new BasicVisualizationServer<Integer,String>(layout);
        vv.setPreferredSize(new Dimension(850,850)); 

        JFrame frame = new JFrame("Simple Graph View");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(vv); 
        frame.pack();
        frame.setVisible(true);       
    }
}

如何添加类似“q0”的标签?

1
请引用您正在遵循的教程。另请参阅Initial Threads - trashgod
1
由于您将SparseMultigraph<V,E>的泛型定义为SparseMultigraph<Integer,String>,其中用于顶点的泛型V为Integer,边缘的泛型E为String,因此每个顶点的标签值都是Integer,每个边缘的标签是String。所以,如果您想使用像q1、v2等名称表示每个顶点,请使用泛型V的String,这样您就可以像这样传递一个顶点名称:“g.addVertex(“q1”);” - ecle
更多相关信息请查看Stack Overflow:https://dev59.com/questions/L0_Sa4cB1Zd3GeqP-DGk。需要注意的是,这取决于您对顶点和边缘泛型的定义。如果示例无法满足您的需求,请检查示例中使用的泛型类型,并根据您自己的情况进行修改。 - ecle
@eee 在 SparseMultigraph<V, E> 中使用String作为 V 的类型解决了问题。谢谢。 - Dilini
请参考 https://dev59.com/FWDVa4cB1Zd3GeqPfJ0t 的答案。这同样适用于顶点标签。 - Joshua O'Madadhain
显示剩余3条评论
2个回答

5

如果您有用于节点的自定义类,我将从我的项目中给出一个示例。我有一个名为Node的类,它类似于:

public class Node 
{

public long tweetId = 0L;
public long nodeId = 0L;
public String screenName = "";
public Date reTweetDate = new Date();
public boolean isMainNode = false;
public int size = 0;

public Node()
{
}

}

// 您只需要像下面这样覆盖transform:

vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() {
                @Override
                public String transform(Object v) {

                    return ((Node)v).screenName;
                }});

// 它将在图表中的每个节点上显示screenName属性作为标签。 // 希望这正是您所寻找的。


5

由于你已将SparseMultigraph<V,E>的泛型定义为SparseMultigraph<Integer,String>,其中顶点的通用类型 V 是整数,边缘的通用类型 EString ,因此每个顶点的标签值都是一个 Integer ,而每个边的标签都是 String 。因此,如果您想要用类似 q1、v2 等名称对每个顶点进行命名,请使用 String 作为通用类型 V ,这样您可以像这样传递一个顶点名称: g.addVertex("q1");


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