Skip to content

Layouts

Guide to available layout algorithms and configuration.

Overview

Layout algorithms determine how nodes are positioned in the visualization. Choose the right layout based on your graph's structure and what you want to communicate.

Available Layouts

LayoutTypeBest ForDimensions
ngraphForce-directedGeneral graphs2D/3D
d3-forceForce-directedWeb-standard2D
circularGeometricCycles, small graphs2D/3D
gridGeometricRegular structures2D/3D
hierarchicalLayeredTrees, DAGs2D/3D
randomRandomTesting, initial state2D/3D
fixedManualPre-computed positions2D/3D

Setting a Layout

Via HTML Attribute

html
<graphty-element layout="ngraph"></graphty-element>
<graphty-element layout="circular"></graphty-element>

Via JavaScript

typescript
// Simple layout change
graph.setLayout('circular');

// With configuration options
graph.setLayout('ngraph', {
  springLength: 100,
  springCoefficient: 0.0008,
  gravity: -1.2,
  dimensions: 3
});

Layout Descriptions

ngraph (Force-Directed)

The default layout. Uses physics simulation where:

  • Edges act like springs pulling connected nodes together
  • Nodes repel each other to prevent overlap
  • Works well for most general graphs
typescript
graph.setLayout('ngraph', {
  springLength: 100,        // Ideal edge length
  springCoefficient: 0.0008, // Spring stiffness
  gravity: -1.2,            // Global attraction/repulsion
  dimensions: 3,            // 2 or 3
  dragCoefficient: 0.02,    // Damping
  theta: 0.8                // Barnes-Hut approximation
});

d3-force (Force-Directed)

D3's force simulation. Industry-standard for web visualizations:

typescript
graph.setLayout('d3-force', {
  strength: -30,           // Node repulsion
  distance: 50,            // Link distance
  iterations: 300          // Simulation steps
});

circular

Arranges nodes in a circle. Good for:

  • Small graphs
  • Cycle detection
  • Ring topologies
typescript
graph.setLayout('circular', {
  radius: 100,            // Circle radius
  startAngle: 0,          // Starting angle (radians)
  endAngle: Math.PI * 2   // Ending angle
});

grid

Arranges nodes in a regular grid:

typescript
graph.setLayout('grid', {
  columns: 5,             // Number of columns
  spacing: 10             // Space between nodes
});

hierarchical

Tree-like layout for directed graphs:

typescript
graph.setLayout('hierarchical', {
  direction: 'TB',        // TB, BT, LR, RL
  levelSeparation: 100,   // Vertical spacing
  nodeSeparation: 50      // Horizontal spacing
});

random

Random positions. Useful for:

  • Testing
  • Initial state before force layout
  • Deliberate chaos visualization
typescript
graph.setLayout('random', {
  seed: 42,               // For reproducible layouts
  dimensions: 3
});

fixed

Use pre-computed positions from node data:

typescript
// Node data includes positions
const nodes = [
  { id: 'a', x: 0, y: 0, z: 0 },
  { id: 'b', x: 100, y: 0, z: 0 },
  { id: 'c', x: 50, y: 100, z: 0 }
];

await graph.addNodes(nodes);
graph.setLayout('fixed');

Layout Transitions

Animate between layouts for smooth visual transitions:

typescript
// Current layout
graph.setLayout('random');
await graph.waitForSettled();

// Transition to new layout
graph.setLayout('circular', {}, {
  animate: true,
  duration: 1000
});

Waiting for Settled

Force-directed layouts converge over time. Wait for stabilization:

typescript
graph.setLayout('ngraph');

// Wait for physics to settle
await graph.waitForSettled();

// Now safe to zoom to fit
graph.zoomToFit();

You can also listen to the event:

typescript
graph.on('graph-settled', () => {
  console.log('Layout complete');
  graph.zoomToFit();
});

2D vs 3D

Most layouts support both dimensions:

typescript
// 3D layout (default)
graph.setLayout('ngraph', { dimensions: 3 });

// 2D layout
graph.setLayout('ngraph', { dimensions: 2 });

For 2D layouts, also set the view mode:

html
<graphty-element layout="d3-force" view-mode="2d"></graphty-element>

Performance Tips

  1. Large graphs: Use Barnes-Hut approximation (ngraph with default theta)
  2. Initial state: Start with random layout, then switch to force-directed
  3. Fixed data: Pre-compute positions and use fixed layout
  4. Incremental updates: Add nodes in batches, not one at a time

Custom Layouts

Create your own layout algorithms. See Custom Layouts for details.

Interactive Examples