Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced PyTorch/NumPy einsum tensor networks.
Project description
Tensor-Network-Visualization
Minimal Matplotlib visualizations for TensorKrowch, TensorNetwork, Quimb, TeNPy, and traced
PyTorch/NumPy einsum tensor networks.
Repository: https://github.com/DOKOS-TAYOS/Tensor-Network-Visualization
What This Library Does
Tensor-network libraries expose very different Python objects, but this package gives them two aligned plotting entry points:
fig, ax = show_tensor_network(...)
fig, ax = show_tensor_elements(...)
Internally, the library:
- normalizes backend objects into one graph model,
- computes a layout,
- draws the graph in 2D or 3D with Matplotlib,
- optionally adds figure controls for view/label/scheme toggles.
The goal is to keep the public API small while still being useful for notebooks, papers, debugging, and saved figures.
Install
PyPI package name: tensor-network-visualization
Import package: tensor_network_viz
Requires Python 3.11 or newer.
Base install
python -m pip install tensor-network-visualization
Base dependencies are only numpy, matplotlib, and networkx.
Documentation Map
- Start here for installation and the public API overview.
- Use
docs/guide.mdfor workflow-oriented explanations. - Use
docs/backends.mdfor backend-specific copy-paste examples. - Use
examples/README.mdwhen you want to run the local demos from this repository.
Errors and Logging
Public entry points now raise package-specific exceptions while remaining compatible with the built-in exception families they refine:
VisualizationInputError: unsupported or ambiguous network input.AxisConfigurationError: incompatibleax/viewcombinations.UnsupportedEngineError: unknown engine or backend name.TensorDataError: unsupported or missing tensor data forshow_tensor_elements(...).MissingOptionalDependencyError: missing optional backend dependency.
All of them inherit from TensorNetworkVizError.
The package logger name is tensor_network_viz. It installs a logging.NullHandler() by default,
so importing the library does not change your application's logging configuration.
import logging
logging.basicConfig(level=logging.DEBUG)
logging.getLogger("tensor_network_viz").setLevel(logging.DEBUG)
Optional extras
| Need | Install |
|---|---|
| TensorKrowch support | python -m pip install "tensor-network-visualization[tensorkrowch]" |
| TensorNetwork support | python -m pip install "tensor-network-visualization[tensornetwork]" |
| Quimb support | python -m pip install "tensor-network-visualization[quimb]" |
| TeNPy support | python -m pip install "tensor-network-visualization[tenpy]" |
Traced einsum(...) support |
python -m pip install "tensor-network-visualization[einsum]" |
| Interactive Jupyter widgets | python -m pip install "tensor-network-visualization[jupyter]" |
Windows and Linux quick start
Windows (PowerShell):
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -U pip
python -m pip install "tensor-network-visualization[quimb]"
Linux / macOS:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install "tensor-network-visualization[quimb]"
Once the virtual environment is active, the python ... commands shown in the rest of this
README work the same way on Windows and Linux.
The API in One Minute
show_controls and show are independent:
show_controls=Falsedisables the embedded Matplotlib widgets and slider.show=Falseskips automatic display and only returns(fig, ax).
show_tensor_network
Use show_tensor_network for figure lifecycle:
show_tensor_network(
network,
*,
engine=None,
view=None,
config=None,
ax=None,
show_controls=True,
show=True,
)
engine: optional backend override. If omitted, the library auto-detects it.view:"2d"or"3d". If omitted, it starts in"2d".config: all visual behavior lives here.ax: render into an existing Matplotlib axis.show_controls: ifFalse, render a static figure without the embedded control panel.show: ifFalse, nothing is displayed automatically.
show_tensor_elements
Use show_tensor_elements to inspect tensor values:
show_tensor_elements(
data,
*,
engine=None,
config=None,
ax=None,
show_controls=True,
show=True,
)
When several tensors are present, the figure keeps one tensor active at a time and uses a slider
to switch between them. The interactive controls are grouped: basic (elements, magnitude,
log_magnitude, distribution, data), complex (real, imag, phase), and
diagnostic (sign, signed_value, sparsity, nan_inf, singular_values, eigen_real,
eigen_imag).
data: single tensor, iterable of tensors, supported backend-native tensor collections, or anEinsumTracewith live tensor values.engine: optional backend override. If omitted, the library auto-detects it.config: tensor-inspection behavior lives here.datamode includes global stats, per-axis summaries, and top-k coordinates by magnitude.singular_valuesrenders the singular-value spectrum for the same matrixized tensor used by the heatmap views and is hidden automatically when the active tensor containsNaNorInf.eigen_realandeigen_imagrender the real and imaginary parts of the eigenvalues for the same matrixized tensor, ordered by eigenvalue magnitude. They appear only when the active analysis matrix is finite and square.ax: render a single tensor into an existing Matplotlib axis.show_controls: ifTrue, add compact Matplotlibgroup + modecontrols and, when needed, a tensor slider.show: ifFalse, nothing is displayed automatically.
PlotConfig
Use PlotConfig for visual behavior:
from tensor_network_viz import PlotConfig
config = PlotConfig(
show_nodes=True,
show_tensor_labels=True,
show_index_labels=False,
hover_labels=True,
show_contraction_scheme=False,
contraction_scheme_cost_hover=False,
contraction_tensor_inspector=False,
tensor_label_refinement="auto",
tensor_label_fontsize=None,
edge_label_fontsize=None,
)
This is where you configure:
- labels,
- hover tooltips,
- contraction-scheme overlays,
- optional tensor/edge label font-size overrides,
- styling,
- layout iterations,
- custom positions,
- label-refinement policy,
- static/export-oriented rendering choices.
TensorElementsConfig
Use TensorElementsConfig for tensor inspection behavior:
from tensor_network_viz import TensorElementsConfig
config = TensorElementsConfig(
mode="auto",
row_axes=None,
col_axes=None,
figsize=(7.2, 6.4),
max_matrix_shape=(256, 256),
shared_color_scale=False,
robust_percentiles=(1.0, 99.0),
highlight_outliers=False,
outlier_zscore=3.5,
zero_threshold=1e-12,
log_magnitude_floor=1e-12,
histogram_bins=40,
histogram_max_samples=100_000,
topk_count=8,
)
This is where you configure:
- the active inspection mode,
- row/column axis grouping for rank > 2 tensors,
- heatmap downsampling limits,
- histogram sampling and bin count,
- data-summary depth (
topk_count), - heatmap/spectral reduction via
max_matrix_shape, - optional robust/shared scaling and outlier overlays,
- singular-value display floor and zero handling.
If you want to start in a specific grouped view, pass mode="real", mode="imag",
mode="phase", mode="log_magnitude", mode="sparsity", mode="nan_inf", mode="sign",
mode="signed_value", mode="singular_values", mode="eigen_real", or mode="eigen_imag" directly in
TensorElementsConfig(...).
Most Common Workflows
Interactive figure with controls
from tensor_network_viz import PlotConfig, show_tensor_network
fig, ax = show_tensor_network(
network,
config=PlotConfig(
show_tensor_labels=False,
show_index_labels=False,
hover_labels=True,
),
)
Clean export with no embedded controls
from tensor_network_viz import PlotConfig, show_tensor_network
fig, ax = show_tensor_network(
network,
config=PlotConfig(
show_tensor_labels=True,
show_index_labels=False,
),
show_controls=False,
show=False,
)
fig.savefig("network.png", bbox_inches="tight")
Inspect tensor values
from tensor_network_viz import TensorElementsConfig, show_tensor_elements
fig, ax = show_tensor_elements(
trace,
config=TensorElementsConfig(mode="auto"),
show=False,
)
fig.savefig("tensor-elements.png", bbox_inches="tight")
Faster render for large graphs
config = PlotConfig(
tensor_label_refinement="never",
layout_iterations=120,
)
Copy-Paste Examples by Backend
The library supports auto-detection, but using engine=... in examples is often clearer.
TensorKrowch
import tensorkrowch as tk
from tensor_network_viz import PlotConfig, show_tensor_network
network = tk.TensorNetwork(name="demo")
left = tk.Node(shape=(2, 2), axes_names=("a", "b"), name="L", network=network)
right = tk.Node(shape=(2, 2), axes_names=("b", "c"), name="R", network=network)
left["b"] ^ right["b"]
fig, ax = show_tensor_network(
network,
engine="tensorkrowch",
config=PlotConfig(show_tensor_labels=True),
)
TensorNetwork
import numpy as np
import tensornetwork as tn
from tensor_network_viz import PlotConfig, show_tensor_network
left = tn.Node(np.ones((2, 2)), name="L", axis_names=("a", "b"))
right = tn.Node(np.ones((2, 2)), name="R", axis_names=("b", "c"))
left["b"] ^ right["b"]
fig, ax = show_tensor_network(
[left, right],
engine="tensornetwork",
config=PlotConfig(show_tensor_labels=True),
)
Quimb
import numpy as np
import quimb.tensor as qtn
from tensor_network_viz import PlotConfig, show_tensor_network
tensors = [
qtn.Tensor(np.ones((2, 3)), inds=("i0", "b0"), tags={"T0"}),
qtn.Tensor(np.ones((3, 2)), inds=("b0", "i1"), tags={"T1"}),
]
network = qtn.TensorNetwork(tensors)
fig, ax = show_tensor_network(
network,
engine="quimb",
config=PlotConfig(show_tensor_labels=True),
)
TeNPy
from tenpy.networks.mps import MPS
from tenpy.networks.site import SpinHalfSite
from tensor_network_viz import PlotConfig, show_tensor_network
sites = [SpinHalfSite() for _ in range(4)]
mps = MPS.from_product_state(sites, ["up", "up", "up", "up"], bc="finite")
fig, ax = show_tensor_network(
mps,
engine="tenpy",
config=PlotConfig(show_tensor_labels=True),
show_controls=False,
show=False,
)
einsum
from tensor_network_viz import PlotConfig, pair_tensor, show_tensor_network
trace = [
pair_tensor("A0", "x0", "r0", "pa,p->a"),
pair_tensor("r0", "A1", "r1", "a,apb->pb"),
]
fig, ax = show_tensor_network(
trace,
engine="einsum",
config=PlotConfig(show_contraction_scheme=True),
)
For fuller backend examples, see docs/backends.md.
PlotConfig Fields You Will Actually Use Often
| Field | Why it matters |
|---|---|
show_tensor_labels |
Draw tensor names on nodes. |
show_index_labels |
Draw index labels on bonds and dangling legs. |
hover_labels |
Enable hover tooltips in interactive sessions. |
show_contraction_scheme |
Enable the dynamic contraction slider with real node shape/color changes. |
contraction_scheme_cost_hover |
Show contraction details in the slider panel. |
tensor_label_refinement |
"auto", "always", or "never" for the expensive label-fit pass. |
layout_iterations |
Force-layout effort. |
positions |
Supply custom node coordinates. |
figsize |
Matplotlib figure size when the figure is created internally. |
Example Launcher
The repository ships a typed demo launcher:
python examples/run_demo.py <engine> <example> [options]
Useful examples:
python examples/run_demo.py quimb hyper --view 2d
python examples/run_demo.py tenpy chain --view 2d --save tenpy_chain.png --no-show
python examples/run_demo.py einsum ellipsis --view 3d --scheme
More details, including an exhaustive copy-paste command list for every CLI example: examples/README.md
There is also a minimal inspection example that only uses base dependencies:
python examples/tensor_elements_demo.py
Troubleshooting
| Symptom | What to try |
|---|---|
| Saved figure includes buttons/sliders | Use show_controls=False. |
| Hover tooltips do nothing | Use an interactive Matplotlib backend; hover is not useful for PNG-only runs. |
| Big graphs are slow | Set tensor_label_refinement="never", reduce layout_iterations, or pass positions. |
Unsupported tensor network engine |
Install the matching extra or pass the correct backend object. |
AxisConfigurationError when passing ax |
Use a 2D axis for view="2d", a 3D axis for view="3d", and only pass ax to show_tensor_elements(...) for a single tensor. |
show_tensor_elements(...) fails on TensorKrowch nodes |
Materialize the node tensors first; shape-only nodes do not expose element values. |
show_tensor_elements(...) fails on manual pair_tensor(...) lists |
Use an EinsumTrace with live tensors instead; manual trace steps only describe contractions. |
| Blank / duplicate Jupyter figure | Assign fig, ax = show_tensor_network(...) instead of leaving the tuple as the last line. |
Documentation Map
- docs/guide.md: workflow-oriented guide to the public API.
- docs/backends.md: copy-paste backend-specific examples.
- examples/README.md: demo launcher and batch-render usage.
- examples/tensor_elements_demo.py: minimal tensor inspection example.
- CHANGELOG.md: release notes.
Development
Create and use a local virtual environment:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.dev.txt
Run the project checks:
.\.venv\Scripts\python scripts\verify.py
Useful slices:
.\.venv\Scripts\python scripts\verify.py quality
.\.venv\Scripts\python scripts\verify.py tests
.\.venv\Scripts\python scripts\verify.py smoke
.\.venv\Scripts\python scripts\verify.py package
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
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 tensor_network_visualization-1.5.3.tar.gz.
File metadata
- Download URL: tensor_network_visualization-1.5.3.tar.gz
- Upload date:
- Size: 231.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa01eb6ae95799614dea10f5abf7f2513245f769096048103e5f31c6bbbd71b5
|
|
| MD5 |
a1d81666d3e3123b5974ddae3dbb1721
|
|
| BLAKE2b-256 |
6965c727c38bd375c76c16e9880df5d48fca0755786213f08295f874476e878d
|
File details
Details for the file tensor_network_visualization-1.5.3-py3-none-any.whl.
File metadata
- Download URL: tensor_network_visualization-1.5.3-py3-none-any.whl
- Upload date:
- Size: 202.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6330b9af191844c032b6cb80c76acebd9a93676b6adbfb9652f2fd78f60ebf2
|
|
| MD5 |
5a1e7e61d86629a1e407002cc2dbc65d
|
|
| BLAKE2b-256 |
806edaa2bbdb3b7e4e0b9a0890168b4b4771d4688c12864c49eae5cd47380075
|