【问题标题】:Using the library JUNG graphs使用库 JUNG 图
【发布时间】:2013-08-20 09:28:53
【问题描述】:

我使用JUNG java库来管理图,我想知道如何用相同的颜色为连接的节点着色以区分连接的组件。

例如,知道邻接矩阵为:

0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0

创建图形的代码(节点颜色相同):

 Graph<Integer, String> g;
/** Creates a new instance of SimpleGraphView */
public ReadFile(int nbsommet,int [] [] nodeMat) {
    // Graph<V, E> where V is the type of the vertices and E is the type of the edges
    // Note showing the use of a SparseGraph rather than a SparseMultigraph
    g = new SparseGraph<Integer, String>();
    // Add some vertices. From above we defined these to be type Integer.
    /*for (int i = 1; i <=nbsommet; i++) {
        g.addVertex((Integer)i);

    }*/
       for (int i = 1; i <=nbsommet; i++)
       {  g.addVertex((Integer)i);
           for (int j = 1; j<=nbsommet; j++) 
           {
               if((nodeMat[i][j]==1)&& (j>i))
               {   if(!(g.getVertices().contains(j)))
               { g.addVertex((Integer)j);}
                   g.addEdge(i+" "+j, i, j);
                   }

    }}}
//...
  ReadFile sgv = new ReadFile(nbsommet,nodeMatfinal); // This builds the graph
  //Design sgv1 = new Design(); 
    Layout<Integer, String> layout = new KKLayout (sgv.g);
    //TreeLayout  layout = new TreeLayout(sgv.g,100,100);
    layout.setSize(new Dimension(800,800));  
    BasicVisualizationServer<Integer, String> vv = new   BasicVisualizationServer<Integer, String>(layout);

    Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() {
        public Paint transform(Integer i) {
            return (Paint) Color.GREEN;
        }
    };  

    vv.setPreferredSize(new Dimension(850,850));
    vv.getRenderContext().setVertexLabelRenderer(new        DefaultVertexLabelRenderer(Color.green));
    vv.getRenderContext().setEdgeDrawPaintTransformer(new ConstantTransformer(Color.white));
    vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f)));

    vv.getRenderContext().setVertexFillPaintTransformer((Transformer<Integer, java.awt.Paint>) vertexPaint);
    vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow));

    vv.setBackground(Color.gray);
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>());
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);


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

那么如何更改此代码以使连接的组件具有不同的颜色

【问题讨论】:

  • @user2699285 使用 JUNG 有问题吗?你试过什么了?请附上您的代码。

标签: java jung


【解决方案1】:

JUNG 库不允许您为每个顶点设置不同的渲染器,因此您可以使用一个渲染器并在其中放置一些逻辑。 (我从this SO post 得到这个想法)。

您现在必须确定哪些顶点应该获得哪些颜色,并将其放入方法调用或Map&lt;Integer, Color&gt;。我会假设后者:

final Map<Integer,Color> colorMapping = new HashMap<Integer, Color>();

// .....

Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() 
{
    public Paint transform(Integer i)
    {
        return colorMapping.get(i.intValue());
    }
};

显然这留下了如何填写colorMapping的问题。
您需要确定哪些是邻接矩阵中的连通分量;这是一个单独的问题,已在 this StackOverflow post 中处理。
一旦你有了单独的子图,剩下要做的就是为它们分配颜色,并相应地填充colorMapping


关于您的代码示例的几点说明:

  1. 我不得不评论这个呼吁:

    vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer&lt;Integer&gt;(vv.getPickedVertexState(), Color.green, Color.yellow));

    它设置了一个新的 PaintTransformer 来替换调用 vertexPaint 的那个。

  2. 您的图形初始化是从 1 开始的,但数组是从 0 开始的。你应该改变

    if((nodeMat[i][j]==1)&amp;&amp; (j&gt;i))

    进入

    if((nodeMat[i-1][j-1]==1)&amp;&amp; (j&gt;i))

    否则你会得到一个 ArrayIndexOutOfBoundsException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多