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-wasm — 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.1.0.tar.gz
(49.9 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.1.0.tar.gz.
File metadata
- Download URL: anywidget_graph-0.1.0.tar.gz
- Upload date:
- Size: 49.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.4.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
169b103348c22086bbce3380c9833adca5c11f77bdc86c72089c5b4ed33e2b68
|
|
| MD5 |
ebf16ca591b34853b6f83d03673c6c69
|
|
| BLAKE2b-256 |
8f7789a93fd7e458110141a27677e0e4efb64fcda5a3d87c3524b56651d818e6
|
File details
Details for the file anywidget_graph-0.1.0-py3-none-any.whl.
File metadata
- Download URL: anywidget_graph-0.1.0-py3-none-any.whl
- Upload date:
- Size: 5.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.4.24
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ddf84c8f0ccbe0babfaef5536fe54855a5791be084da20e3b508f4f089970199
|
|
| MD5 |
c2360334593bb0a35a790a57656c194f
|
|
| BLAKE2b-256 |
32cfcedfe7a8175a0b584a754fce1149230f4a38cc93b7b7e3845e1b777f77e2
|