I've tried for days to apply the ForceAtlas layout in my project (based on the demo "RankingGraph.java" from https://github.com/gephi/gephi-toolkit-demos), but all I get are stacked points.
Can I get some help?
My class:
Code: Select all
/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.toolkit.demos;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import org.gephi.appearance.api.AppearanceController;
import org.gephi.appearance.api.AppearanceModel;
import org.gephi.appearance.api.Function;
import org.gephi.appearance.plugin.RankingElementColorTransformer;
import org.gephi.appearance.plugin.RankingLabelSizeTransformer;
import org.gephi.appearance.plugin.RankingNodeSizeTransformer;
import org.gephi.graph.api.Column;
import org.gephi.graph.api.DirectedGraph;
import org.gephi.graph.api.GraphController;
import org.gephi.graph.api.GraphModel;
import org.gephi.io.exporter.api.ExportController;
import org.gephi.io.importer.api.Container;
import org.gephi.io.importer.api.EdgeDirectionDefault;
import org.gephi.io.importer.api.ImportController;
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.forceAtlas.ForceAtlasLayout;
import org.gephi.preview.api.PreviewController;
import org.gephi.preview.api.PreviewModel;
import org.gephi.preview.api.PreviewProperty;
import org.gephi.project.api.ProjectController;
import org.gephi.project.api.Workspace;
import org.gephi.statistics.plugin.GraphDistance;
import org.openide.util.Lookup;
/**
* The demo shows how to do ranking, transform colors and size according to
* degree or attribute values.
* <p>
* The following ranking are applied to the imported network:
* <ul><li>Rank node colors by degree</li>
* <li>Rank node size by Betweenness Centrality metric</li>
* <li>Rank label size by Betweenness Centrality</li>
* </ul>
* An interpolation can be set to transformers, see
* <code>setInterpolator()</code> on transformers.
*
* @author Mathieu Bastian
*/
public class RankingGraph {
public void script() {
//Init a project - and therefore a workspace
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
pc.newProject();
Workspace workspace = pc.getCurrentWorkspace();
//Get controllers and models
ImportController importController = Lookup.getDefault().lookup(ImportController.class);
GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getGraphModel();
AppearanceController appearanceController = Lookup.getDefault().lookup(AppearanceController.class);
AppearanceModel appearanceModel = appearanceController.getModel();
//Import file
Container container;
try {
File file = new File(getClass().getResource("/org/gephi/toolkit/demos/lesmiserables.gml").toURI());
container = importController.importFile(file);
container.getLoader().setEdgeDefault(EdgeDirectionDefault.DIRECTED); //Force DIRECTED
} catch (Exception ex) {
ex.printStackTrace();
return;
}
//Append imported data to GraphAPI
importController.process(container, new DefaultProcessor(), workspace);
//See if graph is well imported
DirectedGraph graph = graphModel.getDirectedGraph();
System.out.println("Nodes: " + graph.getNodeCount());
System.out.println("Edges: " + graph.getEdgeCount());
//Rank color by Degree
Function degreeRanking = appearanceModel.getNodeFunction(graph, AppearanceModel.GraphFunction.NODE_DEGREE, RankingElementColorTransformer.class);
RankingElementColorTransformer degreeTransformer = (RankingElementColorTransformer) degreeRanking.getTransformer();
degreeTransformer.setColors(new Color[]{new Color(0xFEF0D9), new Color(0xB30000)});
degreeTransformer.setColorPositions(new float[]{0f, 1f});
appearanceController.transform(degreeRanking);
//Get Centrality
GraphDistance distance = new GraphDistance();
distance.setDirected(true);
distance.execute(graphModel);
//Rank size by centrality
Column centralityColumn = graphModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS);
Function centralityRanking = appearanceModel.getNodeFunction(graph, centralityColumn, RankingNodeSizeTransformer.class);
RankingNodeSizeTransformer centralityTransformer = (RankingNodeSizeTransformer) centralityRanking.getTransformer();
centralityTransformer.setMinSize(3);
centralityTransformer.setMaxSize(10);
appearanceController.transform(centralityRanking);
//Rank label size - set a multiplier size
Function centralityRanking2 = appearanceModel.getNodeFunction(graph, centralityColumn, RankingLabelSizeTransformer.class);
RankingLabelSizeTransformer labelSizeTransformer = (RankingLabelSizeTransformer) centralityRanking2.getTransformer();
labelSizeTransformer.setMinSize(1);
labelSizeTransformer.setMaxSize(10);
appearanceController.transform(centralityRanking2);
//Set 'show labels' option in Preview - and disable node size influence on text size
PreviewModel previewModel = Lookup.getDefault().lookup(PreviewController.class).getModel();
previewModel.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
previewModel.getProperties().putValue(PreviewProperty.NODE_LABEL_PROPORTIONAL_SIZE, Boolean.FALSE);
//Run ForceAtlasLayout for 100 passes - The layout always takes the current visible view
ForceAtlasLayout layout1 = new ForceAtlasLayout(null);
layout1.setGraphModel(graphModel);
layout1.initAlgo();
layout1.resetPropertiesValues();
for (int i = 0; i < 100 && layout1.canAlgo(); i++) {
layout1.goAlgo();
}
layout1.endAlgo();
//Export
ExportController ec = Lookup.getDefault().lookup(ExportController.class);
try {
ec.exportFile(new File("ranking.pdf"));
} catch (IOException ex) {
ex.printStackTrace();
return;
}
}
}