我使用JUNG java库来管理图形,我想知道如何用相同颜色为连接的节点着色以区分连接的组件。
例如,我希望节点2
,3
和4
具有相同的颜色,节点1
具有另一种颜色,知道邻接矩阵是:
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);
那么如何更改此代码以使连接的组件具有不同的颜色
答案 0 :(得分:1)
JUNG库不允许您为每个顶点设置不同的渲染器,因此您使用一个渲染器并在其中放置一些逻辑。 (我从this SO post)得到了这个想法。
您现在必须确定哪些顶点应该获取哪些颜色,并将其放在方法调用或Map<Integer, Color>
中。我将假设后者:
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
。
关于代码示例的一些注意事项:
我不得不对此电话发表评论:
vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow));
它设置了一个新的PaintTransformer,它取代了调用vertexPaint
的那个。
您的图表初始化是从1开始的,但数组是从0开始的。你应该改变
if((nodeMat[i][j]==1)&& (j>i))
到
if((nodeMat[i-1][j-1]==1)&& (j>i))
或者你会得到一个ArrayIndexOutOfBoundsException。