Gephi可視化(二)——Gephi Toolkit叫板Prefuse


  繼在園子里寫的《Gephi可視化(一)——使用Gephi Toolkit創建Gephi應用》介紹了如何使用Gephi Toolkit工具集進行可視化編程后,本篇對Gephi Toolkit進行一個詳盡的介紹,了解其工作原理以及與Gephi應用程序之間的差異,Gephi Toolkit對於平台的要求使用方法,最后通過比較可視化工具集Prefuse,列舉兩種可視化工具之間的相似之處。

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

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

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

  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平台開發的)。

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

 

  下面我們還是通過走代碼的形式一探Gephi Toolkit

  1.創建項目是必不可少的環節,值得一提的是,Gephi支持多工作空間,這個類似於Linux的多個工作區(即桌面)的機制(聽說Win10也支持這種多桌面的效果了)。Gephi中不同的Workspace的同時進行不同圖形的展示與操作。

  代碼如下:

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

  

  2.通過Lookup全局類,得到各個對象的操作模型或控制器(個人感覺Lookup采用的是反射的原理獲得類的對象,沒有深究)

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中。

//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布局,設置執行時間為一分鍾。

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設置展示的參數,如是否顯示節點上的標簽、邊的顏色粗細等。

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作用相似,通過代碼

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. 微信

 

                      

 


免責聲明!

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



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