開源免費跨平臺基于JVM的復雜網絡分析軟件Gephi簡介

jopen 9年前發布 | 37K 次閱讀 Gephi Java開發

Gephi是一款開源免費跨平臺基于JVM的復雜網絡分析軟件, 其主要用于各種網絡和復雜系統, 特別是在處理網絡關系數據這方面很有優勢,下面是兩個不錯的例子

  • 編程語言關系圖
  • </ul>

    開源免費跨平臺基于JVM的復雜網絡分析軟件Gephi簡介

    • 微博傳播分析
    • </ul>

      開源免費跨平臺基于JVM的復雜網絡分析軟件Gephi簡介

      那么,我們拿到圖數據后, 應該如何畫出這個圖表呢?

      圖表繪制

      通過分析上面兩個例子的代碼可知,前端插件用的都是 sigma.js ,但是在展示網絡數據的時候插件并不會自動的對節點和邊進行布局,需要通過后臺傳給前臺數據文件,常用的有兩種格式 jsongexf

      雖然gephi是一個gui程序,但是它提供了一套叫 gephi-toolkit 的東西,可以方便的編程化方式處理數據, 首先加入gephi倉庫并引入依賴

      <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的展示

        參考資料

        1. http://gephi.github.io/
        2. http://www.slideshare.net/gephi/gephi-toolkit-tutorialtoolkit
        3. https://github.com/gephi/gephi/wiki/How-to-code-with-the-Toolkit
        4. </ol>

          THE END

          聲明: 本文 “Gephi簡介” 采用 CC BY-NC-SA 4.0 協議進行授權.

          轉載請注明原文地址: http://stackbox.org/2015-08-about-gephi/index.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!