Reputation: 147
I want to set the edge length with the weight in my data.json.
Like in the cytoscape-spread demo the edge length should be longer depending on the weight.
"data" : {
"id" : "1965",
"source" : "108",
"target" : "149",
"shared_name" : "A (interacts with) B",
"shared_interaction" : "interacts with",
"name" : "A (interacts with) B",
"interaction" : "interacts with",
"SUID" : 1965,
"weight" : 342,
"selected" : false
},
"selected" : false
The weighting is the count how often A and B stands together in my text-corpus.
I tried different layouts but don't now how i can change the position, that the highest weight has the shortest distance.
At the moment i try to use the 'cose' Layout and set idealEdgeLength: function( edge ){ return edge.data('weight'); }
var options = {
name: 'cose',
// Called on `layoutready`
ready: function(){},
// Called on `layoutstop`
stop: function(){},
// Whether to animate while running the layout
animate: true,
// 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,
// Randomize the initial positions of the nodes (true) or use existing positions (false)
randomize: false,
// Ideal edge (non nested) length
idealEdgeLength: function( edge ){ return edge.data('weight'); },
};
cy.layout( options );
And cola.js edgeLength:
name: 'cola',
animate: true, // whether to show the layout as it's running
refresh: 1, // number of ticks per frame; higher is faster but more jerky
maxSimulationTime: 4000, // max length in ms to run the layout
ungrabifyWhileSimulating: false, // so you can't drag nodes during layout
fit: true, // on every layout reposition of nodes, fit the viewport
padding: 0, // padding around the simulation
boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
// layout event callbacks
ready: function(){}, // on layoutready
stop: function(){}, // on layoutstop
// positioning options
randomize: false, // use random node positions at beginning of layout
avoidOverlap: true, // if true, prevents overlap of node bounding boxes
handleDisconnected: true, // if true, avoids disconnected components from overlapping
nodeSpacing: function( node ){ return 10; }, // extra spacing around nodes
flow: undefined, // use DAG/tree flow layout if specified, e.g. { axis: 'y', minSeparation: 30 }
alignment: undefined, // relative alignment constraints on nodes, e.g. function( node ){ return { x: 0, y: 1 } }
// different methods of specifying edge length
// each can be a constant numerical value or a function like `function( edge ){ return 2; }`
edgeLength: function( edge ){var len = parseInt(edge.data('weight')); return len; }, // sets edge length directly in simulation
edgeSymDiffLength: undefined, // symmetric diff edge length in simulation
edgeJaccardLength: undefined, // jaccard edge length in simulation
// iterations of cola algorithm; uses default values on undefined
unconstrIter: undefined, // unconstrained initial layout iterations
userConstIter: undefined, // initial layout iterations with user-specified constraints
allConstIter: undefined, // initial layout iterations with all constraints including non-overlap
// infinite layout options
infinite: false // overrides all other options for a forces-all-the-time mode
Upvotes: 1
Views: 1416
Reputation: 12242
If you want nodes to be pulled closer together if the edge weight is high, then the edge length needs to be inversely proportional to the weight, e.g. k / edge.data('weight')
for some constant k
. You'll have to experiment to find which k
value works best for your data.
Take a look at the Cola demo source for an example. It uses this exact approach, and the slider just changes the k
value.
http://js.cytoscape.org/demos/2ebdc40f1c2540de6cf0/
Upvotes: 1