Skip to main content

The fastest ForceAtlas2 algorithm for Python (and NetworkX)

Project description

ForceAtlas2 for Python and NetworkX

A port of Gephi's Force Atlas 2 layout algorithm to Python 2 and Python 3 (with a wrapper for NetworkX). This is the fastest python implementation available with most of the features complete. It also supports Barnes Hut approximation for maximum speedup.

ForceAtlas2 is a very fast layout algorithm for force directed graphs. The implementation is based on this paper and the corresponding gephi-java-code. Its really quick compared to the fruchterman reingold algorithm (spring layout) of networkx and scales well to high number of nodes (>10000).

Spatialize a random Geometric Graph

Geometric Graph

Installation

Install from pip:

pip install fa2

To build and install run from source:

python setup.py install

Cython is highly recommended if you are buidling from source as it will speed up by a factor of 10-100x depending on the graph

Dependencies

  • numpy (adjacency matrix as complete matrix)
  • scipy (adjacency matrix as sparse matrix)
  • tqdm (progressbar)
  • Cython (10-100x speedup)
  • networkx (To use the NetworkX wrapper function, you obviously need NetworkX)

Spatialize a 2D Grid

Grid Graph

Usage

from fa2 import ForceAtlas2

Create a ForceAtlas2 object with the appropriate settings. ForceAtlas2 class contains two important methods:

forceatlas2 (G, pos, iterations)
# G is a graph in 2D numpy ndarray format (or) scipy sparse matrix format
# pos is a numpy array (Nx2) of initial positions of nodes
# iterations is num of iterations to run the algorithm
forceatlas2_networkx_layout(G, pos, iterations)
# G is networkx graph
# pos is a dictionary, as in networkx
# iterations is num of iterations to run the algorithm

Below is an example usage. You can also see the feature settings of ForceAtlas2 class.

import networkx as nx
from fa2 import ForceAtlas2
import matplotlib.pyplot as plt

G = nx.random_geometric_graph(400, 0.2)

forceatlas2 = ForceAtlas2(
                        # Behavior alternatives
                        outboundAttractionDistribution=True,  # Dissuade hubs
                        linLogMode=False,  # NOT IMPLEMENTED
                        adjustSizes=False,  # Prevent overlap (NOT IMPLEMENTED)
                        edgeWeightInfluence=1.0,

                        # Performance
                        jitterTolerance=1.0,  # Tolerance
                        barnesHutOptimize=True,
                        barnesHutTheta=1.2,
                        multiThreaded=False,  # NOT IMPLEMENTED

                        # Tuning
                        scalingRatio=2.0,
                        strongGravityMode=False,
                        gravity=1.0,

                        # Log
                        verbose=True)

positions = forceatlas2.forceatlas2_networkx_layout(G, pos=None, iterations=2000)
nx.draw_networkx_nodes(G, positions, node_size=20, with_labels=False, node_color="blue", alpha=0.4)
nx.draw_networkx_edges(G, positions, edge_color="green", alpha=0.05)
plt.axis('off')
plt.show()

You can also take a look at forceatlas2.py file for understanding the ForceAtlas2 class and its functions better.

Features Completed

  • barnesHutOptimize: Barnes Hut optimization, n2 complexity to n.ln(n)
  • gravity: Attracts nodes to the center. Prevents islands from drifting away
  • Dissuade Hubs: Distributes attraction along outbound edges. Hubs attract less and thus are pushed to the borders
  • scalingRatio: How much repulsion you want. More makes a more sparse graph
  • strongGravityMode: A stronger gravity view
  • jitterTolerance: How much swinging you allow. Above 1 discouraged. Lower gives less speed and more precision
  • verbose: Shows a progressbar of iterations completed. Also, shows time taken for different force computations
  • edgeWeightInfluence: How much influence you give to the edges weight. 0 is "no influence" and 1 is "normal"

Documentation

You will find all the documentation in the source code

Contributors

Contributions are highly welcome. Please submit your pull requests and become a collaborator.

Copyright

Copyright (C) 2017 Bhargav Chippada bhargavchippada19@gmail.com.
Licensed under the GNU GPLv3.

The files are heavily based on the java files included in Gephi, git revision 2b9a7c8 and Max Shinn's port to python of the algorithm. Here I include the copyright information from those files:

Copyright 2008-2011 Gephi
Authors : Mathieu Jacomy <mathieu.jacomy@gmail.com>
Website : http://www.gephi.org
Copyright 2011 Gephi Consortium. All rights reserved.
Portions Copyrighted 2011 Gephi Consortium.
The contents of this file are subject to the terms of either the
GNU General Public License Version 3 only ("GPL") or the Common
Development and Distribution License("CDDL") (collectively, the
"License"). You may not use this file except in compliance with
the License.

<https://github.com/mwshinn/forceatlas2-python>
Copyright 2016 Max Shinn <mws41@cam.ac.uk>
Available under the GPLv3

Also, thanks to Eugene Bosiakov <https://github.com/bosiakov/fa2l>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fa2-0.3.4.tar.gz (385.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fa2-0.3.4-cp37-cp37m-win_amd64.whl (149.6 kB view details)

Uploaded CPython 3.7mWindows x86-64

File details

Details for the file fa2-0.3.4.tar.gz.

File metadata

  • Download URL: fa2-0.3.4.tar.gz
  • Upload date:
  • Size: 385.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.2

File hashes

Hashes for fa2-0.3.4.tar.gz
Algorithm Hash digest
SHA256 959c146374100821a344de08a21663975d5c0936973e0bf8736121f83f845587
MD5 ef9ed05ad739ea2812bffdb429f3ae2d
BLAKE2b-256 2c87c085b4fc3e84a4622de703a1281e15e4f34ce33b7799fea28e2b7d4a9d4f

See more details on using hashes here.

File details

Details for the file fa2-0.3.4-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: fa2-0.3.4-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 149.6 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.2

File hashes

Hashes for fa2-0.3.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 48bbd2621d1229d2cc025fd4b06ff63259604400e1d997ffbeffec3e816c5cc4
MD5 7fcd246a6c73d9008212163ebe89d576
BLAKE2b-256 85db71b050d862f97609ad6f24f27b5062a348d68fbfd8fdf0065041e2b1881e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page