Convert simple diagram images into runnable code (matplotlib/graphviz).
Project description
diagram2code
Convert simple flowchart-style diagrams into runnable Python programs.
diagram2code takes a diagram image (rectangular steps + arrows), detects the flow, and generates:
- a graph representation (
graph.json) - a runnable Python program (
generated_program.py) - optional debug visualizations (
debug_nodes.png,debug_arrows.png) - an optional exportable bundle (
--export)
This project is designed for learning, prototyping, and experimentation, not for production-grade diagram parsing. :contentReference[oaicite:1]{index=1}
Table of Contents
- Installation
- Quick Start
- Using Labels
- Export Bundle
- Generated Files
- Examples
- Limitations
- Datasets, Predictors & Benchmarks
Installation
Clone the repo and install in editable mode:
git clone https://github.com/Nimil785477/diagram2code.git
cd diagram2code
python -m venv .venv
Activate the environment
# Linux / macOS
source .venv/bin/activate
# Windows (PowerShell)
.\.venv\Scripts\Activate.ps1
Install:
pip install -e .
Basic install from PyPI
pip install diagram2code
With OCR support(optional)
pip install diagram2code[ocr]
You must also install Tesseract OCR on your system:
- Windows: https://github.com/UB-Mannheim/tesseract/wiki
- macOS:
brew install tesseract
- Ubuntu/Debian:
sudo apt install tesseract-ocr
Then run:
diagram2code image.png --extract-labels
This matches exactly what your code already does ✔️
Quick Start
Run diagram2code on a simple diagram:
diagram2code tests/fixtures/branching.png --out outputs
This will write outputs (see Generated Files)
Inspect the detected graph (print summary)
You can inspect the detected nodes, edges, and labels using --print-graph.
diagram2code tests/fixtures/branching.png --out outputs --print-graph
This will:
- run the full detection pipeline
- write all normal output files
- print a human-readable graph summary to the console
Example Output:
Graph summary
Labels source: none
Nodes: 4
- id=0 bbox=(40, 40, 76, 76) label=''
Edges: 4
- 0 -> 1
Dry-run mode
If you only want to inspect the result without writing any files, use:
diagram2code diagram.png --dry-run --print-graph
In dry-run mode:
- detection still runs fully
- no files are written
- OCR does not write labels.json
- export bundles are not created
Using Labels
You can provide custom labels for nodes using a JSON file
Example labels.json
{
"0": "Step_1_Load_Data",
"1": "Step_2_Train_Model"
}
Run with labels
python -m diagram2code.cli diagram.png --out outputs --labels labels.json
The exported program will then use labeled function names (sanitized into valid Python identifiers).
Label resolution order (important)
When multiple label sources are possible, diagram2code resolves labels in the following priority order:
- Explicit labels file
diagram2code diagram.png --labels labels.json
- Auto-detect
labels.jsoninside export directorydiagram2code diagram.png --export export_out
Ifexport_out/labels.jsonexists, it is automatically loaded. - OCR extraction
diagram2code diagram.png --extract-labels
- Fallback
- If none of the above are provided, nodes have empty label The active source is shown when using --print-graph:
Labels source: auto (export_out/labels.json)
Generate a labels template (no OCR)
If you want to label nodes manually, generate a template file:
diagram2code path/to/diagram.png --out outputs --labels-template
Export Bundle
The --export flag creates a self-contained runnable bundle(easy to share). If labels.json exists inside the export directory, it will be automatically used on subsequent runs.
python -m diagram2code.cli diagram.png --out outputs --export export_bundle
When using --export, the following files are copied:
export_bundle/
├── generated_program.py
├── graph.json
├── labels.json (if provided)
├── debug_nodes.png (if exists)
├── debug_arrows.png (if exists)
├── render_graph.py (if exists)
├── run.ps1
├── run.sh
└── README_EXPORT.md
Running the exported bundle
Windows (PowerShell):
cd export_bundle
.\run.ps1
Linux/macOS:
cd export_bundle
bash run.sh
or directly:
python generated_program.py
Generated Files
After a normal run (--out outputs):
| File | Description |
|---|---|
preprocessed.png |
Binary image used for detection |
debug_nodes.png |
Detected rectangles overlay |
debug_arrows.png |
Detected arrows overlay (if enabled) |
graph.json |
Graph structure (nodes + edges) |
render_graph.py |
Script to visualize the graph |
generated_program.py |
Generated executable Python program |
Examples
CLI Usage Examples
Basic run (writes outputs to outputs/):
python -m diagram2code path/to/image.png
Export a runnable bundle:
python -m diagram2code path/to/image.png --export out
Render the detected graph (top-down layout):
python -m diagram2code path/to/image.png --export out --render-graph --render-layout topdown
Render the graph as SVG:
python -m diagram2code path/to/image.png --export out --render-graph --render-format svg
Run without writing debug artifacts:
python -m diagram2code path/to/image.png --no-debug
Diagram Examples
Simple linear flow
[ A ] → [ B ] → [ C ]
Branching flow
→ [ B ]
[ A ]
→ [ C ]
OCR (Optional)
diagram2code can extract text labels using Tesseract OCR.
Requirements:
- System:
tesseract-ocr - Python:
pytesseract
If OCR is unavailable, the pipeline still works and labels default to empty.
Limitations
- The current image-to-code parser is optimized for simple rectangular flowchart steps
- Arrow detection is heuristic-based
- Complex curves, diagonals, or overlapping arrows may fail
- No text extraction from inside shapes
- Not intended for UML, BPMN, or hand-drawn diagrams
Datasets, Predictors & Benchmarks
Beyond image-to-code conversion, diagram2code includes a dataset-backed benchmarking system for reproducible evaluation of graph predictors.
This functionality is optional and intended for:
- experimentation
- research
- comparative evaluation
Core concepts
- Datasets define inputs, ground-truth graphs, and splits
- Predictors generate graph predictions from inputs
- Benchmarks compute aggregate metrics and export structured JSON results
Included predictors
oracle— upper bound using ground-truth graphsheuristic— deterministic non-ML baselinenaive— weak baseline returning a single centered node and no edgesvision— legacy image-based CV pipeline
Benchmark metrics
Benchmarks report:
- node precision / recall / f1
- edge precision / recall / f1
direction_accuracyexact_match_ratenode_count_erroredge_count_error
Minimal local dataset example
Build a small deterministic synthetic dataset:
python -m diagram2code dataset build synthflow --out outputs\synthflow --split test --num-samples 5 --seed 0
Run an oracle benchmark:
python -m diagram2code benchmark --dataset outputs\synthflow --split test --predictor oracle --limit 3 --json outputs\oracle_result.json
Run a weak baseline benchmark:
python -m diagram2code benchmark --dataset outputs\synthflow --split test --predictor naive --limit 3 --json outputs\naive_result.json
Inspect a benchmark result:
python -m diagram2code benchmark info outputs\oracle_result.json
Additional documentation
Datasets
- Overview:
docs/datasets/OVERVIEW.md - Fetching & cache layout:
docs/datasets/FETCHING.md - Adapter authoring:
docs/datasets/ADAPTER_GUIDE.md - FlowLearn reference:
docs/datasets/FLOWLEARN.md - Dataset contract:
docs/datasets/PHASE_3_CONTRACT.md
Predictors
- Predictor interface:
docs/predictors/PREDICTOR_CONTRACT.md - Oracle predictor:
docs/predictors/ORACLE.md - Heuristic baseline:
docs/predictors/HEURISTIC.md
Benchmarks
- Result schema:
docs/benchmarks/RESULT_SCHEMA.md - Reproducibility checklist:
docs/benchmarks/REPRODUCIBILITY.md - Leaderboard format:
docs/benchmarks/LEADERBOARD_FORMAT.md
Minimal evaluation example
diagram2code dataset list
diagram2code dataset fetch tiny_remote_v1 --yes
diagram2code benchmark --dataset tiny_remote_v1 --predictor oracle
Inspect Benchmark Results
diagram2code benchmark info outputs/result.json
Prints a concise summary of metrics and provenance.
Strict Manifest Enforcement
To require a dataset to have a valid manifest.json:
diagram2code benchmark \
--dataset flowlearn \
--predictor oracle \
--fail-on-missing-manifest
Demo
Convert a simple diagram image into runnable Python code:
diagram2code tests/fixtures/simple.png --out demo_outputs --extract-labels
Project details
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 diagram2code-0.1.8.tar.gz.
File metadata
- Download URL: diagram2code-0.1.8.tar.gz
- Upload date:
- Size: 90.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
215c88a5a2e25b4a2d7476c62ddb75ff6fbcc1645fb2dda15c17b1c5550a2ebf
|
|
| MD5 |
a168fbddd210760b2cc446f29ebf6383
|
|
| BLAKE2b-256 |
21e5c4369202f0bd79ec43c5041a1592db64e4d53a23e8e4ce75fc6ca7cbc3e1
|
File details
Details for the file diagram2code-0.1.8-py3-none-any.whl.
File metadata
- Download URL: diagram2code-0.1.8-py3-none-any.whl
- Upload date:
- Size: 81.9 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 |
00737d891ac90ad8f94d118fd0b801213db14eea716cbd16d1b7f26c7722c0c8
|
|
| MD5 |
0076431eeac6b2b2364259c7462fded0
|
|
| BLAKE2b-256 |
5dbe3446cd39ae5be1a9ff7466691962bdf38e8d21211ce90fad7eddce82c8c8
|