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

发布于 2025-01-06 16:25:44 字数 1573 浏览 1 评论 0原文

如何在 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”等标签?

How to use custom vertex labels in JUNG graph visualization?

I am following Jung 2.0 Tutorial where I found that setVertexLabelTransformer() can be used to label the vertices, but these labels cannot be customized, to my knowledge.

For example, the below code produces three vertices, having vertex-labels 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);       
    }
}

How do I add labels like "q0"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

奈何桥上唱咆哮 2025-01-13 16:25:44

由于您已将 SparseMultigraph 的泛型定义为 SparseMultigraph,其中顶点的泛型 V 为 Integer,边的通用 E 为 String,因此每个顶点的标签值采用 Integer 格式,每条边的标签采用 String 格式。因此,如果您希望每个顶点的名称如 q1、v2 等,请使用 String 表示通用 V,这样您就可以传递像这样的顶点名称 g .addVertex("q1");

Since you have defined the generics of SparseMultigraph<V, E> as SparseMultigraph<Integer, String> where the generic V for vertex as Integer and the generic E for edge as String, hence each vertex's label value is in Integer and each edge's label in String. So, if you want each vertex by names like q1, v2, etc., use String for generic V, so you can pass a vertex name like this g.addVertex("q1");

自此以后,行同陌路 2025-01-13 16:25:44

如果您有节点的自定义类,我将给出我的项目中的示例。我有一个 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()
{
}

}

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

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

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

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

If you have a custom class for nodes, I will give an example from my project. I have a class Node which is like :

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()
{
}

}

// You just need to override transform like below:

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

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

// It will show the screenName property as a label for each node in the graph.
// I hope this is what you are looking for.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文