plotsalot 0.1.1__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 (326) hide show
  1. plotsalot-0.1.1/.dockerignore +4 -0
  2. plotsalot-0.1.1/.gitattributes +2 -0
  3. plotsalot-0.1.1/.github/CODEOWNERS +1 -0
  4. plotsalot-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  5. plotsalot-0.1.1/.github/dependabot.yml +10 -0
  6. plotsalot-0.1.1/.github/workflows/ci.yml +22 -0
  7. plotsalot-0.1.1/.github/workflows/release.yml +90 -0
  8. plotsalot-0.1.1/.github/workflows/security.yml +21 -0
  9. plotsalot-0.1.1/.gitignore +22 -0
  10. plotsalot-0.1.1/.python-version +1 -0
  11. plotsalot-0.1.1/AGENTS.md +83 -0
  12. plotsalot-0.1.1/CHANGELOG.md +49 -0
  13. plotsalot-0.1.1/CONTRIBUTING.md +59 -0
  14. plotsalot-0.1.1/LICENSE +21 -0
  15. plotsalot-0.1.1/Makefile +41 -0
  16. plotsalot-0.1.1/PKG-INFO +149 -0
  17. plotsalot-0.1.1/PROJECT_BRIEF.md +109 -0
  18. plotsalot-0.1.1/PROJECT_MEMORY.md +45 -0
  19. plotsalot-0.1.1/README.md +118 -0
  20. plotsalot-0.1.1/REPRODUCIBILITY.md +90 -0
  21. plotsalot-0.1.1/SECURITY.md +29 -0
  22. plotsalot-0.1.1/STATISTICAL_ANALYSIS_PLAN.md +209 -0
  23. plotsalot-0.1.1/benchmarks/benchmark_m0.py +128 -0
  24. plotsalot-0.1.1/benchmarks/benchmark_m2.py +154 -0
  25. plotsalot-0.1.1/benchmarks/benchmark_m3.py +271 -0
  26. plotsalot-0.1.1/benchmarks/benchmark_m4.py +239 -0
  27. plotsalot-0.1.1/benchmarks/benchmark_m5a.py +167 -0
  28. plotsalot-0.1.1/benchmarks/benchmark_m5b.py +174 -0
  29. plotsalot-0.1.1/benchmarks/benchmark_m6a.py +264 -0
  30. plotsalot-0.1.1/benchmarks/benchmark_m6b.py +163 -0
  31. plotsalot-0.1.1/benchmarks/benchmark_m6c.py +240 -0
  32. plotsalot-0.1.1/benchmarks/results/m0-baseline.json +233 -0
  33. plotsalot-0.1.1/benchmarks/results/m2-baseline.json +454 -0
  34. plotsalot-0.1.1/benchmarks/results/m3-baseline.json +1662 -0
  35. plotsalot-0.1.1/benchmarks/results/m4-baseline.json +2228 -0
  36. plotsalot-0.1.1/benchmarks/results/m5a-baseline.json +375 -0
  37. plotsalot-0.1.1/benchmarks/results/m5b-baseline.json +1700 -0
  38. plotsalot-0.1.1/benchmarks/results/m6a-baseline.json +510 -0
  39. plotsalot-0.1.1/benchmarks/results/m6b-baseline.json +174 -0
  40. plotsalot-0.1.1/benchmarks/results/m6c-baseline.json +962 -0
  41. plotsalot-0.1.1/checklists/RELEASE_READINESS.md +75 -0
  42. plotsalot-0.1.1/checklists/REPOSITORY_SETUP.md +67 -0
  43. plotsalot-0.1.1/data/README.md +11 -0
  44. plotsalot-0.1.1/data/example.csv +3 -0
  45. plotsalot-0.1.1/data/regression-example.csv +6 -0
  46. plotsalot-0.1.1/data/walk-forward-example.csv +11 -0
  47. plotsalot-0.1.1/docs/AGENTIC_VERIFICATION_GUIDE.md +118 -0
  48. plotsalot-0.1.1/docs/BAYESIAN_REGRESSION_IMPLEMENTATION.md +152 -0
  49. plotsalot-0.1.1/docs/CONTRACTS.md +201 -0
  50. plotsalot-0.1.1/docs/GETTING_STARTED.md +132 -0
  51. plotsalot-0.1.1/docs/INTERPRETATION_AND_LIMITATIONS.md +95 -0
  52. plotsalot-0.1.1/docs/M2_STATISTICAL_METHODS.md +187 -0
  53. plotsalot-0.1.1/docs/M3_STATISTICAL_METHODS.md +323 -0
  54. plotsalot-0.1.1/docs/M4_STATISTICAL_METHODS.md +366 -0
  55. plotsalot-0.1.1/docs/M5_STATISTICAL_METHODS.md +558 -0
  56. plotsalot-0.1.1/docs/M6B_STATISTICAL_METHODS.md +466 -0
  57. plotsalot-0.1.1/docs/M6C_STATISTICAL_METHODS.md +582 -0
  58. plotsalot-0.1.1/docs/M6_STATISTICAL_METHODS.md +490 -0
  59. plotsalot-0.1.1/docs/MILESTONE_0.md +75 -0
  60. plotsalot-0.1.1/docs/MILESTONE_1.md +66 -0
  61. plotsalot-0.1.1/docs/MILESTONE_2.md +197 -0
  62. plotsalot-0.1.1/docs/MILESTONE_3.md +325 -0
  63. plotsalot-0.1.1/docs/MILESTONE_4.md +412 -0
  64. plotsalot-0.1.1/docs/MILESTONE_5.md +476 -0
  65. plotsalot-0.1.1/docs/MILESTONE_6.md +586 -0
  66. plotsalot-0.1.1/docs/PARQUET_DATASETS.md +76 -0
  67. plotsalot-0.1.1/docs/PROJECT_PLAN.md +55 -0
  68. plotsalot-0.1.1/docs/README.md +45 -0
  69. plotsalot-0.1.1/docs/REGRESSION_EVIDENCE.md +62 -0
  70. plotsalot-0.1.1/docs/RELEASING.md +79 -0
  71. plotsalot-0.1.1/docs/STATISTICAL_LEARNING_POINT_OF_VIEW.md +85 -0
  72. plotsalot-0.1.1/docs/USER_GUIDE.md +185 -0
  73. plotsalot-0.1.1/docs/adr/ADR-001-project-identity.md +29 -0
  74. plotsalot-0.1.1/docs/adr/ADR-002-renderer.md +29 -0
  75. plotsalot-0.1.1/docs/adr/ADR-003-dataframe-boundary.md +29 -0
  76. plotsalot-0.1.1/docs/adr/ADR-004-compatibility.md +31 -0
  77. plotsalot-0.1.1/docs/adr/ADR-005-robust-method-architecture.md +120 -0
  78. plotsalot-0.1.1/docs/adr/ADR-006-bayesian-engine-architecture.md +110 -0
  79. plotsalot-0.1.1/docs/adr/ADR-010-license-posture.md +43 -0
  80. plotsalot-0.1.1/docs/compatibility.md +218 -0
  81. plotsalot-0.1.1/docs/evidence/M0_ADVERSARIAL_REVIEW.md +57 -0
  82. plotsalot-0.1.1/docs/evidence/M0_IMPROVEMENT_PLAN.md +11 -0
  83. plotsalot-0.1.1/docs/evidence/M0_SIGNOFF.md +13 -0
  84. plotsalot-0.1.1/docs/evidence/M0_VERIFICATION.md +111 -0
  85. plotsalot-0.1.1/docs/evidence/M0_VERIFICATION_LOOP.md +26 -0
  86. plotsalot-0.1.1/docs/evidence/M1_ADVERSARIAL_REVIEW.md +101 -0
  87. plotsalot-0.1.1/docs/evidence/M1_IMPROVEMENT_PLAN.md +18 -0
  88. plotsalot-0.1.1/docs/evidence/M1_VERIFICATION.md +46 -0
  89. plotsalot-0.1.1/docs/evidence/M1_VERIFICATION_LOOP.md +53 -0
  90. plotsalot-0.1.1/docs/evidence/M2_ADVERSARIAL_REVIEW.md +39 -0
  91. plotsalot-0.1.1/docs/evidence/M2_SIGNOFF.md +23 -0
  92. plotsalot-0.1.1/docs/evidence/M2_VERIFICATION.md +87 -0
  93. plotsalot-0.1.1/docs/evidence/M2_VERIFICATION_LOOP.md +49 -0
  94. plotsalot-0.1.1/docs/evidence/M3A_ADVERSARIAL_REVIEW.md +31 -0
  95. plotsalot-0.1.1/docs/evidence/M3A_SIGNOFF.md +19 -0
  96. plotsalot-0.1.1/docs/evidence/M3A_VERIFICATION.md +74 -0
  97. plotsalot-0.1.1/docs/evidence/M3A_VERIFICATION_LOOP.md +27 -0
  98. plotsalot-0.1.1/docs/evidence/M3B_ADVERSARIAL_REVIEW.md +32 -0
  99. plotsalot-0.1.1/docs/evidence/M3B_SIGNOFF.md +19 -0
  100. plotsalot-0.1.1/docs/evidence/M3B_VERIFICATION.md +69 -0
  101. plotsalot-0.1.1/docs/evidence/M3B_VERIFICATION_LOOP.md +27 -0
  102. plotsalot-0.1.1/docs/evidence/M4_ADVERSARIAL_REVIEW.md +35 -0
  103. plotsalot-0.1.1/docs/evidence/M4_SIGNOFF.md +22 -0
  104. plotsalot-0.1.1/docs/evidence/M4_VERIFICATION.md +67 -0
  105. plotsalot-0.1.1/docs/evidence/M4_VERIFICATION_LOOP.md +49 -0
  106. plotsalot-0.1.1/docs/evidence/M5A_ADVERSARIAL_REVIEW.md +37 -0
  107. plotsalot-0.1.1/docs/evidence/M5A_SIGNOFF.md +21 -0
  108. plotsalot-0.1.1/docs/evidence/M5A_VERIFICATION.md +84 -0
  109. plotsalot-0.1.1/docs/evidence/M5A_VERIFICATION_LOOP.md +27 -0
  110. plotsalot-0.1.1/docs/evidence/M5B_ADVERSARIAL_REVIEW.md +40 -0
  111. plotsalot-0.1.1/docs/evidence/M5B_SIGNOFF.md +21 -0
  112. plotsalot-0.1.1/docs/evidence/M5B_VERIFICATION.md +84 -0
  113. plotsalot-0.1.1/docs/evidence/M5B_VERIFICATION_LOOP.md +28 -0
  114. plotsalot-0.1.1/docs/evidence/M6A_ADVERSARIAL_REVIEW.md +26 -0
  115. plotsalot-0.1.1/docs/evidence/M6A_SIGNOFF.md +28 -0
  116. plotsalot-0.1.1/docs/evidence/M6A_VERIFICATION.md +123 -0
  117. plotsalot-0.1.1/docs/evidence/M6A_VERIFICATION_LOOP.md +73 -0
  118. plotsalot-0.1.1/docs/evidence/M6B_ADVERSARIAL_REVIEW.md +26 -0
  119. plotsalot-0.1.1/docs/evidence/M6B_METHOD_AUDIT.md +88 -0
  120. plotsalot-0.1.1/docs/evidence/M6B_SIGNOFF.md +23 -0
  121. plotsalot-0.1.1/docs/evidence/M6B_VERIFICATION.md +39 -0
  122. plotsalot-0.1.1/docs/evidence/M6B_VERIFICATION_LOOP.md +72 -0
  123. plotsalot-0.1.1/docs/evidence/M6C_ADVERSARIAL_REVIEW.md +32 -0
  124. plotsalot-0.1.1/docs/evidence/M6C_METHOD_AUDIT.md +89 -0
  125. plotsalot-0.1.1/docs/evidence/M6C_PASS1_VERIFICATION.md +59 -0
  126. plotsalot-0.1.1/docs/evidence/M6C_PASS2_VERIFICATION.md +130 -0
  127. plotsalot-0.1.1/docs/evidence/M6C_SIGNOFF.md +31 -0
  128. plotsalot-0.1.1/docs/evidence/M6C_VERIFICATION.md +68 -0
  129. plotsalot-0.1.1/docs/evidence/M6C_VERIFICATION_LOOP.md +84 -0
  130. plotsalot-0.1.1/docs/evidence/M6_RELEASE_VERIFICATION.md +94 -0
  131. plotsalot-0.1.1/docs/evidence/M6_SIGNOFF.md +18 -0
  132. plotsalot-0.1.1/docs/evidence/m6a-correlation-calibration.json +57 -0
  133. plotsalot-0.1.1/docs/evidence/m6c-pass2-calibration-confirmation.json +95 -0
  134. plotsalot-0.1.1/docs/evidence/m6c-pass2-calibration.json +86 -0
  135. plotsalot-0.1.1/docs/upstream/README.md +12 -0
  136. plotsalot-0.1.1/docs/upstream/manifest.json +24 -0
  137. plotsalot-0.1.1/notebooks/README.md +15 -0
  138. plotsalot-0.1.1/notes/README.md +16 -0
  139. plotsalot-0.1.1/oracle/DESCRIPTION +11 -0
  140. plotsalot-0.1.1/oracle/Dockerfile +40 -0
  141. plotsalot-0.1.1/oracle/LICENSE +2 -0
  142. plotsalot-0.1.1/oracle/README.md +69 -0
  143. plotsalot-0.1.1/oracle/fixtures/input/degenerate.csv +4 -0
  144. plotsalot-0.1.1/oracle/fixtures/input/m2-correlation.csv +9 -0
  145. plotsalot-0.1.1/oracle/fixtures/input/m2-dot.csv +8 -0
  146. plotsalot-0.1.1/oracle/fixtures/input/m3-between.csv +13 -0
  147. plotsalot-0.1.1/oracle/fixtures/input/m3-within.csv +13 -0
  148. plotsalot-0.1.1/oracle/fixtures/input/m4-grouped.csv +9 -0
  149. plotsalot-0.1.1/oracle/fixtures/input/m4-independent.csv +7 -0
  150. plotsalot-0.1.1/oracle/fixtures/input/m4-one-way.csv +4 -0
  151. plotsalot-0.1.1/oracle/fixtures/input/m4-paired.csv +5 -0
  152. plotsalot-0.1.1/oracle/fixtures/input/m4-raw.csv +41 -0
  153. plotsalot-0.1.1/oracle/fixtures/input/m5a-coefficients.csv +4 -0
  154. plotsalot-0.1.1/oracle/fixtures/input/m5a-ols.csv +11 -0
  155. plotsalot-0.1.1/oracle/fixtures/input/m5b-meta.csv +6 -0
  156. plotsalot-0.1.1/oracle/fixtures/input/m6a-between.csv +19 -0
  157. plotsalot-0.1.1/oracle/fixtures/input/m6a-correlation.csv +11 -0
  158. plotsalot-0.1.1/oracle/fixtures/input/m6a-hist.csv +8 -0
  159. plotsalot-0.1.1/oracle/fixtures/input/m6a-within.csv +25 -0
  160. plotsalot-0.1.1/oracle/fixtures/input/m6c-bayes-meta.csv +4 -0
  161. plotsalot-0.1.1/oracle/fixtures/input/m6c-robust-meta.csv +11 -0
  162. plotsalot-0.1.1/oracle/fixtures/input/non-finite.csv +4 -0
  163. plotsalot-0.1.1/oracle/fixtures/input/normal.csv +6 -0
  164. plotsalot-0.1.1/oracle/fixtures/input/null-containing.csv +6 -0
  165. plotsalot-0.1.1/oracle/fixtures/input/small-sample.csv +3 -0
  166. plotsalot-0.1.1/oracle/fixtures/manifest.json +152 -0
  167. plotsalot-0.1.1/oracle/fixtures/r-output/boundary-results.csv +3 -0
  168. plotsalot-0.1.1/oracle/fixtures/r-output/installed-packages.csv +147 -0
  169. plotsalot-0.1.1/oracle/fixtures/r-output/m2-correlation-results.csv +4 -0
  170. plotsalot-0.1.1/oracle/fixtures/r-output/m2-corrmat-ggstatsplot.R +3 -0
  171. plotsalot-0.1.1/oracle/fixtures/r-output/m2-dot-ggstatsplot.R +11 -0
  172. plotsalot-0.1.1/oracle/fixtures/r-output/m2-dot-results.csv +5 -0
  173. plotsalot-0.1.1/oracle/fixtures/r-output/m2-scatter-ggstatsplot.R +11 -0
  174. plotsalot-0.1.1/oracle/fixtures/r-output/m3-between-ggstatsplot.R +18 -0
  175. plotsalot-0.1.1/oracle/fixtures/r-output/m3-between-results.csv +5 -0
  176. plotsalot-0.1.1/oracle/fixtures/r-output/m3-within-ggstatsplot.R +16 -0
  177. plotsalot-0.1.1/oracle/fixtures/r-output/m3-within-results.csv +5 -0
  178. plotsalot-0.1.1/oracle/fixtures/r-output/m4-categorical-results.csv +9 -0
  179. plotsalot-0.1.1/oracle/fixtures/r-output/m4-grouped-bar-ggstatsplot.R +59 -0
  180. plotsalot-0.1.1/oracle/fixtures/r-output/m4-grouped-pie-ggstatsplot.R +59 -0
  181. plotsalot-0.1.1/oracle/fixtures/r-output/m4-independent-bar-ggstatsplot.R +47 -0
  182. plotsalot-0.1.1/oracle/fixtures/r-output/m4-independent-pie-ggstatsplot.R +47 -0
  183. plotsalot-0.1.1/oracle/fixtures/r-output/m4-one-way-bar-ggstatsplot.R +11 -0
  184. plotsalot-0.1.1/oracle/fixtures/r-output/m4-one-way-pie-ggstatsplot.R +11 -0
  185. plotsalot-0.1.1/oracle/fixtures/r-output/m4-paired-bar-ggstatsplot.R +31 -0
  186. plotsalot-0.1.1/oracle/fixtures/r-output/m4-paired-pie-ggstatsplot.R +31 -0
  187. plotsalot-0.1.1/oracle/fixtures/r-output/m4-raw-bar-ggstatsplot.R +28 -0
  188. plotsalot-0.1.1/oracle/fixtures/r-output/m4-raw-pie-ggstatsplot.R +28 -0
  189. plotsalot-0.1.1/oracle/fixtures/r-output/m5a-coefficients-ggstatsplot.R +6 -0
  190. plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-ggstatsplot.R +14 -0
  191. plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-results.csv +3 -0
  192. plotsalot-0.1.1/oracle/fixtures/r-output/m5a-ols-summary.csv +2 -0
  193. plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-ggstatsplot.R +13 -0
  194. plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-results.csv +2 -0
  195. plotsalot-0.1.1/oracle/fixtures/r-output/m5b-meta-study-results.csv +6 -0
  196. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-between-ggstatsplot.R +18 -0
  197. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-between-results.csv +5 -0
  198. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-correlation-results.csv +2 -0
  199. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-hist-ggstatsplot.R +10 -0
  200. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-hist-results.csv +2 -0
  201. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-scatter-ggstatsplot.R +11 -0
  202. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-within-ggstatsplot.R +21 -0
  203. plotsalot-0.1.1/oracle/fixtures/r-output/m6a-within-results.csv +5 -0
  204. plotsalot-0.1.1/oracle/fixtures/r-output/m6c-bayes-meta-results.csv +6 -0
  205. plotsalot-0.1.1/oracle/fixtures/r-output/m6c-robust-meta-results.csv +2 -0
  206. plotsalot-0.1.1/oracle/fixtures/r-output/normal-ggstatsplot.R +9 -0
  207. plotsalot-0.1.1/oracle/fixtures/r-output/normalized-results.csv +4 -0
  208. plotsalot-0.1.1/oracle/fixtures/r-output/null-containing-ggstatsplot.R +9 -0
  209. plotsalot-0.1.1/oracle/fixtures/r-output/session-info.txt +53 -0
  210. plotsalot-0.1.1/oracle/fixtures/r-output/small-sample-ggstatsplot.R +8 -0
  211. plotsalot-0.1.1/oracle/generate.R +1518 -0
  212. plotsalot-0.1.1/oracle/renv.lock +5155 -0
  213. plotsalot-0.1.1/pyproject.toml +75 -0
  214. plotsalot-0.1.1/schemas/analysis-result.schema.json +111 -0
  215. plotsalot-0.1.1/schemas/bayesian-result.schema.json +234 -0
  216. plotsalot-0.1.1/schemas/categorical-result.schema.json +147 -0
  217. plotsalot-0.1.1/schemas/coefficient-result.schema.json +700 -0
  218. plotsalot-0.1.1/schemas/comparison-result.schema.json +276 -0
  219. plotsalot-0.1.1/schemas/composition-result.schema.json +89 -0
  220. plotsalot-0.1.1/schemas/correlation-matrix-result.schema.json +66 -0
  221. plotsalot-0.1.1/schemas/correlation-result.schema.json +68 -0
  222. plotsalot-0.1.1/schemas/dotplot-result.schema.json +64 -0
  223. plotsalot-0.1.1/schemas/grouped-result.schema.json +146 -0
  224. plotsalot-0.1.1/schemas/robust-result.schema.json +122 -0
  225. plotsalot-0.1.1/schemas/telemetry-event.schema.json +141 -0
  226. plotsalot-0.1.1/src/plotsalot/__init__.py +325 -0
  227. plotsalot-0.1.1/src/plotsalot/analysis_cli.py +68 -0
  228. plotsalot-0.1.1/src/plotsalot/bayesian.py +1548 -0
  229. plotsalot-0.1.1/src/plotsalot/bayesian_result.py +929 -0
  230. plotsalot-0.1.1/src/plotsalot/categorical.py +507 -0
  231. plotsalot-0.1.1/src/plotsalot/categorical_analysis.py +726 -0
  232. plotsalot-0.1.1/src/plotsalot/categorical_data.py +194 -0
  233. plotsalot-0.1.1/src/plotsalot/categorical_grouped.py +382 -0
  234. plotsalot-0.1.1/src/plotsalot/categorical_result.py +346 -0
  235. plotsalot-0.1.1/src/plotsalot/cli.py +21 -0
  236. plotsalot-0.1.1/src/plotsalot/coefficient.py +1039 -0
  237. plotsalot-0.1.1/src/plotsalot/coefficient_analysis.py +823 -0
  238. plotsalot-0.1.1/src/plotsalot/coefficient_data.py +340 -0
  239. plotsalot-0.1.1/src/plotsalot/coefficient_meta_analysis.py +1118 -0
  240. plotsalot-0.1.1/src/plotsalot/coefficient_meta_result.py +705 -0
  241. plotsalot-0.1.1/src/plotsalot/coefficient_result.py +839 -0
  242. plotsalot-0.1.1/src/plotsalot/coefficient_summary_analysis.py +1052 -0
  243. plotsalot-0.1.1/src/plotsalot/coefficient_table_analysis.py +420 -0
  244. plotsalot-0.1.1/src/plotsalot/comparison.py +577 -0
  245. plotsalot-0.1.1/src/plotsalot/comparison_analysis.py +1292 -0
  246. plotsalot-0.1.1/src/plotsalot/comparison_data.py +317 -0
  247. plotsalot-0.1.1/src/plotsalot/comparison_grouped.py +454 -0
  248. plotsalot-0.1.1/src/plotsalot/comparison_result.py +331 -0
  249. plotsalot-0.1.1/src/plotsalot/composition.py +367 -0
  250. plotsalot-0.1.1/src/plotsalot/core.py +38 -0
  251. plotsalot-0.1.1/src/plotsalot/correlation.py +356 -0
  252. plotsalot-0.1.1/src/plotsalot/correlation_analysis.py +741 -0
  253. plotsalot-0.1.1/src/plotsalot/data.py +189 -0
  254. plotsalot-0.1.1/src/plotsalot/dataset.py +486 -0
  255. plotsalot-0.1.1/src/plotsalot/dataset_cli.py +93 -0
  256. plotsalot-0.1.1/src/plotsalot/dotplot.py +256 -0
  257. plotsalot-0.1.1/src/plotsalot/dotplot_analysis.py +368 -0
  258. plotsalot-0.1.1/src/plotsalot/evidence.py +236 -0
  259. plotsalot-0.1.1/src/plotsalot/grouped.py +898 -0
  260. plotsalot-0.1.1/src/plotsalot/histogram.py +233 -0
  261. plotsalot-0.1.1/src/plotsalot/histogram_analysis.py +335 -0
  262. plotsalot-0.1.1/src/plotsalot/ingest.py +48 -0
  263. plotsalot-0.1.1/src/plotsalot/model.py +47 -0
  264. plotsalot-0.1.1/src/plotsalot/plot.py +139 -0
  265. plotsalot-0.1.1/src/plotsalot/py.typed +1 -0
  266. plotsalot-0.1.1/src/plotsalot/regression.py +172 -0
  267. plotsalot-0.1.1/src/plotsalot/result.py +627 -0
  268. plotsalot-0.1.1/src/plotsalot/robust.py +243 -0
  269. plotsalot-0.1.1/src/plotsalot/robust_result.py +781 -0
  270. plotsalot-0.1.1/src/plotsalot/theme.py +99 -0
  271. plotsalot-0.1.1/src/plotsalot/time_validation_cli.py +84 -0
  272. plotsalot-0.1.1/src/plotsalot/validation.py +298 -0
  273. plotsalot-0.1.1/src/plotsalot/validation_evidence.py +206 -0
  274. plotsalot-0.1.1/templates/ADR.md +18 -0
  275. plotsalot-0.1.1/templates/AGENTIC_VERIFICATION_LOOP.md +74 -0
  276. plotsalot-0.1.1/templates/IMPROVEMENT_PLAN.md +35 -0
  277. plotsalot-0.1.1/templates/INCIDENT_REVIEW.md +13 -0
  278. plotsalot-0.1.1/templates/LATENCY_BUDGET.md +74 -0
  279. plotsalot-0.1.1/templates/STATISTICAL_ANALYSIS_PLAN.md +88 -0
  280. plotsalot-0.1.1/templates/TELEMETRY_REVIEW.md +53 -0
  281. plotsalot-0.1.1/templates/THREAT_MODEL.md +13 -0
  282. plotsalot-0.1.1/templates/WORK_NOTE.md +45 -0
  283. plotsalot-0.1.1/tests/test_betweenstats.py +196 -0
  284. plotsalot-0.1.1/tests/test_categorical_analysis.py +339 -0
  285. plotsalot-0.1.1/tests/test_categorical_data.py +230 -0
  286. plotsalot-0.1.1/tests/test_categorical_render_grouped.py +184 -0
  287. plotsalot-0.1.1/tests/test_categorical_result_contract.py +232 -0
  288. plotsalot-0.1.1/tests/test_coefficient_data.py +103 -0
  289. plotsalot-0.1.1/tests/test_coefficient_result_render.py +418 -0
  290. plotsalot-0.1.1/tests/test_coefficient_tables.py +538 -0
  291. plotsalot-0.1.1/tests/test_comparison_data.py +222 -0
  292. plotsalot-0.1.1/tests/test_contracts.py +175 -0
  293. plotsalot-0.1.1/tests/test_correlation.py +206 -0
  294. plotsalot-0.1.1/tests/test_data_boundary.py +86 -0
  295. plotsalot-0.1.1/tests/test_dataset.py +184 -0
  296. plotsalot-0.1.1/tests/test_documentation_examples.py +45 -0
  297. plotsalot-0.1.1/tests/test_dotplotstats.py +169 -0
  298. plotsalot-0.1.1/tests/test_evidence.py +145 -0
  299. plotsalot-0.1.1/tests/test_gghistostats.py +127 -0
  300. plotsalot-0.1.1/tests/test_grouped.py +228 -0
  301. plotsalot-0.1.1/tests/test_ingest.py +48 -0
  302. plotsalot-0.1.1/tests/test_m0_artifacts.py +14 -0
  303. plotsalot-0.1.1/tests/test_m2_contracts.py +342 -0
  304. plotsalot-0.1.1/tests/test_m3_contracts.py +413 -0
  305. plotsalot-0.1.1/tests/test_m3_grouped_composition.py +211 -0
  306. plotsalot-0.1.1/tests/test_m6a_robust.py +1001 -0
  307. plotsalot-0.1.1/tests/test_m6b_bayesian.py +970 -0
  308. plotsalot-0.1.1/tests/test_m6c_coefficient_summaries.py +571 -0
  309. plotsalot-0.1.1/tests/test_m6c_meta_analysis.py +727 -0
  310. plotsalot-0.1.1/tests/test_m6c_render_integration.py +351 -0
  311. plotsalot-0.1.1/tests/test_meta_analysis.py +249 -0
  312. plotsalot-0.1.1/tests/test_model.py +22 -0
  313. plotsalot-0.1.1/tests/test_project_license.py +33 -0
  314. plotsalot-0.1.1/tests/test_regression.py +64 -0
  315. plotsalot-0.1.1/tests/test_repository_policy.py +74 -0
  316. plotsalot-0.1.1/tests/test_validation.py +145 -0
  317. plotsalot-0.1.1/tests/test_validation_evidence.py +64 -0
  318. plotsalot-0.1.1/tests/test_withinstats.py +180 -0
  319. plotsalot-0.1.1/tools/calibrate_m6a.py +128 -0
  320. plotsalot-0.1.1/tools/calibrate_m6c.py +385 -0
  321. plotsalot-0.1.1/tools/check_docs.py +72 -0
  322. plotsalot-0.1.1/tools/check_licenses.py +62 -0
  323. plotsalot-0.1.1/tools/verify_benchmark.py +390 -0
  324. plotsalot-0.1.1/tools/verify_oracle.py +999 -0
  325. plotsalot-0.1.1/tools/verify_release.py +45 -0
  326. plotsalot-0.1.1/uv.lock +1425 -0
@@ -0,0 +1,4 @@
1
+ *
2
+ !oracle/
3
+ !oracle/DESCRIPTION
4
+ !oracle/renv.lock
@@ -0,0 +1,2 @@
1
+ # Preserve verbatim R-generated oracle evidence, including formatter whitespace.
2
+ oracle/fixtures/r-output/* whitespace=-blank-at-eof,-trailing-space
@@ -0,0 +1 @@
1
+ * @joshuamyers22
@@ -0,0 +1,15 @@
1
+ ## Outcome
2
+
3
+ Describe the behavior or risk changed.
4
+
5
+ ## Evidence
6
+
7
+ - [ ] `make check`
8
+ - [ ] `make build`
9
+ - [ ] Security, data, and operational effects reviewed
10
+
11
+ ## Risk and recovery
12
+
13
+ - Failure modes:
14
+ - Compatibility or migration impact:
15
+ - Rollback or forward-fix path:
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: uv
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: github-actions
8
+ directory: /
9
+ schedule:
10
+ interval: weekly
@@ -0,0 +1,22 @@
1
+ name: CI
2
+ on:
3
+ pull_request:
4
+ push:
5
+ branches: [main]
6
+ permissions:
7
+ contents: read
8
+ concurrency:
9
+ group: ci-${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+ jobs:
12
+ quality:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 10
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
18
+ with:
19
+ version: "0.12.5"
20
+ - run: uv sync --frozen --dev
21
+ - run: make check
22
+ - run: make audit build
@@ -0,0 +1,90 @@
1
+ name: Release
2
+ on:
3
+ push:
4
+ tags: ["v[0-9]+.[0-9]+.[0-9]+"]
5
+ concurrency:
6
+ group: release-${{ github.ref }}
7
+ cancel-in-progress: false
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ timeout-minutes: 15
12
+ permissions:
13
+ contents: read
14
+ steps:
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ with:
17
+ persist-credentials: false
18
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
19
+ with:
20
+ version: "0.12.5"
21
+ - run: uv sync --frozen --dev
22
+ - name: Verify release tag
23
+ env:
24
+ RELEASE_TAG: ${{ github.ref_name }}
25
+ run: uv run python tools/verify_release.py --tag "$RELEASE_TAG"
26
+ - run: make check audit build
27
+ - uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0
28
+ with:
29
+ path: ./dist
30
+ artifact-name: release-sbom.cdx.json
31
+ output-file: ./dist/release-sbom.cdx.json
32
+ format: cyclonedx-json
33
+ upload-artifact: false
34
+ - name: Generate release checksums
35
+ run: sha256sum dist/*.whl dist/*.tar.gz dist/release-sbom.cdx.json > dist/SHA256SUMS
36
+ - name: Upload release artifacts
37
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
38
+ with:
39
+ name: release-artifacts
40
+ path: |
41
+ dist/*.whl
42
+ dist/*.tar.gz
43
+ dist/release-sbom.cdx.json
44
+ dist/SHA256SUMS
45
+ if-no-files-found: error
46
+ retention-days: 7
47
+
48
+ github-release:
49
+ needs: build
50
+ runs-on: ubuntu-latest
51
+ timeout-minutes: 5
52
+ permissions:
53
+ contents: write
54
+ steps:
55
+ - name: Download release artifacts
56
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
57
+ with:
58
+ name: release-artifacts
59
+ path: dist
60
+ - uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
61
+ with:
62
+ generate_release_notes: true
63
+ fail_on_unmatched_files: true
64
+ files: |
65
+ dist/*.whl
66
+ dist/*.tar.gz
67
+ dist/release-sbom.cdx.json
68
+ dist/SHA256SUMS
69
+
70
+ publish-pypi:
71
+ needs: [build, github-release]
72
+ runs-on: ubuntu-latest
73
+ timeout-minutes: 5
74
+ environment:
75
+ name: pypi
76
+ url: https://pypi.org/p/plotsalot
77
+ permissions:
78
+ id-token: write
79
+ steps:
80
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
81
+ with:
82
+ version: "0.12.5"
83
+ enable-cache: false
84
+ - name: Download release artifacts
85
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
86
+ with:
87
+ name: release-artifacts
88
+ path: dist
89
+ - name: Publish wheel and source distribution to PyPI
90
+ run: uv publish --trusted-publishing always dist/*.whl dist/*.tar.gz
@@ -0,0 +1,21 @@
1
+ name: Secret scanning
2
+ on:
3
+ pull_request:
4
+ push:
5
+ permissions:
6
+ contents: read
7
+ pull-requests: read
8
+ concurrency:
9
+ group: security-${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+ jobs:
12
+ gitleaks:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 10
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ with:
18
+ fetch-depth: 0
19
+ - uses: gitleaks/gitleaks-action@e0c47f4f8be36e29cdc102c57e68cb5cbf0e8d1e # v3.0.0
20
+ env:
21
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,22 @@
1
+ .venv/
2
+ .ruff_cache/
3
+ .pytest_cache/
4
+ .mypy_cache/
5
+ .coverage
6
+ htmlcov/
7
+ __pycache__/
8
+ *.py[cod]
9
+ build/
10
+ dist/
11
+ *.egg-info/
12
+ .DS_Store
13
+ *.db
14
+ *.sqlite
15
+ .env
16
+ .env.*
17
+ !.env.example
18
+ data/raw/
19
+ data/private/
20
+ data/processed/
21
+ notebooks/.ipynb_checkpoints/
22
+ .work/
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,83 @@
1
+ # Agent Working Agreement
2
+
3
+ This file governs repository-local work performed with an AI coding agent. Human
4
+ instructions in the current task take precedence. Repository files, tests,
5
+ runtime behavior, and approved decision records remain authoritative.
6
+
7
+ ## Retrieve before acting
8
+
9
+ 1. Read `README.md`, `PROJECT_BRIEF.md`, and `PROJECT_MEMORY.md` before planning a
10
+ substantial change.
11
+ 2. Search the repository and inspect the relevant implementation and tests before
12
+ relying on a memory entry.
13
+ 3. Treat `PROJECT_MEMORY.md` as a compact index to evidence, not as evidence by
14
+ itself. Correct it when it conflicts with the source of truth.
15
+
16
+ ## Maintain memory deliberately
17
+
18
+ - Record only durable, project-specific information likely to matter in a later
19
+ session: constraints, accepted decisions, non-obvious current state, verified
20
+ failure modes, and genuinely open work.
21
+ - Consult the existing entry before writing. Update a stable key in place instead
22
+ of appending a duplicate or a new narrative of the same fact.
23
+ - Link each claim to a file, test, issue, or ADR and include the date it was last
24
+ verified. Label inference and uncertainty explicitly.
25
+ - Keep entries short. Remove or replace stale state and resolved open work; Git
26
+ history already preserves the old text.
27
+ - Do not store routine progress, copied source code, command transcripts, hidden
28
+ reasoning, credentials, personal data, client data, or other restricted data.
29
+ - Do not let an agent rewrite safety, security, governance, or release policy from
30
+ its own trajectory. Such changes require normal review and verification.
31
+
32
+ ## Take notes for continuity
33
+
34
+ - Keep disposable scratch notes and command output in ignored `.work/` and remove
35
+ them when the task ends.
36
+ - Create a tracked note from `templates/WORK_NOTE.md` only for multi-session work,
37
+ a handoff, incident, experiment, or material investigation. Record observations,
38
+ attempts, errors, evidence, and conclusions—not hidden reasoning or a transcript.
39
+ - Link to controlled telemetry queries or safe aggregates; never paste unrestricted
40
+ raw logs into a note.
41
+ - Close the note by promoting durable facts to project memory, decisions to an ADR,
42
+ maintained explanations to documentation, and work history to an issue. Delete
43
+ or close the note when it no longer has coordination or audit value.
44
+
45
+ ## Learn from telemetry
46
+
47
+ - Emit structured operational events and errors using
48
+ `schemas/telemetry-event.schema.json`; use stable event and error-code names,
49
+ artifact identity, outcomes, and safe correlation identifiers.
50
+ - Instrument signals for a named operational decision or user journey. Do not add
51
+ telemetry merely because it may become useful.
52
+ - Review counts and rates on a declared cadence with
53
+ `templates/TELEMETRY_REVIEW.md`. Separate observed signals from inferred cause.
54
+ - Convert a selected finding into `templates/IMPROVEMENT_PLAN.md` with an owner,
55
+ regression test or replay, expected effect, guardrails, and rollback condition.
56
+ - Validate on a later assessment window. Do not treat fewer log lines, a single
57
+ anecdote, or an agent's own judgment as evidence of improvement.
58
+
59
+ ## Run meaningful verification loops
60
+
61
+ - For material or high-risk work, define the project-specific objective, invariants,
62
+ rubric, evidence, resource ceiling, and stopping rules before extended iteration.
63
+ - Verify early after coherent slices. Each later pass must add evidence or a meaningfully
64
+ different perspective—such as a focused test, static analysis, fault injection,
65
+ production-like replay, clean build, adversarial input, or independently briefed
66
+ review when the workflow authorizes one.
67
+ - Treat fresh context as a way to reduce anchoring, not as proof of independence or
68
+ correctness. An agent's self-review is never sole approval for safety, security,
69
+ governance, financial logic, or release decisions.
70
+ - Scale effort by risk, uncertainty, blast radius, reversibility, dependency reach, and
71
+ test strength. Token, iteration, and elapsed-time budgets are ceilings rather than
72
+ quality targets; lines of code alone do not determine them.
73
+ - Stop on the declared pass threshold, diminishing-return rule, resource ceiling, or
74
+ need for domain authority. Report unresolved findings instead of repeating the same
75
+ review against unchanged evidence.
76
+ - Use `templates/AGENTIC_VERIFICATION_LOOP.md` for auditable multi-pass work. Record
77
+ finding evidence and dispositions, never hidden reasoning or prompt transcripts.
78
+
79
+ ## Close the loop
80
+
81
+ After a material change, update `PROJECT_MEMORY.md` only if durable project
82
+ knowledge changed. Review the diff, run the applicable quality gate, and ensure
83
+ the memory entry points to the evidence that passed.
@@ -0,0 +1,49 @@
1
+ # Changelog
2
+
3
+ Notable user-visible changes are recorded here. Plotsalot follows semantic
4
+ versioning for published package releases.
5
+
6
+ ## 0.1.1 - 2026-09-15
7
+
8
+ - Reorganized the package documentation around installation, getting started,
9
+ task-oriented workflows, interpretation boundaries, and maintained evidence.
10
+ - Aligned repository setup, package metadata, documentation checks, and release
11
+ artifact handling with the production-project-template baseline.
12
+
13
+ ## 0.1.0 - 2026-09-15
14
+
15
+ ### Added
16
+
17
+ - Polars-first one-sample histograms, labeled dot plots, scatter plots,
18
+ correlation matrices, independent and repeated comparisons, categorical bar
19
+ and pie analyses, coefficient plots, and aggregate meta-analysis workflows.
20
+ - Atomic grouped analysis, result-preserving plot composition, local Matplotlib
21
+ themes, and separate analysis/rendering APIs.
22
+ - Immutable, JSON-safe structured results with versioned schemas, sample and
23
+ method provenance, correction metadata, resource limits, and owned numerical
24
+ boundaries.
25
+ - Approved classical, fixed-20%-trim robust, and proper-prior Bayesian modes for
26
+ their documented workflow families, including deterministic bounded bootstrap,
27
+ quadrature, and randomized quasi-Monte Carlo computation.
28
+ - Strict caller-reported robust and posterior coefficient profiles plus
29
+ fixed-Student-t robust and proper-prior Bayesian aggregate meta-analysis.
30
+ - Pinned R-oracle fixtures, independent analytic checks, retained performance
31
+ baselines, installed-wheel smoke tests, vulnerability/license gates, and
32
+ milestone-specific verification and sign-off records.
33
+
34
+ ### Compatibility
35
+
36
+ - Established plotsalot as an independent, adapted Python implementation of
37
+ selected `ggstatsplot` behavior rather than a line-by-line or pixel-identical
38
+ port.
39
+ - Adopted explicit subject identity for repeated designs, strict non-finite and
40
+ degenerate-sample rejection, owned Matplotlib rendering, and no silent method
41
+ fallback or partial grouped success.
42
+
43
+ ### Known limitations
44
+
45
+ - M7 compatibility closure and 1.0 API hardening remain.
46
+ - The accepted M6C zero-heterogeneity calibration disposition is provisional and
47
+ must be revisited before 1.0.
48
+ - Nonparametric families, general fitted-model dispatch, arbitrary ggplot layer
49
+ compatibility, and unsupported upstream arguments remain deferred.
@@ -0,0 +1,59 @@
1
+ # Contributing
2
+
3
+ Plotsalot is a pre-1.0 scientific Python project. Keep changes bounded, preserve
4
+ the declared statistical and ownership contracts, and add evidence for changed
5
+ behavior.
6
+
7
+ ## Set up a checkout
8
+
9
+ Use Python 3.11 or newer and the locked development environment:
10
+
11
+ ```sh
12
+ make setup
13
+ ```
14
+
15
+ For a new clone or maintainer machine, complete
16
+ [`checklists/REPOSITORY_SETUP.md`](checklists/REPOSITORY_SETUP.md) before the
17
+ first commit or push.
18
+
19
+ ## Make a change
20
+
21
+ - Work on a focused branch rather than directly on `main`.
22
+ - Keep Polars as the public tabular boundary and make numerical ownership
23
+ explicit.
24
+ - Do not change an approved statistical method, compatibility classification,
25
+ license, security policy, or release policy without the corresponding review.
26
+ - Add a regression test for corrected defects and deterministic seeds for random
27
+ procedures.
28
+ - Update user documentation, method specifications, schemas, and changelog
29
+ entries in the same change when public behavior changes.
30
+ - Keep credentials, private data, generated distributions, and raw telemetry out
31
+ of Git.
32
+
33
+ ## Verify the change
34
+
35
+ Run the local quality and packaging gates:
36
+
37
+ ```sh
38
+ make check
39
+ make audit
40
+ make build
41
+ ```
42
+
43
+ `make oracle` regenerates the pinned R compatibility evidence and requires
44
+ Docker. `make benchmark` refreshes retained performance evidence. Run either only
45
+ when the change affects its declared boundary, then review the resulting diff.
46
+
47
+ ## Submit a pull request
48
+
49
+ Pull requests must state:
50
+
51
+ - the user-visible or risk-reducing outcome;
52
+ - compatibility, statistical, security, and data-boundary effects;
53
+ - verification evidence and any deliberately unrun gate; and
54
+ - a rollback or forward-fix path.
55
+
56
+ The accountable owner must review release, security, governance, license, and
57
+ statistical-method changes. Automated checks and agent review do not replace
58
+ that approval. Maintainers should follow the [release procedure](docs/RELEASING.md)
59
+ and complete the release-readiness checklist before creating a version tag.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Joshua Myers
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,41 @@
1
+ .PHONY: setup format lint typecheck test docs check audit build oracle verify-oracle benchmark verify-benchmark
2
+ setup:
3
+ uv sync --frozen --dev
4
+ format:
5
+ uv run ruff format .
6
+ lint:
7
+ uv run ruff check .
8
+ uv run ruff format --check .
9
+ typecheck:
10
+ uv run pyright
11
+ test:
12
+ uv run coverage run -m unittest discover -s tests
13
+ uv run coverage report
14
+ docs:
15
+ uv run python tools/check_docs.py
16
+ check: lint typecheck test docs
17
+ audit:
18
+ uv audit --preview-features audit-command --locked --no-dev
19
+ uv run python tools/check_licenses.py
20
+ build:
21
+ uv build --no-sources
22
+ oracle:
23
+ docker build --platform linux/arm64 --build-arg GGSTATSPLOT_REVISION=7a724cd0ab55668b9d0b2e84b12c711c5be68ac8 -t plotsalot-r-oracle:m0 -f oracle/Dockerfile .
24
+ docker run --rm --platform linux/arm64 -v "$(CURDIR):/work" plotsalot-r-oracle:m0
25
+ uv run python tools/verify_oracle.py --write-manifest
26
+ uv run python tools/verify_oracle.py
27
+ verify-oracle:
28
+ uv run python tools/verify_oracle.py
29
+ benchmark:
30
+ uv run python benchmarks/benchmark_m0.py
31
+ uv run python benchmarks/benchmark_m2.py
32
+ uv run python benchmarks/benchmark_m3.py
33
+ uv run python benchmarks/benchmark_m4.py
34
+ uv run python benchmarks/benchmark_m5a.py
35
+ uv run python benchmarks/benchmark_m5b.py
36
+ uv run python benchmarks/benchmark_m6a.py
37
+ uv run python benchmarks/benchmark_m6b.py
38
+ uv run python benchmarks/benchmark_m6c.py
39
+ uv run python tools/verify_benchmark.py
40
+ verify-benchmark:
41
+ uv run python tools/verify_benchmark.py
@@ -0,0 +1,149 @@
1
+ Metadata-Version: 2.5
2
+ Name: plotsalot
3
+ Version: 0.1.1
4
+ Summary: Statistical visualizations and distribution diagnostics for Python
5
+ Project-URL: Homepage, https://github.com/joshuamyers22/plotsalot
6
+ Project-URL: Documentation, https://github.com/joshuamyers22/plotsalot/tree/main/docs
7
+ Project-URL: Repository, https://github.com/joshuamyers22/plotsalot
8
+ Project-URL: Issues, https://github.com/joshuamyers22/plotsalot/issues
9
+ Project-URL: Changelog, https://github.com/joshuamyers22/plotsalot/blob/main/CHANGELOG.md
10
+ Author: Joshua Myers
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: ggstatsplot,matplotlib,polars,statistics,visualization
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Scientific/Engineering :: Visualization
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.11
25
+ Requires-Dist: matplotlib<4,>=3.10
26
+ Requires-Dist: numpy<3,>=2
27
+ Requires-Dist: polars<2,>=1.44.1
28
+ Requires-Dist: scipy<2,>=1.16
29
+ Requires-Dist: statsmodels<0.16,>=0.15
30
+ Description-Content-Type: text/markdown
31
+
32
+ # plotsalot
33
+
34
+ `plotsalot` is an independent Python library for statistical visualizations with
35
+ structured, extractable results. It provides Polars-first analysis workflows and
36
+ Matplotlib figures inspired by the public behavior of
37
+ [`ggstatsplot`](https://github.com/IndrajeetPatil/ggstatsplot).
38
+
39
+ The project is pre-1.0 alpha software. Its classical, robust, Bayesian,
40
+ categorical, coefficient, and meta-analysis families have passed their recorded
41
+ M0–M6 technical and statistical gates, but M7 compatibility closure and 1.0
42
+ hardening remain. Do not treat a successful computation or plot as automatic
43
+ validation of a statistical model or a substantive conclusion.
44
+
45
+ ## Install
46
+
47
+ Plotsalot supports Python 3.11 and newer on Linux and macOS. After the first PyPI
48
+ release:
49
+
50
+ ```sh
51
+ python -m pip install plotsalot
52
+ ```
53
+
54
+ For development from a checkout:
55
+
56
+ ```sh
57
+ make setup
58
+ ```
59
+
60
+ R and Docker are development-only oracle tools. They are not package runtime
61
+ dependencies.
62
+
63
+ ## Quick start
64
+
65
+ ```python
66
+ import polars as pl
67
+
68
+ from plotsalot import gghistostats
69
+
70
+ data = pl.DataFrame({"value": [1.0, 2.0, 3.0, 4.0, 5.0]})
71
+ plot = gghistostats(data, "value", test_value=0.0)
72
+
73
+ print(plot.result.to_dict())
74
+ plot.figure.savefig("histogram.svg")
75
+ ```
76
+
77
+ Each plotting function returns a typed container with a Matplotlib figure, named
78
+ axes, annotations, and a structured result. Analysis and rendering can also be
79
+ separated so visual changes do not recompute statistics:
80
+
81
+ ```python
82
+ from plotsalot import analyze_gghistostats, render_gghistostats
83
+
84
+ analysis = analyze_gghistostats(data, "value", test_value=0.0)
85
+ plot = render_gghistostats(analysis, title="Observed values")
86
+ plot.axes["main"].grid(axis="y", alpha=0.2)
87
+ ```
88
+
89
+ ## Find the right documentation
90
+
91
+ | Need | Go to |
92
+ |---|---|
93
+ | Complete a first analysis | [Getting started](docs/GETTING_STARTED.md) |
94
+ | Choose a plot or analysis family | [User guide](docs/USER_GUIDE.md) |
95
+ | Interpret results and failure boundaries | [Interpretation and limitations](docs/INTERPRETATION_AND_LIMITATIONS.md) |
96
+ | Understand result and rendering contracts | [Contracts](docs/CONTRACTS.md) |
97
+ | Compare behavior with `ggstatsplot` | [Compatibility matrix](docs/compatibility.md) |
98
+ | Review statistical definitions | [Statistical methods index](docs/README.md#statistical-methods) |
99
+ | Reproduce tests, oracles, and benchmarks | [Reproducibility](REPRODUCIBILITY.md) |
100
+ | Contribute a change | [Contributing](CONTRIBUTING.md) |
101
+
102
+ ## Supported workflow families
103
+
104
+ - one-sample histograms and labeled dot plots;
105
+ - scatter plots and correlation matrices;
106
+ - independent- and repeated-group comparisons;
107
+ - categorical bar and pie analyses;
108
+ - coefficient and aggregate meta-analysis plots;
109
+ - atomic grouped variants, plot composition, and local themes; and
110
+ - explicit classical, fixed-trim robust, and approved Bayesian modes where
111
+ listed in the [compatibility matrix](docs/compatibility.md).
112
+
113
+ The implementation is adapted rather than a drop-in port. It uses explicit
114
+ column names, typed Python results, owned NumPy boundaries, and Matplotlib
115
+ rendering. Unsupported modes fail explicitly; grouped operations do not return
116
+ partial results.
117
+
118
+ ## Development
119
+
120
+ ```sh
121
+ make setup
122
+ make check
123
+ make audit
124
+ make build
125
+ ```
126
+
127
+ The default quality gate runs formatting, linting, strict type checking, the test
128
+ suite, coverage enforcement, and documentation-link checks. Frozen R-oracle and
129
+ benchmark evidence are verified by the normal tests; regenerating them is an
130
+ explicit operation:
131
+
132
+ ```sh
133
+ make oracle
134
+ make benchmark
135
+ ```
136
+
137
+ See [the documentation index](docs/README.md) for project plans, decisions,
138
+ method specifications, and retained verification evidence.
139
+
140
+ ## Project identity and license
141
+
142
+ Plotsalot is an independent project and is not endorsed by or affiliated with
143
+ the `ggstatsplot` maintainers. The upstream project is used as a pinned behavioral
144
+ reference under the adaptation rules recorded in the repository.
145
+
146
+ Plotsalot is MIT licensed. See [LICENSE](LICENSE) and
147
+ [ADR-010](docs/adr/ADR-010-license-posture.md) for the accepted distribution and
148
+ upstream-notice rules. Report security concerns according to
149
+ [SECURITY.md](SECURITY.md).