開源免費跨平臺基于JVM的復雜網絡分析軟件Gephi簡介
Gephi是一款開源免費跨平臺基于JVM的復雜網絡分析軟件, 其主要用于各種網絡和復雜系統, 特別是在處理網絡關系數據這方面很有優勢,下面是兩個不錯的例子
- 編程語言關系圖 </ul>
<repositories> <repository> <id>gephi-snapshots</id> <name>Gephi Snapshots</name> <url>http://nexus.gephi.org/nexus/content/repositories/snapshots/</url> </repository> <repository> <id>gephi-releases</id> <name>Gephi Releases</name> <url>http://nexus.gephi.org/nexus/content/repositories/releases/</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.gephi</groupId> <artifactId>gephi-toolkit</artifactId> <version>0.8.2</version> </dependency> </dependencies>
添加依賴完成之后,可以參考這個 slide 熟悉一下API
布局算法
布局算法是圖算法的一大部分, 常用的有 Force-directed_graph_drawing 力導向算法, 其基本思想是:
- 對網絡狀態進行初始化
- 計算每次迭代局部區域內,兩兩節點間的斥力所產生的單位位移(一般為正值)
- 計算每次迭代每條邊的引力對兩端節點所產生的單位位移(一般為負值)
- 上面兩步中的斥力和引力系數直接影響到最終態的理想效果,它與節點間的距離、節點在系統所在區域的平均單位區域均有關,需要開發人員在實踐中不斷調整
- 累加所有節點的單位位移,結合單次最大移動距離確定每個節點新的位置
- 迭代n次,達到最優效果 </ul>
gephi-tookit中也自帶了幾種布局算法, 而且易于使用, 如果你的數據源是數據庫, 可以參考 這個例子 ,當然也可以純手工構建一個圖, 示例代碼如下所示:
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); pc.newProject(); Workspace workspace = pc.getCurrentWorkspace();//Generate a new random graph into a container Container container = Lookup.getDefault().lookup(ContainerFactory.class).newContainer();
GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); DirectedGraph graph = graphModel.getDirectedGraph();
Node n0 = graphModel.factory().newNode("n0"); n0.getNodeData().setLabel("n0"); Node n1 = graphModel.factory().newNode("n1"); n1.getNodeData().setLabel("n1"); Edge edge = graphModel.factory().newEdge(n0, n1, 1f, true);
graph.addNode(n0); graph.addNode(n1); graph.addEdge(edge);
for(int i = 0 ; i < 100; i++) { Node ntmp = graphModel.factory().newNode("tmp" + i); Edge edgetmp = graphModel.factory().newEdge(n0, ntmp, 1f, true);
graph.addNode(ntmp); graph.addEdge(edgetmp); }
System.out.println("Nodes: " + graph.getNodeCount()); System.out.println("Edges: " + graph.getEdgeCount());
//Layout for 15 seconds AutoLayout autoLayout = new AutoLayout(20, TimeUnit.SECONDS); 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.9f); autoLayout.addLayout(secondLayout, 0.1f, new AutoLayout.DynamicProperty[]{adjustBySizeProperty, repulsionProperty}); autoLayout.execute();
//Export pdf & gexf ExportController ec = Lookup.getDefault().lookup(ExportController.class); try {
File pdfFile = new File("/tmp/data.pdf"); File gexfFile = new File("/tmp/data.gexf"); pdfFile.getParentFile().mkdirs(); gexfFile.getParentFile().mkdirs(); ec.exportFile(pdfFile); ec.exportFile(gexfFile);
} catch (IOException ex) { ex.printStackTrace(); }</pre>
其中導出的 gexf 數據文件可以用于 sigmajs的展示
參考資料
- http://gephi.github.io/
- http://www.slideshare.net/gephi/gephi-toolkit-tutorialtoolkit
- https://github.com/gephi/gephi/wiki/How-to-code-with-the-Toolkit
</ol>THE END
聲明: 本文 “Gephi簡介” 采用 CC BY-NC-SA 4.0 協議進行授權.
轉載請注明原文地址: http://stackbox.org/2015-08-about-gephi/index.html