簡體   English   中英

Gephi圖布局

[英]Gephi graph layout

我正在嘗試使用以下Jframe源代碼為我的圖找到最佳(最佳外觀)布局:

package org.gephi.toolkit.demos;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;

import org.gephi.graph.api.*;
import org.gephi.io.database.drivers.MySQLDriver;
import org.gephi.io.importer.api.Container;
import org.gephi.io.importer.api.EdgeDefault;
import org.gephi.io.importer.api.ImportController;
import org.gephi.io.importer.plugin.database.EdgeListDatabaseImpl;
import org.gephi.io.importer.plugin.database.ImporterEdgeList;
import org.gephi.io.processor.plugin.DefaultProcessor;
import org.gephi.layout.plugin.force.StepDisplacement;
import org.gephi.layout.plugin.force.yifanHu.YifanHuLayout;
import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2;
import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2Builder;
import org.gephi.layout.plugin.random.Random;
import org.gephi.layout.plugin.random.RandomLayout;
import org.gephi.preview.api.PreviewController;
import org.gephi.preview.api.PreviewModel;
import org.gephi.preview.api.PreviewProperty;
import org.gephi.preview.api.ProcessingTarget;
import org.gephi.preview.api.RenderTarget;
import org.gephi.preview.types.DependantOriginalColor;
import org.gephi.project.api.ProjectController;
import org.gephi.project.api.Workspace;
import org.openide.util.Lookup;
import org.gephi.toolkit.demos.NodeRenderer2;

import processing.core.PApplet;

/**
 * This demo shows basic features from GraphAPI, how to create and query a graph
 * programmatically.
 * 
 * @author Mathieu Bastian
 */
public class TestGraph  {


public void script() {

    ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
    pc.newProject();
    Workspace workspace = pc.getCurrentWorkspace();

    // import graph from DB
    EdgeListDatabaseImpl db = new EdgeListDatabaseImpl();
    db.setDBName("sn");
    db.setHost("localhost");
    db.setUsername("nirre");
    db.setPasswd("guMli5ic");
    db.setSQLDriver(new MySQLDriver());
    //db.setSQLDriver(new PostgreSQLDriver());
    //db.setSQLDriver(new SQLServerDriver());
    db.setPort(3306);
    db.setNodeQuery("select distinct kp.key as ID, kp.phrase as LABEL from sn.key_phrases1 kp inner join edges_demo e on e.source = kp.key or e.target = kp.key union select distinct kp.key as ID, kp.phrase as LABEL from sn.key_phrases1 kp inner join edges_demo e on e.source = kp.key or e.target = kp.key");
    db.setEdgeQuery("select * from edges_demo");
    ImporterEdgeList edgeListImporter = new ImporterEdgeList();
    ImportController importController = Lookup.getDefault().lookup(ImportController.class);
    Container container = importController.importDatabase(db, edgeListImporter);
    container.setAllowAutoNode(false);      //Don't create missing nodes
    container.getLoader().setEdgeDefault(EdgeDefault.UNDIRECTED);   //Force UNDIRECTED

    importController.process(container, new DefaultProcessor(), workspace);
    GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();

    /*RandomLayout layout = new RandomLayout(new Random(),1500);
    layout.setGraphModel(graphModel);
    layout.initAlgo();
    layout.goAlgo();
    layout.endAlgo();
    ForceAtlas2Builder layout_fa2_builder = new ForceAtlas2Builder();
    ForceAtlas2 layout_fa2 = new ForceAtlas2(layout_fa2_builder);
    layout_fa2.setGraphModel(graphModel);
    layout_fa2.resetPropertiesValues();
    layout_fa2.initAlgo();
    layout_fa2.goAlgo();
    layout_fa2.endAlgo();*/
    YifanHuLayout layout_yifan = new YifanHuLayout(null, new StepDisplacement(1f));
    layout_yifan.setGraphModel(graphModel);
    layout_yifan.resetPropertiesValues();
    layout_yifan.initAlgo();
    layout_yifan.goAlgo();
    layout_yifan.endAlgo();
    //Preview configuration
    PreviewController previewController = Lookup.getDefault().lookup(PreviewController.class);
    PreviewModel previewModel = previewController.getModel();

    previewModel.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
    previewModel.getProperties().putValue(PreviewProperty.NODE_LABEL_COLOR, new DependantOriginalColor(Color.WHITE));
    previewModel.getProperties().putValue(PreviewProperty.EDGE_CURVED, Boolean.FALSE);
    previewModel.getProperties().putValue(PreviewProperty.EDGE_OPACITY, 50);
    previewModel.getProperties().putValue(PreviewProperty.EDGE_RADIUS, 10f);
    previewModel.getProperties().putValue(PreviewProperty.BACKGROUND_COLOR, Color.BLACK);
    //previewController.refreshPreview();

    NodeRenderer2 nr2 = new NodeRenderer2();
    MyMouseListener ml = new MyMouseListener();
    nr2.needsPreviewMouseListener(ml);
    //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);
    previewController.refreshPreview();
      //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);
    target.refresh();
    target.resetZoom();

    /*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);*/
}

public static void main(String[] args) {
    TestGraph previewJFrame = new TestGraph();
    previewJFrame.script();
    }
}

但是,不同的布局(Random Layout,ForceAtlas 2和Yifan Hu)會產生相同的圖形,但會隨機繪制。 該圖:

在此處輸入圖片說明

此問題發布已經過去了很長時間,希望您仍在尋找解決方案,但是如果您是:

您需要在for循環中包圍layout.goAlgo()方法,以執行將節點放置到位所需的步驟。 您可以嘗試獲得所需的首選布局所需的迭代次數。

layout_yifan.resetPropertiesValues();<br>
layout_yifan.initAlgo();

    int iterations = Math.pow(numberOfNodes, 2);

    for(int i = 0; i < iterations && layout.canAlgo(); i++) {
        layout_yifan.goAlgo();
    }

    layout.endAlgo();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM