Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the edge weight for force directed layout (CoSE) in cytoscape.js

Tags:

cytoscape.js

  1. I am not sure how best to utilize the edge weight (e.g. strength of interaction between two interacting proteins) while generating a force directed layout using the CoSE plugin in cytoscape.js. Could someone provide any pointers. Should it be "idealEdgeLength" or "edgeElasticity"?

  2. (EDIT) Following is a figure showing what I currently get (A) and what I am trying to achieve (B). Also below are the parameters I used for generating the layout.

Thanks, Datta.

PS: Click to view a figure showing the current (labelled "A") and expected (labelled "B") layouts. Following are layout options for "A".

    var options = {
        name: 'cose',
        // Called on `layoutready`
        ready: function () { },
        // Called on `layoutstop`
        stop: function () { },
        // Whether to animate while running the layout
        animate: true,
        // Number of iterations between consecutive screen positions update (0 -> only updated on the end)
        refresh: 20,
        // Whether to fit the network view after when done
        fit: true,
        // Padding on fit
        padding: 30,
        // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
        boundingBox: undefined,
        componentSpacing: 100,
        // Whether to randomize node positions on the beginning
        randomize: true,
        // Whether to use the JS console to print debug messages
        debug: false,
        // Node repulsion (non overlapping) multiplier
        nodeRepulsion: 400000,
        // Node repulsion (overlapping) multiplier
        nodeOverlap: 10,
        // Ideal edge (non nested) length
        idealEdgeLength: 10,
        // Divisor to compute edge forces
        edgeElasticity: 100,
        // Nesting factor (multiplier) to compute ideal edge length for nested edges
        nestingFactor: 5,
        // Gravity force (constant)
        gravity: 80,
        // Maximum number of iterations to perform
        numIter: 10000,
        // Initial temperature (maximum node displacement)
        initialTemp: 100,
        // Cooling factor (how the temperature is reduced between consecutive iterations
        coolingFactor: 0.95,
        // Lower temperature threshold (below this point the layout will end)
        minTemp: 1.0
    };
like image 772
Datta Mellacheruvu Avatar asked Oct 30 '15 21:10

Datta Mellacheruvu


1 Answers

You can specify functions instead of static numbers for some key CoSE layout settings. The functions take edges (or nodes, in some cases), so you can tailor the layout based on edge properties.

So you could do something like this:

      idealEdgeLength: function (edge) {
        // Default is: 10
        // Instead, base it on "weight"
        return edge.data().weight * .5
      },

      edgeElasticity: function (edge) {
        // Default is: 100
        // Instead, base it on "weight"
        return edge.data().weight * 4
      },

You'll have to experiment with ranges that work with the layout engine and the range of weight you are expecting as input, but that approach should work AOK.

like image 182
peteorpeter Avatar answered Jan 04 '23 12:01

peteorpeter