Gephi可視化(一)——使用Gephi Toolkit創建Gephi應用


  在Prefuse上摸打滾爬了一段時間,發現其和藹可親,容易上手。但是每每在打開gephi,導入數據再運行時,總還是在心里暗自贊嘆gephi的絢爛之極,無與匹敵,當然,gephi也有自己的缺陷,但是gephi是一個在發展的、進步的、不斷壯大的開源軟件。縱使她曾經那般傷我,我仍是對其戀戀不舍,好吧,我已經病入膏肓。。。。。

 

  言歸正傳,Gephi是一款開源免費跨平台基於JVM的復雜網絡分析軟件, 其主要用於各種網絡和復雜系統,動態和分層圖的交互可視化與探測開源工具。可用作:探索性數據分析,鏈接分析,社交網絡分析,生物網絡分析等。因為Gephi是開源軟件,所以可以獲取其源碼,允許開發者去擴展和重復使用。

Gephi開發平台:Netbeans平台(因為之前對於這句話理解不深,在eclipse環境下浪費了不少時間)

開發語言:Java

可視化引擎:OpenGL

Gephi官網:    http://gephi.github.io/

Gephi的視頻介紹:   http://v.youku.com/v_show/id_XMjU5MDUwMjg4.html

Gephi API幫助文檔:https://gephi.org/docs/api/

Gephi Toolkit:   http://gephi.github.io/toolkit/

Gephi 論壇:     https://forum.gephi.org/

 

  貼上gephi做的兩張圖:

                                                                           

 

  現在,我們就深入Gephi,好好了解下這個strong visual tool,這次我們不走源碼,作為過來人,我還是想提醒下,如果java功底不是很扎實或是不太熟悉Netbeans開發平台以及Swing編程知識的可以走曲線,接近Gephi,否則會讓自己焦頭爛額,越陷越深,不可自拔^_^。下面通過一個實例,講解如果新建一個Gephi實例,進行可視化展示:

  (1)創建一個project、一個workspace,這是必做的工作,是進行后續操作的前提:

1
2
3
4
//Init a project - and therefore a workspace
ProjectController pc = Lookup.getDefault().lookup(ProjectController. class );
pc.newProject();
Workspace workspace = pc.getCurrentWorkspace();

  

  (2)得到該空間的各個模型以及控制器,方便后面使用:

1
2
3
4
5
6
7
//Get models and controllers for this new workspace - will be useful later
AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController. class ).getModel();
GraphModel graphModel = Lookup.getDefault().lookup(GraphController. class ).getModel();
PreviewModel model = Lookup.getDefault().lookup(PreviewController. class ).getModel();
ImportController importController = Lookup.getDefault().lookup(ImportController. class );
FilterController filterController = Lookup.getDefault().lookup(FilterController. class );
RankingController rankingController = Lookup.getDefault().lookup(RankingController. class );

  

  (3)導入數據,使用Container接收,並將數據導入到空間中:

1
2
3
4
5
6
7
8
9
10
11
12
//Import file      
Container container;
try  {
     File file =  new  File(getClass().getResource( "/org/gephi/toolkit/demos/resources/polblogs.gml" ).toURI());
     container = importController.importFile(file);
     container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED);    //Force DIRECTED
catch  (Exception ex) {
     ex.printStackTrace();
     return ;
}       
//Append imported data to GraphAPI
importController.process(container,  new  DefaultProcessor(), workspace);

  

  (4)通過打印信息,驗證圖形數據是否導入成功:

1
2
3
4
//See if graph is well imported
DirectedGraph graph = graphModel.getDirectedGraph();
System.out.println( "Nodes: "  + graph.getNodeCount());
System.out.println( "Edges: "  + graph.getEdgeCount());

 

  (5)對圖形數據進行過濾操作:

1
2
3
4
5
6
7
//Filter     
DegreeRangeFilter degreeFilter =  new  DegreeRangeFilter();
degreeFilter.init(graph);
degreeFilter.setRange( new  Range( 30 , Integer.MAX_VALUE));      //Remove nodes with degree < 30
Query query = filterController.createQuery(degreeFilter);
GraphView view = filterController.filter(query);
graphModel.setVisibleView(view);     //Set the filter result as the visible view

  

  (6)通過打印信息,驗證過濾操作是否起作用:

1
2
3
4
//See visible graph stats
UndirectedGraph graphVisible = graphModel.getUndirectedGraphVisible();
System.out.println( "Nodes: "  + graphVisible.getNodeCount());
System.out.println( "Edges: "  + graphVisible.getEdgeCount());

  

  (7)執行YifanHuLayout布局算法:

1
2
3
4
5
6
7
8
9
10
11
//Run YifanHuLayout for 100 passes - The layout always takes the current visible view
YifanHuLayout layout =  new  YifanHuLayout( null new  StepDisplacement(1f));
layout.setGraphModel(graphModel);
layout.resetPropertiesValues();
layout.setOptimalDistance(200f);
layout.initAlgo();
  
for  ( int  i =  0 ; i <  100  && layout.canAlgo(); i++) {
     layout.goAlgo();
}
layout.endAlgo();

  

  (8)根據節點度值分配節點顏色:

1
2
3
4
5
//Rank color by Degree
Ranking degreeRanking = rankingController.getModel().getRanking(Ranking.NODE_ELEMENT, Ranking.DEGREE_RANKING);
AbstractColorTransformer colorTransformer = (AbstractColorTransformer) rankingController.getModel().getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_COLOR);
colorTransformer.setColors( new  Color[]{ new  Color( 0xFEF0D9 ),  new  Color( 0xB30000 )});
rankingController.transform(degreeRanking,colorTransformer);

  

 

  (9)分配節點大小:

1
2
3
4
5
6
7
//Rank size by centrality
AttributeColumn centralityColumn = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS);
Ranking centralityRanking = rankingController.getModel().getRanking(Ranking.NODE_ELEMENT, centralityColumn.getId());
AbstractSizeTransformer sizeTransformer = (AbstractSizeTransformer) rankingController.getModel().getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_SIZE);
sizeTransformer.setMinSize( 3 );
sizeTransformer.setMaxSize( 10 );
rankingController.transform(centralityRanking,sizeTransformer);

  

  (10)預覽效果配置,並呈現到Display上,添加到JFrame,進行界面話展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Preview
PreviewController previewController = Lookup.getDefault().lookup(PreviewController. class );
         model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
model.getProperties().putValue(PreviewProperty.EDGE_COLOR,  new  EdgeColor(Color.GRAY));
model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS,  new  Float( 0 .1f));
model.getProperties().putValue(PreviewProperty.NODE_LABEL_FONT, model.getProperties().getFontValue(PreviewProperty.NODE_LABEL_FONT).deriveFont( 8 ));
previewController.refreshPreview();
          
//New Processing target, get the PApplet
ProcessingTarget target = (ProcessingTarget) previewController.getRenderTarget(RenderTarget.PROCESSING_TARGET);
PApplet applet = target.getApplet();
applet.init();
//Refresh the preview and reset the zoom
previewController.render(target);
target.refresh();
target.resetZoom();
//Add the applet to a JFrame and display
JFrame frame =  new  JFrame( "Test Preview" );
frame.setLayout( new  BorderLayout());
         
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(applet, BorderLayout.CENTER);
         
frame.pack();
frame.setVisible( true );

 

  控制台打印信息為:

1
2
3
4
5
6
# Nodes loaded: 1490
# Edges loaded: 19025
Nodes: 1490
Edges: 19025
Nodes: 397
Edges: 10599

  執行的結果如下圖所示:

了解Prefuse的API以及創建一個Prefuse應用的思路詳見《漫談可視化Prefuse(二)---一分鍾學會Prefuse》,再回首看Gephi Toolkit創建gephi應用的思路也是如出一轍,后續有時間將繼續Gephi Toolkit之旅!

如果覺得有用,歡迎點贊^_^!也歡迎加入公告欄的可視化群。

本文鏈接:《Gephi可視化(一)——使用Gephi Toolkit創建Gephi應用

 

 

友情贊助

 

如果你覺得博主的文章對你那么一點小幫助,恰巧你又有想打賞博主的小沖動,那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。

 

    1. 支付寶                          2. 微信

 

                      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM