jarvisplot 2.1.13__tar.gz → 2.1.14__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 (335) hide show
  1. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/CHANGELOG.md +12 -0
  2. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/PKG-INFO +2 -2
  3. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/SOURCES.txt +1 -0
  4. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/PKG-INFO +2 -2
  5. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/README.md +1 -1
  6. jarvisplot-2.1.14/VERSION +1 -0
  7. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adapters_rect.py +17 -6
  8. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/layer_runtime.py +1 -1
  9. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/preprocessor_runtime.py +1 -1
  10. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader.py +30 -17
  11. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_runtime.py +2 -0
  12. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/diagnostic_guidance.py +1 -1
  13. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/dryrun_runtime.py +38 -23
  14. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/render_health.py +3 -0
  15. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/transform_contracts.py +1 -4
  16. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/expression.py +9 -1
  17. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/validation.py +33 -2
  18. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/doctor.py +3 -1
  19. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/pyproject.toml +1 -1
  20. jarvisplot-2.1.14/tests/test_review_regressions.py +163 -0
  21. jarvisplot-2.1.13/VERSION +0 -1
  22. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/README.md +0 -0
  23. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/a4paper_2x1.yaml +0 -0
  24. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/a4paper_4x1_rectcmap.yaml +0 -0
  25. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/compact_legend.yaml +0 -0
  26. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/correlation_demo.csv +0 -0
  27. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/correlation_demo_wide.csv +0 -0
  28. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_diamond.yaml +0 -0
  29. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_matrix.yaml +0 -0
  30. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/corrplot_scales.yaml +0 -0
  31. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/README.md +0 -0
  32. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/box.yaml +0 -0
  33. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/box.csv +0 -0
  34. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/forest-points.csv +0 -0
  35. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/forest-rows.csv +0 -0
  36. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/interval.csv +0 -0
  37. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/points.csv +0 -0
  38. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-intervals.csv +0 -0
  39. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-labels.csv +0 -0
  40. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-points.csv +0 -0
  41. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/data/summary-rows.csv +0 -0
  42. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/interval.yaml +0 -0
  43. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/intervals-only.yaml +0 -0
  44. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/multi-interval.yaml +0 -0
  45. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/real-demo-debug.yaml +0 -0
  46. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/forest/real-demo.yaml +0 -0
  47. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/gambit_2x1.yaml +0 -0
  48. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/generated_data.yaml +0 -0
  49. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/legend_cards.yaml +0 -0
  50. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/pdf_cdf_1d.yaml +0 -0
  51. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/Example/ternary_1x1.yaml +0 -0
  52. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/dependency_links.txt +0 -0
  53. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/entry_points.txt +0 -0
  54. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/requires.txt +0 -0
  55. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/JarvisPLOT.egg-info/top_level.txt +0 -0
  56. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/MANIFEST.in +0 -0
  57. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/__init__.py +0 -0
  58. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adapters_ternary.py +0 -0
  59. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/adaptive_cdf_runtime.py +0 -0
  60. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/bin_stat_runtime.py +0 -0
  61. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/cards/std_axes_adapter_config.json +0 -0
  62. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/colorbar_runtime.py +0 -0
  63. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/config_runtime.py +0 -0
  64. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_layout.py +0 -0
  65. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_layout_diamond.py +0 -0
  66. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corr_order.py +0 -0
  67. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/correlation_runtime.py +0 -0
  68. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/corrplot_runtime.py +0 -0
  69. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/data_pipelines.py +0 -0
  70. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/debug_config.py +0 -0
  71. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/density_cell_runtime.py +0 -0
  72. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/design_runtime.py +0 -0
  73. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/distribution_1d_runtime.py +0 -0
  74. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/dynesty_runtime.py +0 -0
  75. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/figure.py +0 -0
  76. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/figure_types.py +0 -0
  77. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_debug.py +0 -0
  78. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_legend.py +0 -0
  79. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/forest_runtime.py +0 -0
  80. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/helper.py +0 -0
  81. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_2d_runtime.py +0 -0
  82. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_natural_neighbor.py +0 -0
  83. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/interp_natural_neighbor_exact.py +0 -0
  84. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/layout_runtime.py +0 -0
  85. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/legend_runtime.py +0 -0
  86. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/method_registry.py +0 -0
  87. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_density_runtime.py +0 -0
  88. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_hpd.py +0 -0
  89. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/posterior_mesh.py +0 -0
  90. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/preprocessor.py +0 -0
  91. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/profile_runtime.py +0 -0
  92. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/significance_runtime.py +0 -0
  93. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/Figure/style_runtime.py +0 -0
  94. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/__init__.py +0 -0
  95. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/agent_digest.py +0 -0
  96. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/agent_io.py +0 -0
  97. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cache_registry.py +0 -0
  98. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cache_store.py +0 -0
  99. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/capabilities.py +0 -0
  100. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/1x1/ternary.json +0 -0
  101. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/dynesty_runplot.json +0 -0
  102. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect.json +0 -0
  103. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect5x1.json +0 -0
  104. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect_cmap.json +0 -0
  105. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rect_marginal.json +0 -0
  106. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/rectratio.json +0 -0
  107. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/ternary.json +0 -0
  108. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/2x1/ternary_cmap.json +0 -0
  109. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/rect.json +0 -0
  110. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/rect_cmap.json +0 -0
  111. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/ternary.json +0 -0
  112. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/a4paper/4x1/ternary_cmap.json +0 -0
  113. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/args.json +0 -0
  114. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/colors/colormaps.json +0 -0
  115. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/corrplot/diamond.json +0 -0
  116. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/corrplot/matrix.json +0 -0
  117. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/default/output.json +0 -0
  118. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/flowchart/default.json +0 -0
  119. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/fonts/default.json +0 -0
  120. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/forest/swiss_column.json +0 -0
  121. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/1x1/ternary.json +0 -0
  122. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/rect_cmap.json +0 -0
  123. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/ternary.json +0 -0
  124. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/gambit/2x1/ternary_cmap.json +0 -0
  125. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/JarvisHEP.png +0 -0
  126. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/JarvisHEP.png +0 -0
  127. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/calculator.png +0 -0
  128. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/inputfile.png +0 -0
  129. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/opera.png +0 -0
  130. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/outputfile.png +0 -0
  131. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/flowchart/sampler.png +0 -0
  132. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/gambit.png +0 -0
  133. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/icons/gambit_small.png +0 -0
  134. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/compact/legend-card.json +0 -0
  135. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/default/legend-card.json +0 -0
  136. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/paper/legend-card.json +0 -0
  137. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/legends/presentation/legend-card.json +0 -0
  138. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cards/style_preference.json +0 -0
  139. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cli.py +0 -0
  140. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/cli_help.py +0 -0
  141. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/client.py +0 -0
  142. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/column_demand.py +0 -0
  143. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/column_probe.py +0 -0
  144. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/config.py +0 -0
  145. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/config_address.py +0 -0
  146. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core.py +0 -0
  147. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core_assets.py +0 -0
  148. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/core_runtime.py +0 -0
  149. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_access.py +0 -0
  150. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_generation_contracts.py +0 -0
  151. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_hdf5.py +0 -0
  152. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/data_loader_summary.py +0 -0
  153. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/dataset_types.py +0 -0
  154. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/diagnostics.py +0 -0
  155. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/distribution_1d_config.py +0 -0
  156. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/expr_names.py +0 -0
  157. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/flowchart.py +0 -0
  158. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/font_runtime.py +0 -0
  159. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/fonts.py +0 -0
  160. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/forest_contract.py +0 -0
  161. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/forest_text.py +0 -0
  162. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/generated_data.py +0 -0
  163. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/inner_func.py +0 -0
  164. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/legend_cards.py +0 -0
  165. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_catalog.py +0 -0
  166. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_methods.py +0 -0
  167. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_render_agent.py +0 -0
  168. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_render_human.py +0 -0
  169. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/man_transforms.py +0 -0
  170. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/agent-output.yaml +0 -0
  171. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/agent-readme.yaml +0 -0
  172. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/cache.yaml +0 -0
  173. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/cli-map.yaml +0 -0
  174. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/data-columns.yaml +0 -0
  175. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/debug-overlay.yaml +0 -0
  176. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/diagnostics.yaml +0 -0
  177. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/doctor.yaml +0 -0
  178. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/dryrun-viz.yaml +0 -0
  179. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/field-interp.yaml +0 -0
  180. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/fonts.yaml +0 -0
  181. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/generated-data.yaml +0 -0
  182. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/layer-method.yaml +0 -0
  183. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/legend.yaml +0 -0
  184. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/manifest.yaml +0 -0
  185. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/method_notes.yaml +0 -0
  186. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/style-axes.yaml +0 -0
  187. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-correlation-matrix.yaml +0 -0
  188. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-forest.yaml +0 -0
  189. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-posterior-2d.yaml +0 -0
  190. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/type-profile-2d.yaml +0 -0
  191. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/workflow.yaml +0 -0
  192. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/manual_cards/yaml-root.yaml +0 -0
  193. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/memtrace.py +0 -0
  194. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/method_contracts.py +0 -0
  195. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/common.json +0 -0
  196. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/dataset.json +0 -0
  197. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/distribution-1d.json +0 -0
  198. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/figure.json +0 -0
  199. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/generated-data.json +0 -0
  200. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/layer.json +0 -0
  201. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/legend-card.json +0 -0
  202. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/legend.json +0 -0
  203. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/core/transform.json +0 -0
  204. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/manifest.json +0 -0
  205. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/bar.json +0 -0
  206. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/barh.json +0 -0
  207. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/contour.json +0 -0
  208. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/contourf.json +0 -0
  209. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/corrplot.json +0 -0
  210. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/dynesty_runplot.json +0 -0
  211. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/errorbar.json +0 -0
  212. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill.json +0 -0
  213. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill_between.json +0 -0
  214. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/fill_betweenx.json +0 -0
  215. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/hist.json +0 -0
  216. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/hist2d.json +0 -0
  217. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/imshow.json +0 -0
  218. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpcontour.json +0 -0
  219. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpcontourf.json +0 -0
  220. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/jpfield.json +0 -0
  221. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/pcolor.json +0 -0
  222. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/pcolormesh.json +0 -0
  223. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/plot.json +0 -0
  224. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/quiver.json +0 -0
  225. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/scatter.json +0 -0
  226. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/stairs.json +0 -0
  227. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/step.json +0 -0
  228. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tricontour.json +0 -0
  229. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tricontourf.json +0 -0
  230. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tripcolor.json +0 -0
  231. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/tripcolor_axes.json +0 -0
  232. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/triplot.json +0 -0
  233. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/voronoi.json +0 -0
  234. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/methods/voronoif.json +0 -0
  235. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/plot-config.json +0 -0
  236. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema/types/forest.json +0 -0
  237. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema_catalog.py +0 -0
  238. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/schema_diagnostics.py +0 -0
  239. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/templates_catalog.py +0 -0
  240. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/__init__.py +0 -0
  241. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/cmaps.py +0 -0
  242. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/dataframes.py +0 -0
  243. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/interpolator.py +0 -0
  244. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/utils/pathing.py +0 -0
  245. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/__init__.py +0 -0
  246. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/cache.py +0 -0
  247. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/cap.py +0 -0
  248. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/config_cmd.py +0 -0
  249. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/data.py +0 -0
  250. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/dryrun.py +0 -0
  251. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/explain.py +0 -0
  252. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/fonts.py +0 -0
  253. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/man.py +0 -0
  254. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/suggest.py +0 -0
  255. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/verbs/template.py +0 -0
  256. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/version.py +0 -0
  257. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/jarvisplot/yaml_io.py +0 -0
  258. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/setup.cfg +0 -0
  259. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/conftest.py +0 -0
  260. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_adaptive_cdf.py +0 -0
  261. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_add_column.py +0 -0
  262. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_agent_digest.py +0 -0
  263. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_agent_envelope.py +0 -0
  264. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_axis_title.py +0 -0
  265. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_cleanup.py +0 -0
  266. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_policy.py +0 -0
  267. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cache_registry.py +0 -0
  268. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_capabilities.py +0 -0
  269. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_card_debug_shape.py +0 -0
  270. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cli_help.py +0 -0
  271. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cli_verbs.py +0 -0
  272. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_cmaps.py +0 -0
  273. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_column_existence.py +0 -0
  274. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_column_pruning.py +0 -0
  275. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_addressing.py +0 -0
  276. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_edit.py +0 -0
  277. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_config_expand.py +0 -0
  278. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_correlation_runtime.py +0 -0
  279. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_corrplot.py +0 -0
  280. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_access.py +0 -0
  281. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_describe.py +0 -0
  282. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_head_eval.py +0 -0
  283. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_loader_contracts.py +0 -0
  284. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_data_pipelines.py +0 -0
  285. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_config.py +0 -0
  286. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_switches.py +0 -0
  287. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_debug_yaml_override.py +0 -0
  288. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_density_cell_transform.py +0 -0
  289. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_design_runtime.py +0 -0
  290. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_diagnostic_guidance.py +0 -0
  291. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_distribution_1d_transform.py +0 -0
  292. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_doctor_partial.py +0 -0
  293. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_examples_validate.py +0 -0
  294. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_explain.py +0 -0
  295. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_expression_semantics.py +0 -0
  296. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_figure_contracts.py +0 -0
  297. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_figure_type_expander.py +0 -0
  298. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_flowchart_renderer.py +0 -0
  299. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_font_runtime.py +0 -0
  300. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_fonts.py +0 -0
  301. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_fonts_cli.py +0 -0
  302. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest.py +0 -0
  303. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_examples.py +0 -0
  304. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_legend.py +0 -0
  305. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_forest_text.py +0 -0
  306. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_generated_data.py +0 -0
  307. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_imshow_adapter.py +0 -0
  308. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interp_2d_transform.py +0 -0
  309. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interp_natural_neighbor.py +0 -0
  310. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_interpolator_contracts.py +0 -0
  311. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_jpcontour_methods.py +0 -0
  312. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_layer_legend.py +0 -0
  313. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_legend_cards.py +0 -0
  314. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_legend_runtime.py +0 -0
  315. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_man_cli.py +0 -0
  316. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_method_contracts.py +0 -0
  317. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_parse_data_metadata.py +0 -0
  318. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_pathing_contracts.py +0 -0
  319. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_posterior_hpd.py +0 -0
  320. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_profile_runtime.py +0 -0
  321. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_release_contract.py +0 -0
  322. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_defects.py +0 -0
  323. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_health.py +0 -0
  324. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_render_lifecycle.py +0 -0
  325. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_row_ledger.py +0 -0
  326. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_savefig_provenance.py +0 -0
  327. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_schema_catalog.py +0 -0
  328. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_suggest.py +0 -0
  329. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_suggest_axes.py +0 -0
  330. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_template_catalog.py +0 -0
  331. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_ternary_debug.py +0 -0
  332. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_transform_contracts.py +0 -0
  333. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_validation_imports.py +0 -0
  334. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tests/test_version.py +0 -0
  335. {jarvisplot-2.1.13 → jarvisplot-2.1.14}/tools/check_release.py +0 -0
