Interactive graph visualization for Python notebooks using anywidget
Project description
anywidget-graph
Interactive graph visualization for Python notebooks.
Works with Marimo, Jupyter, VS Code, Colab, anywhere anywidget runs.
Features
- Universal — One widget, every notebook environment
- Backend-agnostic — Grafeo, Neo4j, NetworkX, pandas, or raw dicts
- Interactive — Pan, zoom, click, expand neighbors, select paths
- Customizable — Colors, sizes, shapes, layouts
- Performant — Virtualized rendering for large graphs
- Exportable — PNG, SVG, JSON
Installation
uv add anywidget-graph
Quick Start
from anywidget_graph import Graph
graph = Graph.from_dict({
"nodes": [
{"id": "alice", "label": "Alice", "group": "person"},
{"id": "bob", "label": "Bob", "group": "person"},
{"id": "paper", "label": "Graph Theory", "group": "document"},
],
"edges": [
{"source": "alice", "target": "bob", "label": "knows"},
{"source": "alice", "target": "paper", "label": "authored"},
]
})
graph
Data Sources
Dictionary
from anywidget_graph import Graph
graph = Graph.from_dict({
"nodes": [{"id": "a"}, {"id": "b"}],
"edges": [{"source": "a", "target": "b"}]
})
Grafeo
from grafeo import GrafeoDB
from anywidget_graph import Graph
db = GrafeoDB()
db.execute("INSERT (:Person {name: 'Alice'})-[:KNOWS]->(:Person {name: 'Bob'})")
result = db.execute("MATCH (a)-[r]->(b) RETURN a, r, b")
graph = Graph.from_grafeo(result)
Neo4j
from neo4j import GraphDatabase
from anywidget_graph import Graph
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
with driver.session() as session:
result = session.run("MATCH (a)-[r]->(b) RETURN a, r, b LIMIT 100")
graph = Graph.from_neo4j(result)
NetworkX
import networkx as nx
from anywidget_graph import Graph
G = nx.karate_club_graph()
graph = Graph.from_networkx(G)
pandas
import pandas as pd
from anywidget_graph import Graph
edges = pd.DataFrame({
"source": ["alice", "alice", "bob"],
"target": ["bob", "carol", "carol"],
"weight": [1.0, 0.5, 0.8]
})
graph = Graph.from_pandas(edges)
Interactivity
Events
graph = Graph.from_dict(data)
@graph.on_node_click
def handle_node(node_id, node_data):
print(f"Clicked: {node_id}")
@graph.on_edge_click
def handle_edge(edge_id, edge_data):
print(f"Edge: {edge_data['label']}")
Selection
graph.selected_nodes # Get current selection
graph.select(["alice"]) # Select nodes
graph.clear_selection() # Clear
Expansion
graph.expand("alice") # Show neighbors
graph.collapse("alice") # Hide neighbors
Styling
By Group
graph = Graph.from_dict(
data,
node_styles={
"person": {"color": "#4CAF50", "size": 30},
"document": {"color": "#2196F3", "shape": "square"},
}
)
By Property
graph = Graph.from_dict(
data,
node_color="group", # Color by field
node_size=lambda n: n["score"] * 10, # Size by function
edge_width="weight", # Width by field
)
Layouts
Graph.from_dict(data, layout="force") # Default
Graph.from_dict(data, layout="hierarchical")
Graph.from_dict(data, layout="circular")
Graph.from_dict(data, layout="grid")
Options
graph = Graph.from_dict(
data,
width=800,
height=600,
directed=True,
labels=True,
edge_labels=False,
physics=True,
zoom=(0.1, 4),
)
Large Graphs
For 1000+ nodes:
graph = Graph.from_dict(
data,
virtualize=True,
cluster=True,
)
Export
graph.to_png("graph.png")
graph.to_svg("graph.svg")
graph.to_json("graph.json")
Environment Support
| Environment | Supported |
|---|---|
| Marimo | ✅ |
| JupyterLab | ✅ |
| Jupyter Notebook | ✅ |
| VS Code | ✅ |
| Google Colab | ✅ |
| Databricks | ✅ |
Related
- anywidget — Custom Jupyter widgets made easy
- Grafeo — Embeddable graph database
- grafeo-web — Grafeo in the browser
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
anywidget_graph-0.2.0.tar.gz
(59.3 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file anywidget_graph-0.2.0.tar.gz.
File metadata
- Download URL: anywidget_graph-0.2.0.tar.gz
- Upload date:
- Size: 59.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.4.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0cc2046d588467379e3a10c63a4a7370316ac8b831cb5c1af2fbe6bd53234c9a
|
|
| MD5 |
86631cf767e716711a6fdc6acf51cfb2
|
|
| BLAKE2b-256 |
57d963f9cf5ebe3ca1fbc839e5e69c4884752b734981448d2cfda6a5b8259923
|
File details
Details for the file anywidget_graph-0.2.0-py3-none-any.whl.
File metadata
- Download URL: anywidget_graph-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.4.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8108a36854a215ae58fa5014b42a9412f323bab5a41f698026e86acd86b4d8da
|
|
| MD5 |
dc9850e42c2af71795a6419488f85697
|
|
| BLAKE2b-256 |
1da87132c93f31b74611d8552febf292de826cb6e00826db95591bae235d19f9
|