Gephi可視化(二)

  繼在園子裏寫的《Gephi可視化(一)——使用Gephi Toolkit建立Gephi應用》介紹瞭如何使用Gephi Toolkit工具集進行可視化編程後,本篇對Gephi Toolkit進行一個詳盡的介紹,瞭解其工做原理以及與Gephi應用程序之間的差別,Gephi Toolkit對於平臺的要求使用方法,最後經過比較可視化工具集Prefuse,列舉兩種可視化工具之間的類似之處。html

  Gephi Toolkit是一個標準的java類庫,任何java工程均可以引入使用(包括eclipse、netbeans等),該類庫中包含了Gephi中必要的模塊,如Graph、Layout、Filters、IO等。java

  該工具包只有一個jar文件,能夠在java應用中使用,其保留了Gephi的絕大部分特性。git

  官網主頁:           http://gephi.github.io/toolkit/github

  GitHub主頁:      https://github.com/gephi/gephi-toolkit-demos算法

 

  工做原理:編程

  Gephi是基於模塊化的思想設計的,其真正的體現了高內聚低耦合的思想。每一個模塊負責不一樣的職責,好比有專門負責圖形結構的Graph,有專門用於佈局的Layout。這裏的Gephi Toolkit就是剝離了Gephi源碼中的user interfaces modules(用戶界面模塊),並可以保證程序正常運行的工具集,這也正是該工具集存在的意義。經過下圖咱們能夠大體瞭解Gephi以及Gephi Toolkit之間的關係:微信

從圖中看出,也正是剝離了與Netbeans的依賴模塊,才使得Gephi Toolkit也能夠在Eclipse或是MyEclipse中運行(Gephi是基於Netbeans平臺開發的)。app

Gephi Toolkit從0.8版本開始就添加了預覽功能,能夠保證在編寫可視化需求代碼後經過PreviewController類進行可視化展示,並支持縮放。dom

 

  下面咱們仍是經過走代碼的形式一探Gephi Toolkiteclipse

  1.建立項目是必不可少的環節,值得一提的是,Gephi支持多工做空間,這個相似於Linux的多個工做區(即桌面)的機制(據說Win10也支持這種多桌面的效果了)。Gephi中不一樣的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.經過Lookup全局類,獲得各個對象的操做模型或控制器(我的感受Lookup採用的是反射的原理得到類的對象,沒有深究)

1
2
3
GraphModel graphModel = Lookup.getDefault().lookup(GraphController. class ).getModel();
PreviewModel model = Lookup.getDefault().lookup(PreviewController. class ).getModel();
PreviewController previewController = Lookup.getDefault().lookup(PreviewController. class );

  GraphModel比如存放整個圖形元素的容器,包括節點、邊、標籤等信息;PreviewModel等於得到了一個如何進行預覽展示的操做入口。

 

  3.在工做空間中導入數據,不一樣於上篇中直接讀取數據文件,這裏採用生成隨機圖形的方法,定義隨機生成節點個數500,邊與邊連線的機率爲0.005,並用Container容器進行接收數據;使用導入接口控制器將Container加載到工做空間Workspace中。

1
2
3
4
5
6
7
8
9
10
//Generate a new random graph into a container
Container container = Lookup.getDefault().lookup(ContainerFactory. class ).newContainer();
RandomGraph randomGraph =  new  RandomGraph();
randomGraph.setNumberOfNodes( 500 );
randomGraph.setWiringProbability( 0.005 );
randomGraph.generate(container.getLoader());
          
//Append container to graph structure
ImportController importController = Lookup.getDefault().lookup(ImportController. class );
importController.process(container,  new  DefaultProcessor(), workspace);

  

  4.經過自動化佈局類AutoLayout向其中添加各類佈局算法。這裏前後分別加入了ForceAtlasLayout佈局以及YifanHuLayout佈局,設置執行時間爲一分鐘。