@@ -4,6 +4,18 @@ Release history of the `JarvisPLOT` distribution (import package `jarvisplot`,
4
4
  CLI `jplot`). User guides and reference documentation are available in
5
5
  [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
6
6
 
7
+ ## 2.1.14
8
+
9
+ ### Fixed
10
+
11
+ - Render `pcolor` from named coordinates and keep Voronoi boundary fills from
12
+ acquiring Matplotlib's default cycle colour.
13
+ - Load CSV path lists and apply `add_column.fillna` consistently across backends.
14
+ - Allow unambiguous HDF5 leaf names in expressions while retaining full paths.
15
+ - Make doctor honor HDF5 renaming and validity masks, load Functions, count literal
16
+ coordinates, detect missing style axes and avoid duplicate path diagnostics.
17
+ - Advertise only supported `make_interp_2d` methods in capability metadata.
18
+
7
19
  ## 2.1.13 — 2026-10-29
8
20
  ### Fixed
9
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 2.1.13
3
+ Version: 2.1.14
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -30,7 +30,7 @@ but it can also be used as a **standalone scientific plotting tool**.
30
30
 
31
31
  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.
32
32
 
33
- Current source candidate: **2.1.13** (`jplot -v` reports the installed version).
33
+ Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
34
34
  Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
35
35
 
36
36
  ---
@@ -318,6 +318,7 @@ tests/test_release_contract.py
318
318
  tests/test_render_defects.py
319
319
  tests/test_render_health.py
320
320
  tests/test_render_lifecycle.py
321
+ tests/test_review_regressions.py
321
322
  tests/test_row_ledger.py
322
323
  tests/test_savefig_provenance.py
323
324
  tests/test_schema_catalog.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: JarvisPLOT
3
- Version: 2.1.13
3
+ Version: 2.1.14
4
4
  Summary: Jarvis-PLOT: YAML-driven plotting engine
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -30,7 +30,7 @@ but it can also be used as a **standalone scientific plotting tool**.
30
30
 
31
31
  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.
32
32
 
33
- Current source candidate: **2.1.13** (`jplot -v` reports the installed version).
33
+ Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
34
34
  Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
35
35
 
36
36
  ---
@@ -5,7 +5,7 @@ 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
- Current source candidate: **2.1.13** (`jplot -v` reports the installed version).
8
+ Current source candidate: **2.1.14** (`jplot -v` reports the installed version).
9
9
  Release history: [CHANGELOG.md](https://github.com/Pengxuan-Zhu-Phys/Jarvis-PLOT/blob/main/CHANGELOG.md). Design documents and specifications: [Jarvis-Books `Docs/Jarvis-PLOT/`](https://github.com/Pengxuan-Zhu-Phys/Jarvis-Books/blob/main/Docs/Jarvis-PLOT/README.md).
10
10
 
11
11
  ---
@@ -0,0 +1 @@
1
+ 2.1.14
@@ -379,18 +379,24 @@ class StdAxesAdapter:
379
379
  artists = self.ax.scatter(x, y, **kw)
380
380
  return _auto_clip(artists, self.ax, self._clip_path)
381
381
 
382
+ def pcolor(self, *args, **kwargs):
383
+ return self._quadmesh("pcolor", args, kwargs)
384
+
382
385
  def pcolormesh(self, *args, **kwargs):
383
- """Render regular-grid fields, including compact tables with __grid_* metadata."""
386
+ return self._quadmesh("pcolormesh", args, kwargs)
387
+
388
+ def _quadmesh(self, method, args, kwargs):
389
+ """Render either quad-mesh method from coordinates or a compact grid table."""
384
390
  if args:
385
- kw = self._merge("pcolormesh", kwargs)
386
- artist = self.ax.pcolormesh(*args, **kw)
391
+ kw = self._merge(method, kwargs)
392
+ artist = getattr(self.ax, method)(*args, **kw)
387
393
  return _auto_clip(artist, self.ax, self._clip_path)
388
394
 
389
395
  x = np.asarray(kwargs.pop("x"), dtype=float)
390
396
  y = np.asarray(kwargs.pop("y"), dtype=float)
391
397
  z = np.asarray(kwargs.pop("z", np.zeros_like(x)), dtype=float)
392
398
  df = kwargs.pop("__df__", None)
393
- kw = self._merge("pcolormesh", kwargs)
399
+ kw = self._merge(method, kwargs)
394
400
 
395
401
  # Strip kwargs that are not used by pcolormesh rendering.
396
402
  for k in ("shading", "levels", "extend", "space", "marker", "s", "c"):
@@ -451,7 +457,7 @@ class StdAxesAdapter:
451
457
  kw.setdefault("zorder", zorder)
452
458
 
453
459
  if norm is not None:
454
- artist = self.ax.pcolormesh(
460
+ artist = getattr(self.ax, method)(
455
461
  x_edges,
456
462
  y_edges,
457
463
  grid,
@@ -460,7 +466,7 @@ class StdAxesAdapter:
460
466
  **kw,
461
467
  )
462
468
  else:
463
- artist = self.ax.pcolormesh(
469
+ artist = getattr(self.ax, method)(
464
470
  x_edges,
465
471
  y_edges,
466
472
  grid,
@@ -1251,6 +1257,11 @@ class StdAxesAdapter:
1251
1257
  kw_edge, kw_face, kw_rest = split_fill_kwargs(kw_all)
1252
1258
  kw_edge.update(kw_rest)
1253
1259
  kw_face.update(kw_rest)
1260
+ if "color" in kw_all:
1261
+ kw_edge.setdefault("facecolor", kw_all["color"])
1262
+ kw_face.setdefault("facecolor", kw_all["color"])
1263
+ elif "facecolor" not in kw_edge and "fc" not in kw_edge:
1264
+ kw_edge["facecolor"] = kw_all.get("edgecolor", kw_all.get("ec", "none"))
1254
1265
  # ---- inputs ----
1255
1266
  x = _np.asarray(x)
1256
1267
  y = _np.asarray(y)
@@ -32,7 +32,7 @@ _MISSING_CLIP_PATH = object()
32
32
  #: coordinates: the grid methods read the ``__grid_*`` metadata off it, and
33
33
  #: corrplot reads the whole correlation table -- var names, indices, rho and
34
34
  #: the per-pair row count that significance is computed from.
35
- _GRID_TABLE_METHODS = frozenset({"pcolormesh", "imshow", "corrplot"})
35
+ _GRID_TABLE_METHODS = frozenset({"pcolor", "pcolormesh", "imshow", "corrplot"})
36
36
 
37
37
  def _normalize_layer_combine(value) -> str:
38
38
  """Return the canonical combine spelling while keeping v1 YAML usable."""
@@ -280,7 +280,7 @@ def add_column(df, adds, logger):
280
280
  return df
281
281
  name = str(adds.get("name")).strip()
282
282
  expr = adds.get("expr")
283
- value = eval_dataframe_expression(df, expr, logger=logger, allow_column=True)
283
+ value = eval_dataframe_expression(df, expr, logger=logger, allow_column=True, fillna=adds.get("fillna"))
284
284
  # The frame may be a table other blocks still read (a preprofile pass
285
285
  # works on the source itself); add to a copy, never into the caller's.
286
286
  df = df.copy(deep=False)
@@ -25,6 +25,7 @@ JP_ROW_IDX = "__jp_row_idx__"
25
25
 
26
26
  class DataSet():
27
27
  def __init__(self):
28
+ self.paths: list[str] = []
28
29
  self._file: Optional[str] = None
29
30
  self.path: Optional[str] = None
30
31
  self.rootpath: Optional[str] = None
@@ -62,9 +63,14 @@ class DataSet():
62
63
  # transforms (see the ``to_df`` / ``to_ds`` steps).
63
64
  self.file = None
64
65
  else:
65
- raw_path = str(dtinfo['path'])
66
- resolved = resolve_project_path(raw_path, base_dir=rootpath or ".")
67
- self.file = str(resolved)
66
+ raw_paths = dtinfo['path'] if isinstance(dtinfo['path'], list) else [dtinfo['path']]
67
+ paths = [str(resolve_project_path(path, base_dir=rootpath or ".")) for path in raw_paths]
68
+ if not paths:
69
+ raise ValueError("DataSet.path must contain at least one file")
70
+ if len(paths) > 1 and declared_type != "csv":
71
+ raise ValueError("DataSet.path lists currently require type: csv")
72
+ self.file = paths[0]
73
+ self.paths = paths
68
74
  self.name = dtinfo['name']
69
75
  self.type = declared_type
70
76
  self.transform = dtinfo.get("transform", None)
@@ -118,7 +124,8 @@ class DataSet():
118
124
  if not wanted:
119
125
  return None
120
126
  names = [str(c) for c in available]
121
- keep = [c for c in names if c in wanted]
127
+ keep = [c for c in names if c in wanted or
128
+ (self.type == "hdf5" and c.rsplit("/", 1)[-1].rsplit(":", 1)[-1] in wanted)]
122
129
  if not any(c != JP_ROW_IDX for c in keep) or len(keep) == len(names):
123
130
  return None
124
131
  return keep
@@ -134,8 +141,8 @@ class DataSet():
134
141
  """Fetch cheap metadata only; avoid full table load."""
135
142
  if self.type == "csv":
136
143
  try:
137
- head = pd.read_csv(self.path, nrows=0)
138
- self.keys = list(head.columns)
144
+ self.keys = list(dict.fromkeys(column for path in (self.paths or [self.path])
145
+ for column in pd.read_csv(path, nrows=0).columns))
139
146
  if self.logger:
140
147
  self.logger.debug(
141
148
  f"Dataset '{self.name}' registered in lazy mode (csv columns={len(self.keys)})."
@@ -182,6 +189,8 @@ class DataSet():
182
189
  "transform": self.transform,
183
190
  "columns": self.columns,
184
191
  "full_load": bool(getattr(self, "full_load", False)),
192
+ "sources": [(path, os.stat(path).st_size, os.stat(path).st_mtime_ns)
193
+ for path in self.paths if os.path.isfile(path)],
185
194
  }
186
195
  from .distribution_1d_config import distribution_kind
187
196
 
@@ -396,13 +405,15 @@ class DataSet():
396
405
 
397
406
  @file.setter
398
407
  def file(self, value: Optional[str]) -> None:
399
- if value is None:
408
+ if value is None:
409
+ self.paths = []
400
410
  self._file = None
401
411
  self.path = None
402
412
  self.base = None
403
413
  return
404
414
 
405
415
  p = Path(value).expanduser().resolve()
416
+ self.paths = [str(p)]
406
417
  self._file = str(p)
407
418
  self.path = os.path.abspath(p)
408
419
  self.base = os.path.basename(p)
@@ -426,21 +437,23 @@ class DataSet():
426
437
  # of the table: dropping them here would silently apply a policy
427
438
  # across every column before an explicit transform can decide how
428
439
  # required and optional fields should be handled.
429
- usecols = None
440
+ selected = None
430
441
  if self.required_columns:
431
- header = list(pd.read_csv(self.path, nrows=0).columns)
442
+ header = list(dict.fromkeys(column for path in (self.paths or [self.path])
443
+ for column in pd.read_csv(path, nrows=0).columns))
432
444
  planned = self.planned_columns(header)
433
445
  if planned is not None:
434
- # By position: the names above are pandas' own (duplicated
435
- # headers already read as x, x.1), not the raw header text.
436
- wanted = set(planned)
437
- usecols = [i for i, name in enumerate(header) if str(name) in wanted]
438
- self._log_column_plan(len(usecols), len(header))
439
- self.data = pd.read_csv(
440
- self.path, low_memory=False, usecols=usecols,
446
+ # Union headers allow each input to omit columns supplied
447
+ # by another file; pandas keeps its duplicate-name handling.
448
+ selected = set(planned)
449
+ self._log_column_plan(len(selected), len(header))
450
+ frames = [pd.read_csv(
451
+ path, low_memory=False,
452
+ usecols=(lambda name: name in selected) if selected is not None else None,
441
453
  dtype={name: str for name in self.literal_columns},
442
454
  keep_default_na=not self.preserve_empty_strings,
443
- )
455
+ ) for path in (self.paths or [self.path])]
456
+ self.data = pd.concat(frames, ignore_index=True, sort=False) if len(frames) > 1 else frames[0]
444
457
  self.keys = list(self.data.columns)
445
458
  runtime.apply_dataset_transform(self, stage="csv")
446
459
 
@@ -419,6 +419,8 @@ def _apply_dataset_transform_polars(
419
419
  lf = lf.with_columns(key.alias(skey)).sort(skey).drop(skey)
420
420
  elif "add_column" in trans:
421
421
  adds = trans.get("add_column", {})
422
+ if isinstance(adds, dict) and adds.get("fillna") is not None:
423
+ raise TypeError("add_column.fillna requires the shared pandas evaluator")
422
424
  if not isinstance(adds, dict):
423
425
  raise TypeError("add_column step must be dict")
424
426
  problem = add_column_spec_problem(adds)
@@ -103,7 +103,7 @@ _GUIDANCE_BY_CODE: dict[str, tuple[str, Optional[str]]] = {
103
103
  # Data / figures / refs
104
104
  "JP-DAT-004": (
105
105
  "Paths resolve relative to the config file's directory "
106
- "(or use the &JP/ prefix for package-relative paths).",
106
+ "(or use the &JP/ prefix for bundled resource paths).",
107
107
  "path: ./DATABASE/samples.csv",
108
108
  ),
109
109
  "JP-DAT-005": (
@@ -152,6 +152,11 @@ def _dryrun_config(
152
152
  "type_expanded": [],
153
153
  }, bag
154
154
 
155
+ from .core_assets import load_interpolators
156
+ try:
157
+ load_interpolators(work, yaml_dir=base_dir)
158
+ except Exception as exc:
159
+ bag.error("JP-VIZ-003", "$.Functions", f"could not load Functions: {exc}")
155
160
  datasets_meta, frames = _load_datasets(work, base_dir=base_dir, bag=bag)
156
161
  forest_layouts = []
157
162
  observations: list[LayerObservation] = []
@@ -356,29 +361,34 @@ def _load_datasets(
356
361
  meta[name] = {"path": None, "rows": 0, "in_memory": True}
357
362
  continue
358
363
  raw_path = entry.get("path")
359
- if not isinstance(raw_path, str):
360
- bag.warning(
361
- "JP-DAT-004",
362
- f"$.DataSet[{index}].path",
363
- f"dataset {name!r} has no single string path; dryrun skips it",
364
- )
364
+ paths = raw_path if isinstance(raw_path, list) else [raw_path]
365
+ if not paths or not all(isinstance(path, str) for path in paths):
366
+ bag.error("JP-DAT-004", f"$.DataSet[{index}].path", f"dataset {name!r} needs a path or path list")
365
367
  continue
366
- resolved = resolve_project_path(raw_path, base_dir)
367
- if not Path(resolved).exists():
368
- bag.error(
369
- "JP-DAT-004",
370
- f"$.DataSet[{index}].path",
371
- f"data file not found: {resolved}",
372
- )
373
- meta[name] = {"path": str(resolved), "rows": None, "error": "missing"}
368
+ resolved = [resolve_project_path(path, base_dir) for path in paths]
369
+ missing = [path for path in resolved if not path.exists()]
370
+ if missing:
371
+ bag.error("JP-DAT-004", f"$.DataSet[{index}].path", f"data file not found: {missing[0]}")
372
+ meta[name] = {"path": str(missing[0]), "rows": None, "error": "missing"}
373
+ continue
374
+ kind = str(entry.get("type") or detect_type(str(resolved[0]), "auto"))
375
+ display_path = str(resolved[0]) if len(resolved) == 1 else [str(path) for path in resolved]
376
+ if len(resolved) > 1 and kind != "csv":
377
+ bag.error("JP-DAT-006", f"$.DataSet[{index}].path", "DataSet.path lists currently require type: csv")
374
378
  continue
375
- kind = str(entry.get("type") or detect_type(str(resolved), "auto"))
376
379
  try:
377
- df = load_dataframe(
378
- str(resolved),
379
- kind=kind if kind in {"csv", "parquet", "hdf5"} else "csv",
380
- group=entry.get("dataset") if isinstance(entry.get("dataset"), str) else None,
381
- )
380
+ if kind == "hdf5":
381
+ import logging
382
+ from .data_loader import DataSet
383
+ loader = DataSet()
384
+ loader.logger = logging.getLogger("jarvisplot.dryrun.data")
385
+ spec = dict(entry)
386
+ spec.pop("transform", None)
387
+ loader.setinfo(spec, rootpath=base_dir, eager=True)
388
+ df = loader.get_data()
389
+ else:
390
+ tables = [load_dataframe(str(path), kind=kind) for path in resolved]
391
+ df = pd.concat(tables, ignore_index=True, sort=False) if len(tables) > 1 else tables[0]
382
392
  # dataset-level transform (simple steps only)
383
393
  _heavy = []
384
394
  ds_transform = entry.get("transform")
@@ -387,7 +397,7 @@ def _load_datasets(
387
397
  rows = int(len(df))
388
398
  frames[name] = df
389
399
  meta[name] = {
390
- "path": str(resolved),
400
+ "path": display_path,
391
401
  "type": kind,
392
402
  "rows": rows,
393
403
  "columns": [str(c) for c in df.columns],
@@ -399,7 +409,7 @@ def _load_datasets(
399
409
  f"$.DataSet[{index}]",
400
410
  f"could not load dataset {name!r}: {exc}",
401
411
  )
402
- meta[name] = {"path": str(resolved), "rows": None, "error": str(exc)}
412
+ meta[name] = {"path": display_path, "rows": None, "error": str(exc)}
403
413
  return meta, frames
404
414
 
405
415
 
@@ -598,6 +608,11 @@ def _observe_layer(
598
608
  incomplete_sources = incomplete_sources or set()
599
609
  data_blocks = layer.get("data") or []
600
610
  if not isinstance(data_blocks, list) or not data_blocks:
611
+ if layer.get("coordinates"):
612
+ import pandas as pd
613
+ obs = observe_layer_dataframe(figure=figure_name, layer=layer, df=pd.DataFrame(),
614
+ frame_cfg=frame_cfg, source="<literal>")
615
+ return obs, None, []
601
616
  return (
602
617
  LayerObservation(
603
618
  figure=figure_name,
@@ -690,7 +705,7 @@ def _observe_layer(
690
705
  source=", ".join(source_labels),
691
706
  n_points=0,
692
707
  notes=notes or ["no loadable data blocks"],
693
- incomplete=incomplete_source_seen,
708
+ incomplete=incomplete_source_seen or bool(heavy_skipped),
694
709
  ),
695
710
  None,
696
711
  heavy_skipped,
@@ -267,9 +267,12 @@ def observe_layer_dataframe(
267
267
 
268
268
 
269
269
  def _eval_axis_expr(df, coordinates: Mapping[str, Any], name: str, eval_fn) -> Any:
270
+ import numpy as np
270
271
  if name not in coordinates:
271
272
  return None
272
273
  spec = coordinates[name]
274
+ if isinstance(spec, (list, tuple, np.ndarray)):
275
+ return np.asarray(spec)
273
276
  expr = spec.get("expr") if isinstance(spec, Mapping) else spec
274
277
  if expr is None and isinstance(spec, Mapping):
275
278
  expr = spec.get("name")
@@ -918,11 +918,8 @@ TRANSFORM_CONTRACTS: dict[str, dict[str, Any]] = {
918
918
  enums={
919
919
  "method": [
920
920
  "natural_neighbor",
921
- "linear",
922
- "cubic",
923
- "nearest",
921
+ "triangulation",
924
922
  "griddata",
925
- "rbf",
926
923
  ],
927
924
  "nan_policy": ["strict", "ignore", "fill"],
928
925
  "backend_options.boundary": ["nan", "clamp", "nearest"],
@@ -201,7 +201,15 @@ def _expression_locals(df: pd.DataFrame, names) -> dict[str, Any]:
201
201
  """Only the columns the expression reads, as Series."""
202
202
  if not df.columns.is_unique:
203
203
  return df.to_dict("series")
204
- return {name: df[name] for name in names if name in df.columns}
204
+ values = {name: df[name] for name in names if name in df.columns}
205
+ # HDF5 paths remain usable verbatim; an unambiguous leaf also works in arithmetic.
206
+ for name in names:
207
+ if name in values:
208
+ continue
209
+ matches = [column for column in df.columns if str(column).rsplit("/", 1)[-1].rsplit(":", 1)[-1] == name]
210
+ if len(matches) == 1:
211
+ values[name] = df[matches[0]]
212
+ return values
205
213
 
206
214
 
207
215
  def build_eval_globals(extra: Optional[Mapping[str, Any]] = None) -> dict[str, Any]:
@@ -132,12 +132,13 @@ def validate_config(
132
132
  _check_layer_sources(config, set(resolved_paths) | _collect_shared_names(config), bag)
133
133
  _check_layer_keys(config, bag)
134
134
  _check_method_contracts(config, bag)
135
+ _check_style_axes(config, bag)
135
136
  _check_corrplot_contracts(config, bag)
136
137
  _check_forest_contracts(config, bag, base_dir=base_dir)
137
138
  _check_legend_contracts(config, bag, base_dir=base_dir)
138
139
  _check_ignored_keys(config, bag)
139
140
  if check_columns:
140
- _check_columns_exist(config, resolved_paths, bag)
141
+ _check_columns_exist(config, resolved_paths, bag, base_dir)
141
142
  return bag
142
143
 
143
144
 
@@ -276,7 +277,7 @@ def _check_dataset_files(
276
277
  f"data file not found: {resolved}",
277
278
  suggestion=(
278
279
  "Paths resolve relative to the config file's directory "
279
- "(or use the &JP/ prefix for repo-relative paths)."
280
+ "(or use the &JP/ prefix for bundled resource paths)."
280
281
  ),
281
282
  context={"declared": source, "resolved": str(resolved)},
282
283
  )
@@ -288,6 +289,31 @@ def _check_dataset_files(
288
289
  # --------------------------------------------------------------------------- #
289
290
 
290
291
 
292
+ def _check_style_axes(config: dict[str, Any], bag: DiagnosticBag) -> None:
293
+ from .core_assets import load_styles
294
+ from .utils.pathing import resolve_project_path
295
+ from .Figure.style_runtime import resolve_style_bundle_payload
296
+
297
+ styles = load_styles(lambda path: str(resolve_project_path(path)))
298
+ for index, figure in enumerate(config.get("Figures") or ()):
299
+ if not isinstance(figure, dict) or figure.get("enable", True) is False or figure.get("type"):
300
+ continue
301
+ tokens = figure.get("style", ["a4paper_2x1", "rect"])
302
+ try:
303
+ _, _, bundle = resolve_style_bundle_payload(styles, tokens)
304
+ frame = bundle.get("Frame") or {}
305
+ custom = figure.get("frame") or {}
306
+ axes = set(frame) | set(custom)
307
+ if not axes:
308
+ raise ValueError("style card defines no axes")
309
+ for layer in figure.get("layers") or ():
310
+ if isinstance(layer, dict) and layer.get("axes") and layer["axes"] not in axes:
311
+ raise ValueError(f"layer {layer.get('name')!r} requests missing axes {layer['axes']!r}")
312
+ except (KeyError, TypeError, ValueError) as exc:
313
+ bag.error("JP-VIZ-000", f"$.Figures[{index}].style", f"invalid style/axes: {exc}",
314
+ suggestion="Choose a style card with the layer's axes; see jplot cap styles --json.")
315
+
316
+
291
317
  def _check_unique_names(config: dict[str, Any], bag: DiagnosticBag) -> None:
292
318
  """Names are addresses. A duplicate silently redirects or overwrites."""
293
319
  _report_duplicates(
@@ -431,6 +457,7 @@ def _check_columns_exist(
431
457
  config: dict[str, Any],
432
458
  resolved_paths: dict[str, str],
433
459
  bag: DiagnosticBag,
460
+ base_dir: str | None = None,
434
461
  ) -> None:
435
462
  """Answer "does column 'aa' exist?" before the renderer raises `name 'aa' is not defined`.
436
463
 
@@ -469,6 +496,10 @@ def _check_columns_exist(
469
496
  continue
470
497
 
471
498
  probe = probe_dataset_columns(entry, path)
499
+ if isinstance(entry.get("path"), list):
500
+ for raw in entry["path"]:
501
+ extra = probe_dataset_columns(entry, str(resolve_project_path(raw, base_dir)))
502
+ probe.names.update(extra.names)
472
503
  if probe.error:
473
504
  bag.warning(
474
505
  "JP-COL-900",
@@ -63,8 +63,10 @@ def run(argv: Sequence[str], *, prog: str = "jplot doctor") -> int:
63
63
  merged = DiagnosticBag()
64
64
  for d in vbag:
65
65
  merged.add(d)
66
+ seen = {(d.code, str(d.path)) for d in vbag}
66
67
  for d in dbag:
67
- merged.add(d)
68
+ if (d.code, str(d.path)) not in seen:
69
+ merged.add(d)
68
70
 
69
71
  dryrun_verdict = report.get("ok")
70
72
  coverage = str(report.get("coverage") or ("full" if dbag.ok else "failed"))
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "JarvisPLOT"
7
- version = "2.1.13"
7
+ version = "2.1.14"
8
8
  description = "Jarvis-PLOT: YAML-driven plotting engine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"