jarvisplot 1.3.0__tar.gz → 1.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jarvisplot-1.3.0 → jarvisplot-1.3.2/JarvisPLOT.egg-info}/PKG-INFO +43 -11
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2/JarvisPLOT.egg-info}/SOURCES.txt +28 -7
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2}/PKG-INFO +43 -11
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/README.md +40 -8
- jarvisplot-1.3.2/jarvisplot/Figure/adapters.py +6 -0
- jarvisplot-1.3.0/jarvisplot/Figure/adapters.py → jarvisplot-1.3.2/jarvisplot/Figure/adapters_rect.py +1 -72
- jarvisplot-1.3.2/jarvisplot/Figure/adapters_ternary.py +89 -0
- jarvisplot-1.3.2/jarvisplot/Figure/colorbar_runtime.py +221 -0
- jarvisplot-1.3.2/jarvisplot/Figure/config_runtime.py +87 -0
- jarvisplot-1.3.2/jarvisplot/Figure/figure.py +1009 -0
- jarvisplot-1.3.2/jarvisplot/Figure/layer_runtime.py +282 -0
- jarvisplot-1.3.2/jarvisplot/Figure/layout_runtime.py +228 -0
- jarvisplot-1.3.2/jarvisplot/Figure/load_data.py +100 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/preprocessor.py +33 -430
- jarvisplot-1.3.2/jarvisplot/Figure/preprocessor_runtime.py +479 -0
- jarvisplot-1.3.0/jarvisplot/Figure/load_data.py → jarvisplot-1.3.2/jarvisplot/Figure/profile_runtime.py +22 -139
- jarvisplot-1.3.2/jarvisplot/Figure/style_runtime.py +40 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cli.py +6 -2
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/config.py +4 -3
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/core.py +18 -280
- jarvisplot-1.3.2/jarvisplot/core_assets.py +63 -0
- jarvisplot-1.3.2/jarvisplot/core_runtime.py +239 -0
- jarvisplot-1.3.2/jarvisplot/data_loader.py +490 -0
- jarvisplot-1.3.2/jarvisplot/data_loader_hdf5.py +205 -0
- jarvisplot-1.3.2/jarvisplot/data_loader_runtime.py +910 -0
- jarvisplot-1.3.2/jarvisplot/data_loader_summary.py +83 -0
- jarvisplot-1.3.2/jarvisplot/utils/expression.py +66 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/utils/interpolator.py +6 -22
- jarvisplot-1.3.2/jarvisplot/utils/pathing.py +31 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/pyproject.toml +3 -3
- jarvisplot-1.3.2/tests/test_data_loader_contracts.py +96 -0
- jarvisplot-1.3.2/tests/test_docs_status_labels.py +46 -0
- jarvisplot-1.3.2/tests/test_figure_contracts.py +189 -0
- jarvisplot-1.3.2/tests/test_pathing_contracts.py +75 -0
- jarvisplot-1.3.2/tests/test_template_json.py +10 -0
- jarvisplot-1.3.0/jarvisplot/Figure/figure.py +0 -1891
- jarvisplot-1.3.0/jarvisplot/data_loader.py +0 -1669
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2/JarvisPLOT.egg-info}/dependency_links.txt +0 -0
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2/JarvisPLOT.egg-info}/entry_points.txt +0 -0
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2/JarvisPLOT.egg-info}/requires.txt +0 -0
- {jarvisplot-1.3.0/jarvisplot.egg-info → jarvisplot-1.3.2/JarvisPLOT.egg-info}/top_level.txt +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/__init__.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/data_pipelines.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/helper.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/Figure/method_registry.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/__init__.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cache_store.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/args.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/colors/colormaps.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/default/output.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/icons/gambit.png +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/icons/gambit_small.png +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/cards/style_preference.json +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/client.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/inner_func.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/memtrace.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/utils/__init__.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/jarvisplot/utils/cmaps.py +0 -0
- {jarvisplot-1.3.0 → jarvisplot-1.3.2}/setup.cfg +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
|
-
Name:
|
|
3
|
-
Version: 1.3.
|
|
4
|
-
Summary:
|
|
2
|
+
Name: JarvisPLOT
|
|
3
|
+
Version: 1.3.2
|
|
4
|
+
Summary: Jarvis-PLOT: YAML-driven plotting engine
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
Requires-Dist: loguru
|
|
@@ -18,19 +18,37 @@ Requires-Dist: scipy
|
|
|
18
18
|
Requires-Dist: shapely
|
|
19
19
|
Requires-Dist: deepmerge
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# Jarvis-PLOT
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Jarvis-PLOT is a lightweight, Python/Matplotlib-based plotting framework developed for **Jarvis-HEP**,
|
|
24
24
|
but it can also be used as a **standalone scientific plotting tool**.
|
|
25
25
|
|
|
26
26
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
-
## Installation
|
|
30
|
+
## Installation
|
|
31
31
|
|
|
32
|
-
```bash
|
|
33
|
-
pip install
|
|
32
|
+
```bash
|
|
33
|
+
pip install Jarvis-PLOT
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The PyPI distribution name is now `Jarvis-PLOT`.
|
|
37
|
+
The Python import package and entrypoint remain unchanged:
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
import jarvisplot
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
jplot path/to/config.yaml
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
If you have an older environment that still uses the historical package name, replace:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pip uninstall jarvisplot
|
|
51
|
+
pip install Jarvis-PLOT
|
|
34
52
|
```
|
|
35
53
|
|
|
36
54
|
## Command-Line Usage
|
|
@@ -41,7 +59,7 @@ Display help information:
|
|
|
41
59
|
jplot -h
|
|
42
60
|
```
|
|
43
61
|
|
|
44
|
-
Run
|
|
62
|
+
Run Jarvis-PLOT with one or more YAML configuration files:
|
|
45
63
|
|
|
46
64
|
```bash
|
|
47
65
|
jplot path/to/config.yaml
|
|
@@ -56,7 +74,7 @@ jplot path/to/config.yaml --rebuild-cache
|
|
|
56
74
|
### Project Workdir and Cache
|
|
57
75
|
|
|
58
76
|
- You can set `project.workdir` in YAML.
|
|
59
|
-
- If `output.dir` is omitted,
|
|
77
|
+
- If `output.dir` is omitted, Jarvis-PLOT defaults to `<workdir>/plots/`.
|
|
60
78
|
- Data cache is stored in `<workdir>/.cache/`.
|
|
61
79
|
- Profiling pipelines are prebuilt once and reused from cache when source fingerprint and profile settings are unchanged.
|
|
62
80
|
- Profiling uses a fast two-stage grid reduction (`pregrid` + render `bin`) for large datasets.
|
|
@@ -76,7 +94,7 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
76
94
|
|
|
77
95
|
- Figures are saved automatically to the output paths defined in the YAML configuration.
|
|
78
96
|
- Common output formats include PNG and PDF (backend-dependent).
|
|
79
|
-
-
|
|
97
|
+
- Jarvis-PLOT works in headless environments (SSH, batch jobs) without any GUI backend.
|
|
80
98
|
|
|
81
99
|
---
|
|
82
100
|
|
|
@@ -103,6 +121,20 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
103
121
|
### Documentation
|
|
104
122
|
[https://pengxuan-zhu-phys.github.io/Jarvis-Docs/](https://pengxuan-zhu-phys.github.io/Jarvis-Docs/)
|
|
105
123
|
|
|
124
|
+
### Repository Docs
|
|
125
|
+
|
|
126
|
+
Tracked project docs live in `docs/`.
|
|
127
|
+
|
|
128
|
+
- `docs/README.md` - repo doc index
|
|
129
|
+
- `docs/context/JARVIS_PLOT_CONTEXT.md` - primary Codex-facing boundary doc
|
|
130
|
+
- `docs/context/CODE_MAP_JARVIS_PLOT.md` - concrete code owner map
|
|
131
|
+
- `docs/context/JARVIS_PLOT_FRAMEWORK_LOGIC.md` - runtime execution contract
|
|
132
|
+
- `docs/roadmap/IMPLEMENTATION_ROADMAP.md` - active backlog and future work list
|
|
133
|
+
- `docs/dev/DEVELOPER_RULES.md` - current pipeline and cache rules
|
|
134
|
+
- `docs/dev/MEMORY_OPTIMIZATION_GUIDE.md` - narrow-table memory notes
|
|
135
|
+
|
|
136
|
+
Read the context docs and roadmap before changing parsing, transforms, rendering, or layout-related behavior.
|
|
137
|
+
|
|
106
138
|
---
|
|
107
139
|
|
|
108
140
|
## License
|
|
@@ -1,28 +1,42 @@
|
|
|
1
1
|
README.md
|
|
2
2
|
pyproject.toml
|
|
3
|
+
JarvisPLOT.egg-info/PKG-INFO
|
|
4
|
+
JarvisPLOT.egg-info/SOURCES.txt
|
|
5
|
+
JarvisPLOT.egg-info/dependency_links.txt
|
|
6
|
+
JarvisPLOT.egg-info/entry_points.txt
|
|
7
|
+
JarvisPLOT.egg-info/requires.txt
|
|
8
|
+
JarvisPLOT.egg-info/top_level.txt
|
|
3
9
|
jarvisplot/__init__.py
|
|
4
10
|
jarvisplot/cache_store.py
|
|
5
11
|
jarvisplot/cli.py
|
|
6
12
|
jarvisplot/client.py
|
|
7
13
|
jarvisplot/config.py
|
|
8
14
|
jarvisplot/core.py
|
|
15
|
+
jarvisplot/core_assets.py
|
|
16
|
+
jarvisplot/core_runtime.py
|
|
9
17
|
jarvisplot/data_loader.py
|
|
18
|
+
jarvisplot/data_loader_hdf5.py
|
|
19
|
+
jarvisplot/data_loader_runtime.py
|
|
20
|
+
jarvisplot/data_loader_summary.py
|
|
10
21
|
jarvisplot/inner_func.py
|
|
11
22
|
jarvisplot/memtrace.py
|
|
12
|
-
jarvisplot.egg-info/PKG-INFO
|
|
13
|
-
jarvisplot.egg-info/SOURCES.txt
|
|
14
|
-
jarvisplot.egg-info/dependency_links.txt
|
|
15
|
-
jarvisplot.egg-info/entry_points.txt
|
|
16
|
-
jarvisplot.egg-info/requires.txt
|
|
17
|
-
jarvisplot.egg-info/top_level.txt
|
|
18
23
|
jarvisplot/Figure/__init__.py
|
|
19
24
|
jarvisplot/Figure/adapters.py
|
|
25
|
+
jarvisplot/Figure/adapters_rect.py
|
|
26
|
+
jarvisplot/Figure/adapters_ternary.py
|
|
27
|
+
jarvisplot/Figure/colorbar_runtime.py
|
|
28
|
+
jarvisplot/Figure/config_runtime.py
|
|
20
29
|
jarvisplot/Figure/data_pipelines.py
|
|
21
30
|
jarvisplot/Figure/figure.py
|
|
22
31
|
jarvisplot/Figure/helper.py
|
|
32
|
+
jarvisplot/Figure/layer_runtime.py
|
|
33
|
+
jarvisplot/Figure/layout_runtime.py
|
|
23
34
|
jarvisplot/Figure/load_data.py
|
|
24
35
|
jarvisplot/Figure/method_registry.py
|
|
25
36
|
jarvisplot/Figure/preprocessor.py
|
|
37
|
+
jarvisplot/Figure/preprocessor_runtime.py
|
|
38
|
+
jarvisplot/Figure/profile_runtime.py
|
|
39
|
+
jarvisplot/Figure/style_runtime.py
|
|
26
40
|
jarvisplot/Figure/cards/std_axes_adapter_config.json
|
|
27
41
|
jarvisplot/cards/args.json
|
|
28
42
|
jarvisplot/cards/style_preference.json
|
|
@@ -47,4 +61,11 @@ jarvisplot/cards/icons/gambit.png
|
|
|
47
61
|
jarvisplot/cards/icons/gambit_small.png
|
|
48
62
|
jarvisplot/utils/__init__.py
|
|
49
63
|
jarvisplot/utils/cmaps.py
|
|
50
|
-
jarvisplot/utils/
|
|
64
|
+
jarvisplot/utils/expression.py
|
|
65
|
+
jarvisplot/utils/interpolator.py
|
|
66
|
+
jarvisplot/utils/pathing.py
|
|
67
|
+
tests/test_data_loader_contracts.py
|
|
68
|
+
tests/test_docs_status_labels.py
|
|
69
|
+
tests/test_figure_contracts.py
|
|
70
|
+
tests/test_pathing_contracts.py
|
|
71
|
+
tests/test_template_json.py
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
|
-
Name:
|
|
3
|
-
Version: 1.3.
|
|
4
|
-
Summary:
|
|
2
|
+
Name: JarvisPLOT
|
|
3
|
+
Version: 1.3.2
|
|
4
|
+
Summary: Jarvis-PLOT: YAML-driven plotting engine
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
Requires-Dist: loguru
|
|
@@ -18,19 +18,37 @@ Requires-Dist: scipy
|
|
|
18
18
|
Requires-Dist: shapely
|
|
19
19
|
Requires-Dist: deepmerge
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# Jarvis-PLOT
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Jarvis-PLOT is a lightweight, Python/Matplotlib-based plotting framework developed for **Jarvis-HEP**,
|
|
24
24
|
but it can also be used as a **standalone scientific plotting tool**.
|
|
25
25
|
|
|
26
26
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
-
## Installation
|
|
30
|
+
## Installation
|
|
31
31
|
|
|
32
|
-
```bash
|
|
33
|
-
pip install
|
|
32
|
+
```bash
|
|
33
|
+
pip install Jarvis-PLOT
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The PyPI distribution name is now `Jarvis-PLOT`.
|
|
37
|
+
The Python import package and entrypoint remain unchanged:
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
import jarvisplot
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
jplot path/to/config.yaml
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
If you have an older environment that still uses the historical package name, replace:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pip uninstall jarvisplot
|
|
51
|
+
pip install Jarvis-PLOT
|
|
34
52
|
```
|
|
35
53
|
|
|
36
54
|
## Command-Line Usage
|
|
@@ -41,7 +59,7 @@ Display help information:
|
|
|
41
59
|
jplot -h
|
|
42
60
|
```
|
|
43
61
|
|
|
44
|
-
Run
|
|
62
|
+
Run Jarvis-PLOT with one or more YAML configuration files:
|
|
45
63
|
|
|
46
64
|
```bash
|
|
47
65
|
jplot path/to/config.yaml
|
|
@@ -56,7 +74,7 @@ jplot path/to/config.yaml --rebuild-cache
|
|
|
56
74
|
### Project Workdir and Cache
|
|
57
75
|
|
|
58
76
|
- You can set `project.workdir` in YAML.
|
|
59
|
-
- If `output.dir` is omitted,
|
|
77
|
+
- If `output.dir` is omitted, Jarvis-PLOT defaults to `<workdir>/plots/`.
|
|
60
78
|
- Data cache is stored in `<workdir>/.cache/`.
|
|
61
79
|
- Profiling pipelines are prebuilt once and reused from cache when source fingerprint and profile settings are unchanged.
|
|
62
80
|
- Profiling uses a fast two-stage grid reduction (`pregrid` + render `bin`) for large datasets.
|
|
@@ -76,7 +94,7 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
76
94
|
|
|
77
95
|
- Figures are saved automatically to the output paths defined in the YAML configuration.
|
|
78
96
|
- Common output formats include PNG and PDF (backend-dependent).
|
|
79
|
-
-
|
|
97
|
+
- Jarvis-PLOT works in headless environments (SSH, batch jobs) without any GUI backend.
|
|
80
98
|
|
|
81
99
|
---
|
|
82
100
|
|
|
@@ -103,6 +121,20 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
103
121
|
### Documentation
|
|
104
122
|
[https://pengxuan-zhu-phys.github.io/Jarvis-Docs/](https://pengxuan-zhu-phys.github.io/Jarvis-Docs/)
|
|
105
123
|
|
|
124
|
+
### Repository Docs
|
|
125
|
+
|
|
126
|
+
Tracked project docs live in `docs/`.
|
|
127
|
+
|
|
128
|
+
- `docs/README.md` - repo doc index
|
|
129
|
+
- `docs/context/JARVIS_PLOT_CONTEXT.md` - primary Codex-facing boundary doc
|
|
130
|
+
- `docs/context/CODE_MAP_JARVIS_PLOT.md` - concrete code owner map
|
|
131
|
+
- `docs/context/JARVIS_PLOT_FRAMEWORK_LOGIC.md` - runtime execution contract
|
|
132
|
+
- `docs/roadmap/IMPLEMENTATION_ROADMAP.md` - active backlog and future work list
|
|
133
|
+
- `docs/dev/DEVELOPER_RULES.md` - current pipeline and cache rules
|
|
134
|
+
- `docs/dev/MEMORY_OPTIMIZATION_GUIDE.md` - narrow-table memory notes
|
|
135
|
+
|
|
136
|
+
Read the context docs and roadmap before changing parsing, transforms, rendering, or layout-related behavior.
|
|
137
|
+
|
|
106
138
|
---
|
|
107
139
|
|
|
108
140
|
## License
|
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Jarvis-PLOT
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Jarvis-PLOT is a lightweight, Python/Matplotlib-based plotting framework developed for **Jarvis-HEP**,
|
|
4
4
|
but it can also be used as a **standalone scientific plotting tool**.
|
|
5
5
|
|
|
6
6
|
It provides a simple command-line interface (CLI) to generate publication-quality figures from YAML configuration files, with most layout and style decisions handled by predefined profiles and style cards.
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
## Installation
|
|
10
|
+
## Installation
|
|
11
11
|
|
|
12
|
-
```bash
|
|
13
|
-
pip install
|
|
12
|
+
```bash
|
|
13
|
+
pip install Jarvis-PLOT
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The PyPI distribution name is now `Jarvis-PLOT`.
|
|
17
|
+
The Python import package and entrypoint remain unchanged:
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
import jarvisplot
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
jplot path/to/config.yaml
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If you have an older environment that still uses the historical package name, replace:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip uninstall jarvisplot
|
|
31
|
+
pip install Jarvis-PLOT
|
|
14
32
|
```
|
|
15
33
|
|
|
16
34
|
## Command-Line Usage
|
|
@@ -21,7 +39,7 @@ Display help information:
|
|
|
21
39
|
jplot -h
|
|
22
40
|
```
|
|
23
41
|
|
|
24
|
-
Run
|
|
42
|
+
Run Jarvis-PLOT with one or more YAML configuration files:
|
|
25
43
|
|
|
26
44
|
```bash
|
|
27
45
|
jplot path/to/config.yaml
|
|
@@ -36,7 +54,7 @@ jplot path/to/config.yaml --rebuild-cache
|
|
|
36
54
|
### Project Workdir and Cache
|
|
37
55
|
|
|
38
56
|
- You can set `project.workdir` in YAML.
|
|
39
|
-
- If `output.dir` is omitted,
|
|
57
|
+
- If `output.dir` is omitted, Jarvis-PLOT defaults to `<workdir>/plots/`.
|
|
40
58
|
- Data cache is stored in `<workdir>/.cache/`.
|
|
41
59
|
- Profiling pipelines are prebuilt once and reused from cache when source fingerprint and profile settings are unchanged.
|
|
42
60
|
- Profiling uses a fast two-stage grid reduction (`pregrid` + render `bin`) for large datasets.
|
|
@@ -56,7 +74,7 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
56
74
|
|
|
57
75
|
- Figures are saved automatically to the output paths defined in the YAML configuration.
|
|
58
76
|
- Common output formats include PNG and PDF (backend-dependent).
|
|
59
|
-
-
|
|
77
|
+
- Jarvis-PLOT works in headless environments (SSH, batch jobs) without any GUI backend.
|
|
60
78
|
|
|
61
79
|
---
|
|
62
80
|
|
|
@@ -83,6 +101,20 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
|
|
|
83
101
|
### Documentation
|
|
84
102
|
[https://pengxuan-zhu-phys.github.io/Jarvis-Docs/](https://pengxuan-zhu-phys.github.io/Jarvis-Docs/)
|
|
85
103
|
|
|
104
|
+
### Repository Docs
|
|
105
|
+
|
|
106
|
+
Tracked project docs live in `docs/`.
|
|
107
|
+
|
|
108
|
+
- `docs/README.md` - repo doc index
|
|
109
|
+
- `docs/context/JARVIS_PLOT_CONTEXT.md` - primary Codex-facing boundary doc
|
|
110
|
+
- `docs/context/CODE_MAP_JARVIS_PLOT.md` - concrete code owner map
|
|
111
|
+
- `docs/context/JARVIS_PLOT_FRAMEWORK_LOGIC.md` - runtime execution contract
|
|
112
|
+
- `docs/roadmap/IMPLEMENTATION_ROADMAP.md` - active backlog and future work list
|
|
113
|
+
- `docs/dev/DEVELOPER_RULES.md` - current pipeline and cache rules
|
|
114
|
+
- `docs/dev/MEMORY_OPTIMIZATION_GUIDE.md` - narrow-table memory notes
|
|
115
|
+
|
|
116
|
+
Read the context docs and roadmap before changing parsing, transforms, rendering, or layout-related behavior.
|
|
117
|
+
|
|
86
118
|
---
|
|
87
119
|
|
|
88
120
|
## License
|
jarvisplot-1.3.0/jarvisplot/Figure/adapters.py → jarvisplot-1.3.2/jarvisplot/Figure/adapters_rect.py
RENAMED
|
@@ -13,6 +13,7 @@ from .helper import _auto_clip, _mask_by_extend, voronoi_finite_polygons_2d, _cl
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
# —— Basic Adapter: Forward to the underlying Axes, merge default parameters, perform automatic clipping ——
|
|
16
|
+
|
|
16
17
|
class StdAxesAdapter:
|
|
17
18
|
def __init__(self, ax: Axes, defaults: Optional[Dict[str, Dict[str, Any]]] = None,
|
|
18
19
|
clip_path=None):
|
|
@@ -963,75 +964,3 @@ class StdAxesAdapter:
|
|
|
963
964
|
return [palette[i % len(palette)] for i in range(n)]
|
|
964
965
|
|
|
965
966
|
# —— Ternary 适配器:在 Std 基础上增加 (a,b,c)->(x,y) 投影 ——
|
|
966
|
-
class TernaryAxesAdapter(StdAxesAdapter):
|
|
967
|
-
def __init__(self, ax: Axes, defaults: Optional[Dict[str, Any]] = None,
|
|
968
|
-
clip_path=None):
|
|
969
|
-
# Allow a flat defaults dict like {"facecolor": "..."} and keep it internal.
|
|
970
|
-
d = dict(defaults) if isinstance(defaults, dict) else {}
|
|
971
|
-
facecolor = d.pop("facecolor", None)
|
|
972
|
-
|
|
973
|
-
super().__init__(ax, defaults=d or None, clip_path=clip_path)
|
|
974
|
-
|
|
975
|
-
if facecolor is not None:
|
|
976
|
-
self.set_facecolor(facecolor)
|
|
977
|
-
|
|
978
|
-
self.status = "init"
|
|
979
|
-
|
|
980
|
-
def set_facecolor(self, color, zorder=-100):
|
|
981
|
-
self.ax.fill(
|
|
982
|
-
[0.0, 1.0, 0.5],
|
|
983
|
-
[0.0, 0.0, 1.0],
|
|
984
|
-
facecolor=color,
|
|
985
|
-
edgecolor="none",
|
|
986
|
-
zorder=zorder
|
|
987
|
-
)
|
|
988
|
-
|
|
989
|
-
@staticmethod
|
|
990
|
-
def _lbr_to_xy(a, b, c):
|
|
991
|
-
s = (a + b + c)
|
|
992
|
-
s = np.where(s == 0.0, 1.0, s) # 避免除零
|
|
993
|
-
aa, bb, cc = a/s, b/s, c/s
|
|
994
|
-
x = bb + 0.5 * cc
|
|
995
|
-
y = cc
|
|
996
|
-
return x, y
|
|
997
|
-
|
|
998
|
-
def scatter(self, **kwargs):
|
|
999
|
-
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
1000
|
-
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
1001
|
-
kwargs['x'] = x
|
|
1002
|
-
kwargs['y'] = y
|
|
1003
|
-
return super().scatter(**kwargs)
|
|
1004
|
-
|
|
1005
|
-
def grid_profile(self, **kwargs):
|
|
1006
|
-
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
1007
|
-
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
1008
|
-
kwargs['x'] = x
|
|
1009
|
-
kwargs['y'] = y
|
|
1010
|
-
return super().grid_profile(**kwargs)
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
def plot(self, **kwargs):
|
|
1014
|
-
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
1015
|
-
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
1016
|
-
kwargs['x'] = x
|
|
1017
|
-
kwargs['y'] = y
|
|
1018
|
-
return super().plot(**kwargs)
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
def tricontour(self, **kwargs):
|
|
1022
|
-
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
1023
|
-
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
1024
|
-
kwargs['x'] = x
|
|
1025
|
-
kwargs['y'] = y
|
|
1026
|
-
return super().tricontour( **kwargs)
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
def tricontourf(self, **kwargs):
|
|
1030
|
-
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
1031
|
-
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
1032
|
-
kwargs['x'] = x
|
|
1033
|
-
kwargs['y'] = y
|
|
1034
|
-
|
|
1035
|
-
return super().tricontourf(**kwargs)
|
|
1036
|
-
# else:
|
|
1037
|
-
# raise ValueError("scatter() needs either (a,b,c) or (x,y) inputs")
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
import numpy as np
|
|
6
|
+
import os
|
|
7
|
+
import json
|
|
8
|
+
|
|
9
|
+
from matplotlib.axes import Axes
|
|
10
|
+
from matplotlib.collections import PolyCollection
|
|
11
|
+
#
|
|
12
|
+
from .helper import _auto_clip, _mask_by_extend, voronoi_finite_polygons_2d, _clip_poly_to_rect
|
|
13
|
+
from .adapters_rect import StdAxesAdapter
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# —— Basic Adapter: Forward to the underlying Axes, merge default parameters, perform automatic clipping ——
|
|
17
|
+
|
|
18
|
+
class TernaryAxesAdapter(StdAxesAdapter):
|
|
19
|
+
def __init__(self, ax: Axes, defaults: Optional[Dict[str, Any]] = None,
|
|
20
|
+
clip_path=None):
|
|
21
|
+
# Allow a flat defaults dict like {"facecolor": "..."} and keep it internal.
|
|
22
|
+
d = dict(defaults) if isinstance(defaults, dict) else {}
|
|
23
|
+
facecolor = d.pop("facecolor", None)
|
|
24
|
+
|
|
25
|
+
super().__init__(ax, defaults=d or None, clip_path=clip_path)
|
|
26
|
+
|
|
27
|
+
if facecolor is not None:
|
|
28
|
+
self.set_facecolor(facecolor)
|
|
29
|
+
|
|
30
|
+
self.status = "init"
|
|
31
|
+
|
|
32
|
+
def set_facecolor(self, color, zorder=-100):
|
|
33
|
+
self.ax.fill(
|
|
34
|
+
[0.0, 1.0, 0.5],
|
|
35
|
+
[0.0, 0.0, 1.0],
|
|
36
|
+
facecolor=color,
|
|
37
|
+
edgecolor="none",
|
|
38
|
+
zorder=zorder
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _lbr_to_xy(a, b, c):
|
|
43
|
+
s = (a + b + c)
|
|
44
|
+
s = np.where(s == 0.0, 1.0, s) # 避免除零
|
|
45
|
+
aa, bb, cc = a/s, b/s, c/s
|
|
46
|
+
x = bb + 0.5 * cc
|
|
47
|
+
y = cc
|
|
48
|
+
return x, y
|
|
49
|
+
|
|
50
|
+
def scatter(self, **kwargs):
|
|
51
|
+
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
52
|
+
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
53
|
+
kwargs['x'] = x
|
|
54
|
+
kwargs['y'] = y
|
|
55
|
+
return super().scatter(**kwargs)
|
|
56
|
+
|
|
57
|
+
def grid_profile(self, **kwargs):
|
|
58
|
+
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
59
|
+
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
60
|
+
kwargs['x'] = x
|
|
61
|
+
kwargs['y'] = y
|
|
62
|
+
return super().grid_profile(**kwargs)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def plot(self, **kwargs):
|
|
66
|
+
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
67
|
+
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
68
|
+
kwargs['x'] = x
|
|
69
|
+
kwargs['y'] = y
|
|
70
|
+
return super().plot(**kwargs)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def tricontour(self, **kwargs):
|
|
74
|
+
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
75
|
+
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
76
|
+
kwargs['x'] = x
|
|
77
|
+
kwargs['y'] = y
|
|
78
|
+
return super().tricontour( **kwargs)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def tricontourf(self, **kwargs):
|
|
82
|
+
if {"left", "right", "bottom"}.issubset(kwargs.keys()):
|
|
83
|
+
x, y = self._lbr_to_xy(kwargs.pop('left'), kwargs.pop('right'), kwargs.pop('bottom'))
|
|
84
|
+
kwargs['x'] = x
|
|
85
|
+
kwargs['y'] = y
|
|
86
|
+
|
|
87
|
+
return super().tricontourf(**kwargs)
|
|
88
|
+
# else:
|
|
89
|
+
# raise ValueError("scatter() needs either (a,b,c) or (x,y) inputs")
|