1
2
3
4
5
6
7
8
9
AutoLayout autoLayout =  new  AutoLayout( 1 , TimeUnit.MINUTES);
autoLayout.setGraphModel(graphModel);
YifanHuLayout firstLayout =  new  YifanHuLayout( null new  StepDisplacement(1f));
ForceAtlasLayout secondLayout =  new  ForceAtlasLayout( null );
AutoLayout.DynamicProperty adjustBySizeProperty = AutoLayout.createDynamicProperty( "forceAtlas.adjustSizes.name" , Boolean.TRUE,  0 .1f); //True after 10% of layout time
AutoLayout.DynamicProperty repulsionProperty = AutoLayout.createDynamicProperty( "forceAtlas.repulsionStrength.name" , new  Double( 500 .), 0f); //500 for the complete period
autoLayout.addLayout(firstLayout,  0 .5f);
autoLayout.addLayout(secondLayout,  0 .5f,  new  AutoLayout.DynamicProperty[]{adjustBySizeProperty, repulsionProperty});
autoLayout.execute();

  經過查看AutoLayout類的源碼,咱們發現autoLayout.addLayout()方法中的autoLayout其實就是一個List集合。

 

  5.說了這麼多,咱們作可視化的仍是須要眼見爲實,能夠經過PreviewModel設置展現的參數,如是否顯示節點上的標籤、邊的顏色粗細等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
model.getProperties().putValue(PreviewProperty.NODE_LABEL_COLOR,  new  DependantOriginalColor(Color.WHITE));
model.getProperties().putValue(PreviewProperty.EDGE_COLOR,  new  EdgeColor(Color.WHITE));
model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS,  new  Float( 0 .1f));    model.getProperties().putValue(PreviewProperty.BACKGROUND_COLOR, Color.BLACK);
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 );

  

  全部須要的參數配置好後,將其添加到JFrame進行界面化展現。

  程序運行過程當中的圖片:

         

         

         

  從圖形能夠看出分別執行了YifanHuLayout和ForceAtlasLayout佈局。

 

  看完Gephi Toolkit在構建圖形、添加布局效果、展示圖形的過程,仍是忍不住拿來和Prefuse對比下,雖然有些類的名稱不一樣,可是在處理手法上都有殊途同歸之妙,下面簡單列出幾點類似:

  1.Workspace(Gephi)和Visualization(Prefuse)

  Prefuse中的Visualization是一個數據中心,因此的數據最終要聚集到數據中心中,包括圖形的結構、如何渲染、佈局的添加等等;Gephi的Workspace也是一個內部頂級容器,與Visualizaiton做用類似,經過代碼

1 previewController.refreshPreview();

  進入refreshPreview()方法能夠發現也是更新Workspace對象,也就是更新其中的數據。

 

  2.GraphModel(Gephi)和VisualGraph(Prefuse)

  Prefuse中的VisualGraph是指完成了從Graph到數據中心中的Graph的過程,其在原始的Graph圖形上添加了節點或邊以及其餘元素如何最終繪製出來,包含了不少關於最終繪製的配置元素;Gephi的GraphModel也是得到了對於Graph的操做對象,利用它能夠對Graph進行想要的操做

 

  3.AutoLayout(Gephi)和ActionList(Prefuse)

  Prefuse中的ActionList是一個List集合,經過這個容器能夠向其中添加許多的Action(即各類展現效果或約束);Gephi中的AutoLayout也是相似的數據接口,經過查找方法autoLayout.addLayout()的源碼,發現也是將想要的佈局添加到一個List集合中。

  固然,兩款工具集的相同點不只限於於此,同時,二者之間也還有不少的差別,具體細節歡迎加入公告欄左側羣討論。

  如覺有用,歡迎點贊,您的點贊與鼓勵是我不斷前行的動力!

  本文連接:《Gephi可視化(二)——Gephi Toolkit叫板Prefuse

 

友情贊助

 

若是你以爲博主的文章對你那麼一點小幫助,恰巧你又有想打賞博主的小衝動,那麼事不宜遲,趕忙掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。

 

    1. 支付寶                          2. 微信

 

                      

相關文章
相關標籤/搜索