jarvisplot 1.3.6__tar.gz → 1.3.8__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.
Files changed (80) hide show
  1. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/PKG-INFO +24 -1
  2. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/SOURCES.txt +2 -0
  3. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/PKG-INFO +24 -1
  4. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/README.md +23 -0
  5. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/adapters_rect.py +42 -16
  6. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/config_runtime.py +2 -0
  7. jarvisplot-1.3.8/jarvisplot/Figure/dynesty_runtime.py +587 -0
  8. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/figure.py +7 -5
  9. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/interp_natural_neighbor_exact.py +4 -0
  10. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/layer_runtime.py +12 -1
  11. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/method_registry.py +1 -0
  12. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/style_runtime.py +15 -8
  13. jarvisplot-1.3.8/jarvisplot/cards/a4paper/2x1/dynesty_runplot.json +165 -0
  14. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/style_preference.json +2 -1
  15. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/pyproject.toml +1 -1
  16. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_figure_contracts.py +91 -0
  17. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_interp_natural_neighbor.py +2 -1
  18. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_jpcontour_methods.py +124 -7
  19. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/dependency_links.txt +0 -0
  20. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/entry_points.txt +0 -0
  21. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/requires.txt +0 -0
  22. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/JarvisPLOT.egg-info/top_level.txt +0 -0
  23. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/__init__.py +0 -0
  24. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/adapters_ternary.py +0 -0
  25. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
  26. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/colorbar_runtime.py +0 -0
  27. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/data_pipelines.py +0 -0
  28. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/helper.py +0 -0
  29. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/interp_natural_neighbor.py +0 -0
  30. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/layout_runtime.py +0 -0
  31. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/preprocessor.py +0 -0
  32. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/preprocessor_runtime.py +0 -0
  33. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/Figure/profile_runtime.py +0 -0
  34. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/__init__.py +0 -0
  35. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cache_store.py +0 -0
  36. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
  37. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
  38. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
  39. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
  40. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
  41. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
  42. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
  43. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
  44. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
  45. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
  46. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/args.json +0 -0
  47. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/colors/colormaps.json +0 -0
  48. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/default/output.json +0 -0
  49. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
  50. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
  51. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
  52. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
  53. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
  54. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/icons/gambit.png +0 -0
  55. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cards/icons/gambit_small.png +0 -0
  56. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/cli.py +0 -0
  57. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/client.py +0 -0
  58. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/config.py +0 -0
  59. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/core.py +0 -0
  60. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/core_assets.py +0 -0
  61. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/core_runtime.py +0 -0
  62. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/data_loader.py +0 -0
  63. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/data_loader_hdf5.py +0 -0
  64. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/data_loader_runtime.py +0 -0
  65. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/data_loader_summary.py +0 -0
  66. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/inner_func.py +0 -0
  67. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/memtrace.py +0 -0
  68. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/__init__.py +0 -0
  69. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/cmaps.py +0 -0
  70. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/dataframes.py +0 -0
  71. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/expression.py +0 -0
  72. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/interpolator.py +0 -0
  73. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/jarvisplot/utils/pathing.py +0 -0
  74. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/setup.cfg +0 -0
  75. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_data_loader_contracts.py +0 -0
  76. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_docs_status_labels.py +0 -0
  77. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_interpolator_contracts.py +0 -0
  78. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_parse_data_metadata.py +0 -0
  79. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_pathing_contracts.py +0 -0
  80. {jarvisplot-1.3.6 → jarvisplot-1.3.8}/tests/test_template_json.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 1.3.6
3
+ Version: 1.3.8
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -88,6 +88,29 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
88
88
 
89
89
  > **Note:** The data file paths inside the YAML files must be updated to match your local setup.
90
90
 
91
+ ### Example: Dynesty Runplot
92
+
93
+ Jarvis-PLOT includes a reusable dynesty runplot format. With a dataset named
94
+ `dynesty`, the figure can use the built-in card without writing axes or layer
95
+ details:
96
+
97
+ ```yaml
98
+ DataSet:
99
+ - name: dynesty
100
+ path: path/to/dynesty_result.csv
101
+ type: csv
102
+
103
+ Figures:
104
+ - name: dynesty_logL_vs_logX
105
+ enable: true
106
+ style:
107
+ - a4paper_2x1
108
+ - dynesty_runplot
109
+ ```
110
+
111
+ See `docs/specs/DYNESTY_RUNPLOT.md` for the default axes, KDE, scatter overlay,
112
+ and evidence summary behavior.
113
+
91
114
  ---
92
115
 
93
116
  ## Notes
@@ -26,6 +26,7 @@ jarvisplot/Figure/adapters_ternary.py
26
26
  jarvisplot/Figure/colorbar_runtime.py
27
27
  jarvisplot/Figure/config_runtime.py
28
28
  jarvisplot/Figure/data_pipelines.py
29
+ jarvisplot/Figure/dynesty_runtime.py
29
30
  jarvisplot/Figure/figure.py
30
31
  jarvisplot/Figure/helper.py
31
32
  jarvisplot/Figure/interp_natural_neighbor.py
@@ -41,6 +42,7 @@ jarvisplot/Figure/cards/std_axes_adapter_config.json
41
42
  jarvisplot/cards/args.json
42
43
  jarvisplot/cards/style_preference.json
43
44
  jarvisplot/cards/a4paper/1x1/ternary.json
45
+ jarvisplot/cards/a4paper/2x1/dynesty_runplot.json
44
46
  jarvisplot/cards/a4paper/2x1/rect.json
45
47
  jarvisplot/cards/a4paper/2x1/rect5x1.json
46
48
  jarvisplot/cards/a4paper/2x1/rect_cmap.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 1.3.6
3
+ Version: 1.3.8
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -88,6 +88,29 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
88
88
 
89
89
  > **Note:** The data file paths inside the YAML files must be updated to match your local setup.
90
90
 
91
+ ### Example: Dynesty Runplot
92
+
93
+ Jarvis-PLOT includes a reusable dynesty runplot format. With a dataset named
94
+ `dynesty`, the figure can use the built-in card without writing axes or layer
95
+ details:
96
+
97
+ ```yaml
98
+ DataSet:
99
+ - name: dynesty
100
+ path: path/to/dynesty_result.csv
101
+ type: csv
102
+
103
+ Figures:
104
+ - name: dynesty_logL_vs_logX
105
+ enable: true
106
+ style:
107
+ - a4paper_2x1
108
+ - dynesty_runplot
109
+ ```
110
+
111
+ See `docs/specs/DYNESTY_RUNPLOT.md` for the default axes, KDE, scatter overlay,
112
+ and evidence summary behavior.
113
+
91
114
  ---
92
115
 
93
116
  ## Notes
@@ -68,6 +68,29 @@ jplot ./bin/SUSYRun2_GEWMSSM.yaml
68
68
 
69
69
  > **Note:** The data file paths inside the YAML files must be updated to match your local setup.
70
70
 
71
+ ### Example: Dynesty Runplot
72
+
73
+ Jarvis-PLOT includes a reusable dynesty runplot format. With a dataset named
74
+ `dynesty`, the figure can use the built-in card without writing axes or layer
75
+ details:
76
+
77
+ ```yaml
78
+ DataSet:
79
+ - name: dynesty
80
+ path: path/to/dynesty_result.csv
81
+ type: csv
82
+
83
+ Figures:
84
+ - name: dynesty_logL_vs_logX
85
+ enable: true
86
+ style:
87
+ - a4paper_2x1
88
+ - dynesty_runplot
89
+ ```
90
+
91
+ See `docs/specs/DYNESTY_RUNPLOT.md` for the default axes, KDE, scatter overlay,
92
+ and evidence summary behavior.
93
+
71
94
  ---
72
95
 
73
96
  ## Notes
@@ -14,6 +14,8 @@ from .helper import _auto_clip, _mask_by_extend, voronoi_finite_polygons_2d, _cl
14
14
  from .profile_runtime import grid_profile_mesh
15
15
  from .interp_natural_neighbor import resolve_backend
16
16
 
17
+ DEFAULT_JP_SAMPLE_GRID = 500
18
+
17
19
 
18
20
  # —— Basic Adapter: Forward to the underlying Axes, merge default parameters, perform automatic clipping ——
19
21
 
@@ -207,7 +209,7 @@ class StdAxesAdapter:
207
209
  x,
208
210
  y,
209
211
  *,
210
- bin: int = 128,
212
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
211
213
  nx: Optional[int] = None,
212
214
  ny: Optional[int] = None,
213
215
  xlim=None,
@@ -218,8 +220,8 @@ class StdAxesAdapter:
218
220
  if x.shape[0] != y.shape[0]:
219
221
  raise ValueError("x and y must have the same length")
220
222
 
221
- nx_eff = self._coerce_positive_int(nx if nx is not None else bin, 128)
222
- ny_eff = self._coerce_positive_int(ny if ny is not None else bin, 128)
223
+ nx_eff = self._coerce_positive_int(nx if nx is not None else bin, DEFAULT_JP_SAMPLE_GRID)
224
+ ny_eff = self._coerce_positive_int(ny if ny is not None else bin, DEFAULT_JP_SAMPLE_GRID)
223
225
  x_norm = self._normalize_jpfield_axis("x", x, bounds=xlim)
224
226
  y_norm = self._normalize_jpfield_axis("y", y, bounds=ylim)
225
227
  xq = np.linspace(0.0, 1.0, nx_eff)
@@ -234,7 +236,7 @@ class StdAxesAdapter:
234
236
  z,
235
237
  *,
236
238
  interp_method: str = "natural_neighbor",
237
- bin: int = 128,
239
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
238
240
  nx: Optional[int] = None,
239
241
  ny: Optional[int] = None,
240
242
  xlim=None,
@@ -279,7 +281,7 @@ class StdAxesAdapter:
279
281
  x,
280
282
  y,
281
283
  *,
282
- bin: int = 128,
284
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
283
285
  nx: Optional[int] = None,
284
286
  ny: Optional[int] = None,
285
287
  xlim=None,
@@ -301,8 +303,8 @@ class StdAxesAdapter:
301
303
  except Exception:
302
304
  ylim = None
303
305
 
304
- nx_eff = self._coerce_positive_int(nx if nx is not None else bin, 128)
305
- ny_eff = self._coerce_positive_int(ny if ny is not None else bin, 128)
306
+ nx_eff = self._coerce_positive_int(nx if nx is not None else bin, DEFAULT_JP_SAMPLE_GRID)
307
+ ny_eff = self._coerce_positive_int(ny if ny is not None else bin, DEFAULT_JP_SAMPLE_GRID)
306
308
  xq = self._resolve_jpcontour_axis("x", x, npts=nx_eff, bounds=xlim)
307
309
  yq = self._resolve_jpcontour_axis("y", y, npts=ny_eff, bounds=ylim)
308
310
  return np.meshgrid(xq, yq)
@@ -314,7 +316,7 @@ class StdAxesAdapter:
314
316
  z,
315
317
  *,
316
318
  interp_method: str = "natural_neighbor",
317
- bin: int = 128,
319
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
318
320
  nx: Optional[int] = None,
319
321
  ny: Optional[int] = None,
320
322
  xlim=None,
@@ -323,13 +325,19 @@ class StdAxesAdapter:
323
325
  diagnostics: bool = False,
324
326
  backend_options: Optional[dict[str, Any]] = None,
325
327
  ):
328
+ """Interpolate scattered data on an axes-fraction grid for contour rendering.
329
+
330
+ This keeps jpcontour/jpcontourf aligned with jpfield: coordinates are
331
+ normalized into the current Axes frame before interpolation, then the
332
+ contour artist is drawn with transform=ax.transAxes.
333
+ """
326
334
  x = np.asarray(x, dtype=float).reshape(-1)
327
335
  y = np.asarray(y, dtype=float).reshape(-1)
328
336
  z = np.asarray(z, dtype=float).reshape(-1)
329
337
  if x.shape[0] != y.shape[0] or x.shape[0] != z.shape[0]:
330
338
  raise ValueError("x, y, and z must have the same length")
331
339
 
