Skip to content

Instantly share code, notes, and snippets.

@MoritzStefaner
Created August 22, 2012 09:02
Show Gist options
  • Save MoritzStefaner/3423911 to your computer and use it in GitHub Desktop.
Save MoritzStefaner/3423911 to your computer and use it in GitHub Desktop.

Revisions

  1. MoritzStefaner created this gist Aug 22, 2012.
    174 changes: 174 additions & 0 deletions gistfile1.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,174 @@

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.net.URISyntaxException;

    import org.gephi.data.attributes.api.AttributeController;
    import org.gephi.data.attributes.api.AttributeModel;
    import org.gephi.filters.api.FilterController;
    import org.gephi.graph.api.DirectedGraph;
    import org.gephi.graph.api.Edge;
    import org.gephi.graph.api.GraphController;
    import org.gephi.graph.api.GraphModel;
    import org.gephi.graph.api.Node;
    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.processor.plugin.DefaultProcessor;
    import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2;
    import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2LayoutData;
    import org.gephi.preview.api.PreviewController;
    import org.gephi.preview.api.PreviewModel;
    import org.gephi.project.api.ProjectController;
    import org.gephi.project.api.Workspace;
    import org.gephi.ranking.api.RankingController;
    import org.joda.time.field.OffsetDateTimeField;
    import org.openide.util.Lookup;

    import com.itextpdf.text.Font;

    import processing.core.PApplet;
    import processing.core.PFont;
    import processing.core.PVector;

    public class GACNetworkApp extends PApplet {

    private GraphModel graphModel;
    private ForceAtlas2 layout;
    private float maxY = -10000;
    private float minX = 10000;
    private float minY = 10000;
    private float maxX = -10000;
    private PFont regularFont;

    @Override
    public void setup() {
    size(1000, 1000, OPENGL);

    regularFont = loadFont("HelveticaNeue-Medium-48.vlw");

    //Init a project - and therefore a workspace
    ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
    pc.newProject();
    Workspace workspace = pc.getCurrentWorkspace();

    //Get models and controllers for this new workspace - will be useful later
    AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController.class).getModel();
    graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
    PreviewModel model = Lookup.getDefault().lookup(PreviewController.class).getModel();
    ImportController importController = Lookup.getDefault().lookup(ImportController.class);
    FilterController filterController = Lookup.getDefault().lookup(FilterController.class);
    RankingController rankingController = Lookup.getDefault().lookup(RankingController.class);

    //Import file
    Container container = null;

    File file = null;
    try {
    file = new File(getClass().getResource("/<your gephi file>.gexf").toURI());
    } catch (URISyntaxException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    container = importController.importFile(file);
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED); //Force DIRECTED

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

    layout = new ForceAtlas2(null);
    layout.setGraphModel(graphModel);
    layout.resetPropertiesValues();

    layout.setOutboundAttractionDistribution(false);
    ((ForceAtlas2) layout).setEdgeWeightInfluence(1.5d);
    ((ForceAtlas2) layout).setGravity(10d);
    ((ForceAtlas2) layout).setJitterTolerance(.02);
    ((ForceAtlas2) layout).setScalingRatio(15.0);
    layout.initAlgo();
    }

    @Override
    public void draw() {
    background(255);
    textFont(regularFont);
    noStroke();

    minX = 10000;
    minY = 10000;
    maxX = -10000;
    maxY = -10000;

    float x1, x2, y1, y2, w;

    for (Node n : graphModel.getDirectedGraph().getNodes()) {

    minX = Math.min(minX, n.getNodeData().x());
    maxX = Math.max(maxX, n.getNodeData().x());
    minY = Math.min(minY, n.getNodeData().y());
    maxY = Math.max(maxY, n.getNodeData().y());

    }

    for (Node n : graphModel.getDirectedGraph().getNodes()) {
    x1 = x(n.getNodeData().x());
    y1 = y(n.getNodeData().y());
    w = (float) Math.sqrt(1.0f * (Integer) n.getNodeData().getAttributes().getValue("Weighted In-Degree"));

    fill(30, w * 10 + 90);

    ellipse(x1, y1, 5, 5);
    textSize((int) (1.5f * w + 3));
    String l = n.getNodeData().getAttributes().getValue("label").toString();
    float offset = map(x1 - width * .5f, width * .5f, -width * .5f, 0f, textWidth(l));
    text(l, x1 - offset, y1 - 2);
    ((ForceAtlas2LayoutData) n.getNodeData().getLayoutData()).mass = 1 + w * 5;
    }

    layout.goAlgo();

    PVector normal = new PVector();

    for (Edge e : graphModel.getDirectedGraph().getEdges()) {

    x1 = x(e.getEdgeData().getSource().x());
    x2 = x(e.getEdgeData().getTarget().x());
    y1 = y(e.getEdgeData().getSource().y());
    y2 = y(e.getEdgeData().getTarget().y());

    normal.set(y2 - y1, -(x2 - x1), 0f);
    normal.normalize();

    w = (Float) e.getEdgeData().getAttributes().getValue("weight");

    beginShape();
    fill(90, 80, 70, w * 30);

    vertex(x2 + normal.x * w, y2 + normal.y * w);
    vertex(x1, y1);
    vertex(x2 - normal.x * w, y2 - normal.y * w);
    endShape(CLOSE);
    }

    }

    private float x(float x) {
    return map(x, minX, maxX, 50, width - 100);
    }

    private float y(float y) {
    return map(y, minY, maxY, 50, height - 100);
    }

    }