[英]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.