332
- X, Y = self._build_jpcontour_grid(
340
+ X, Y, x_norm, y_norm = self._build_jpfield_grid(
333
341
  x,
334
342
  y,
335
343
  bin=bin,
@@ -345,8 +353,8 @@ class StdAxesAdapter:
345
353
  f"Unsupported jpcontour interpolation backend: {interp_method!r}"
346
354
  ) from exc
347
355
  Z = backend(
348
- x,
349
- y,
356
+ x_norm,
357
+ y_norm,
350
358
  z,
351
359
  X,
352
360
  Y,
@@ -489,7 +497,7 @@ class StdAxesAdapter:
489
497
  z,
490
498
  *args,
491
499
  interp_method: str = "natural_neighbor",
492
- bin: int = 128,
500
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
493
501
  nx: Optional[int] = None,
494
502
  ny: Optional[int] = None,
495
503
  xlim=None,
@@ -499,7 +507,9 @@ class StdAxesAdapter:
499
507
  backend_options: Optional[dict[str, Any]] = None,
500
508
  **kwargs,
501
509
  ):
510
+ """Scattered-data contour plot rendered in axes-fraction coordinates."""
502
511
  kw = self._merge("contour", kwargs)
512
+ kw.pop("transform", None)
503
513
  X, Y, Z = self._interpolate_jpcontour_grid(
504
514
  x,
505
515
  y,
@@ -514,7 +524,14 @@ class StdAxesAdapter:
514
524
  diagnostics=diagnostics,
515
525
  backend_options=backend_options,
516
526
  )
517
- artists = self.ax.contour(X, Y, np.ma.masked_invalid(Z), *args, **kw)
527
+ artists = self.ax.contour(
528
+ X,
529
+ Y,
530
+ np.ma.masked_invalid(Z),
531
+ *args,
532
+ transform=self.ax.transAxes,
533
+ **kw,
534
+ )
518
535
  return _auto_clip(artists, self.ax, self._clip_path)
519
536
 
520
537
  def jpcontourf(
@@ -524,7 +541,7 @@ class StdAxesAdapter:
524
541
  z,
525
542
  *args,
526
543
  interp_method: str = "natural_neighbor",
527
- bin: int = 500,
544
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
528
545
  nx: Optional[int] = None,
529
546
  ny: Optional[int] = None,
530
547
  xlim=None,
@@ -534,7 +551,9 @@ class StdAxesAdapter:
534
551
  backend_options: Optional[dict[str, Any]] = None,
535
552
  **kwargs,
536
553
  ):
554
+ """Filled scattered-data contour plot rendered in axes-fraction coordinates."""
537
555
  kw = self._merge("contourf", kwargs)
556
+ kw.pop("transform", None)
538
557
  X, Y, Z = self._interpolate_jpcontour_grid(
539
558
  x,
540
559
  y,
@@ -549,7 +568,14 @@ class StdAxesAdapter:
549
568
  diagnostics=diagnostics,
550
569
  backend_options=backend_options,
551
570
  )
552
- artists = self.ax.contourf(X, Y, np.ma.masked_invalid(Z), *args, **kw)
571
+ artists = self.ax.contourf(
572
+ X,
573
+ Y,
574
+ np.ma.masked_invalid(Z),
575
+ *args,
576
+ transform=self.ax.transAxes,
577
+ **kw,
578
+ )
553
579
  return _auto_clip(artists, self.ax, self._clip_path)
554
580
 
555
581
  def jpfield(
@@ -559,7 +585,7 @@ class StdAxesAdapter:
559
585
  z,
560
586
  *args,
561
587
  interp_method: str = "natural_neighbor",
562
- bin: int = 128,
588
+ bin: int = DEFAULT_JP_SAMPLE_GRID,
563
589
  nx: Optional[int] = None,
564
590
  ny: Optional[int] = None,
565
591
  xlim=None,
@@ -68,6 +68,8 @@ def apply_figure_config(fig, info: Mapping) -> bool:
68
68
 
69
69
  if "layers" in info:
70
70
  fig.layers = info["layers"]
71
+ elif getattr(fig, "_default_layers", None):
72
+ fig.layers = fig._default_layers
71
73
 
72
74
  fig._setup_status = "ok"
73
75
  return True