【问题标题】:Gephi graph layoutGephi 图形布局
【发布时间】:2014-12-28 10:46:41
【问题描述】:

我正在尝试使用以下 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)会产生相同的图形,但会随机绘制。图表:

【问题讨论】:

    标签: java layout graph jframe gephi


    【解决方案1】:

    自发布此问题以来已经有相当长的时间了,希望您还没有在寻找解决方案,但如果您是:

    您需要将 layout.goAlgo() 方法包围在 for 循环中,以执行将节点放置到位所需的步骤。您可以试验获得您喜欢的首选布局所需的迭代次数。

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2011-10-17
      相关资源
      最近更新 更多