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

Posted

技术标签:

【中文标题】如何在 JUNG 图形可视化中添加自定义顶点标签?【英文标题】:How to add custom vertex labels in JUNG graph visualization? 【发布时间】:2012-03-10 04:06:21 【问题描述】:

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

我在关注Jung 2.0 Tutorial,发现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”之类的标签?

【问题讨论】:

请引用您正在学习的教程。另见Initial Threads 由于您已将SparseMultigraph&lt;V, E&gt; 的泛型定义为SparseMultigraph&lt;Integer, String&gt;,其中顶点的泛型V 为整数,边缘的泛型E 为字符串,因此每个顶点的标签值都是整数,每个边的字符串中的标签。因此,如果您希望每个顶点的名称为 q1、v2 等,请使用 String 作为通用 V,这样您就可以传递一个像 g.addVertex("q1"); 这样的顶点名称 要更改 JUNG 渲染上下文中的默认顶点标签转换器,请搜索关键字 getRenderContext().setVertexLabelTransformer 更多内容:***.com/questions/3288886/…。请注意,这取决于您对顶点和边的泛型定义。如果示例不适合您,请检查示例中使用的泛型类型并根据您的进行修改。 @eee 在SparseMultigraph&lt;V, E&gt; 中将String 用于V 解决了这个问题。谢谢。 【参考方案1】:

由于您将SparseMultigraph&lt;V, E&gt; 的泛型定义为SparseMultigraph&lt;Integer, String&gt;,其中顶点的泛型V 为整数,边缘的泛型E 为String,因此每个顶点的标签值都在Integer 中,并且每个String 中的边缘标签。因此,如果您希望每个顶点的名称为 q1、v2 等,请使用 String 来表示通用 V,这样您就可以传递一个像 g.addVertex("q1"); 这样的顶点名称

【讨论】:

【参考方案2】:

如果你有一个自定义的节点类,我会举一个我项目中的例子。我有一个类节点,就像:

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 属性显示为图中每个节点的标签。 // 我希望这就是你要找的。​​p>

【讨论】:

以上是关于如何在 JUNG 图形可视化中添加自定义顶点标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JUNG 中添加具有相同标签(但端点不同)的两条边?

JUNG:我们如何根据顶点的一些属性进行图聚类?

使用 graphml 和 jung 加载自定义节点和边

用于动态可视化的 Java 图形库 [关闭]

如何获取顶点页面中使用的所有自定义标签信息?

matplotlib可视化之如何给图形添加数据标签?