forgegraph 0.6.0__tar.gz → 0.7.0__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 (339) hide show
  1. {forgegraph-0.6.0 → forgegraph-0.7.0}/CHANGELOG.md +33 -0
  2. {forgegraph-0.6.0 → forgegraph-0.7.0}/CONTRIBUTING.md +1 -1
  3. {forgegraph-0.6.0 → forgegraph-0.7.0}/PKG-INFO +2 -1
  4. {forgegraph-0.6.0 → forgegraph-0.7.0}/README.md +1 -0
  5. forgegraph-0.7.0/docs/examples/acme_polarization.yaml +24 -0
  6. forgegraph-0.7.0/docs/examples/assay_summary.yaml +33 -0
  7. forgegraph-0.7.0/docs/examples/cells.layout.yaml +26 -0
  8. forgegraph-0.7.0/docs/examples/co2.yaml +28 -0
  9. forgegraph-0.7.0/docs/examples/dose_response.yaml +33 -0
  10. forgegraph-0.7.0/docs/examples/durability.yaml +26 -0
  11. forgegraph-0.7.0/docs/examples/lab_polarization.yaml +24 -0
  12. forgegraph-0.7.0/docs/examples/packs/lab/formats/poster.yaml +11 -0
  13. forgegraph-0.7.0/docs/examples/packs/lab/pack.yaml +5 -0
  14. forgegraph-0.7.0/docs/examples/packs/lab/themes/lab_theme.yaml +13 -0
  15. forgegraph-0.7.0/docs/examples/penguins.yaml +29 -0
  16. forgegraph-0.7.0/docs/examples/plate_spectra.yaml +32 -0
  17. forgegraph-0.7.0/docs/examples/polarization.yaml +24 -0
  18. forgegraph-0.7.0/docs/examples/savings.yaml +58 -0
  19. forgegraph-0.7.0/docs/examples/tips_side_by_side.yaml +46 -0
  20. forgegraph-0.7.0/docs/examples/tips_stacked.yaml +42 -0
  21. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/graphspecs/graphspec_example.md +7 -7
  22. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/pack.md +2 -2
  23. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/themes/light_theme.md +1 -1
  24. forgegraph-0.7.0/docs/site/gallery.md +135 -0
  25. forgegraph-0.7.0/docs/site/guides/configs.md +38 -0
  26. forgegraph-0.7.0/docs/site/guides/graphs.md +74 -0
  27. forgegraph-0.7.0/docs/site/guides/layers.md +59 -0
  28. forgegraph-0.7.0/docs/site/guides/layouts.md +68 -0
  29. forgegraph-0.7.0/docs/site/guides/provenance.md +41 -0
  30. forgegraph-0.7.0/docs/site/guides/schedules.md +42 -0
  31. forgegraph-0.7.0/docs/site/guides/series.md +92 -0
  32. forgegraph-0.7.0/docs/site/guides/themes-formats-packs.md +70 -0
  33. forgegraph-0.7.0/docs/site/help/troubleshooting.md +133 -0
  34. forgegraph-0.7.0/docs/site/release-notes.md +3 -0
  35. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/catalogs/layer_reference.md +4 -2
  36. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/graphspec_example.md +8 -8
  37. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/graphtype_xy.md +4 -4
  38. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/layer_reference.md +6 -5
  39. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/pack.md +2 -2
  40. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/theme.md +1 -1
  41. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/README.md +1 -0
  42. forgegraph-0.7.0/examples/sample-data/plate_spectra.csv +4561 -0
  43. {forgegraph-0.6.0 → forgegraph-0.7.0}/mkdocs.yml +21 -1
  44. {forgegraph-0.6.0 → forgegraph-0.7.0}/pyproject.toml +1 -1
  45. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/build_example_data.py +28 -2
  46. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/build_sample_data.py +26 -0
  47. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/docs_site.py +113 -1
  48. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/cards.py +4 -1
  49. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/axes.py +15 -4
  50. forgegraph-0.7.0/src/forgegraph/drawing/equation.py +231 -0
  51. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/key.py +8 -5
  52. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/labels.py +154 -13
  53. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/layers.py +206 -30
  54. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/marks.py +101 -1
  55. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/page.py +18 -2
  56. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/readout.py +63 -7
  57. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/ticks.py +10 -3
  58. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/xy.py +130 -33
  59. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/graphspecs/graphspec_example.yaml +7 -7
  60. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/pack.yaml +2 -2
  61. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/themes/light_theme.yaml +1 -1
  62. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/SKILL.md +1 -0
  63. forgegraph-0.7.0/src/forgegraph/skill/forgegraph/examples/heat_map.parquet +0 -0
  64. forgegraph-0.7.0/src/forgegraph/skill/forgegraph/examples/heat_map.yaml +32 -0
  65. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/catalogs/layer_reference.yaml +3 -1
  66. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/graphspec_example.yaml +8 -8
  67. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/graphtype_xy.yaml +4 -4
  68. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/layer_reference.yaml +6 -5
  69. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/pack.yaml +2 -2
  70. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/theme.yaml +1 -1
  71. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_axes.py +61 -0
  72. forgegraph-0.7.0/tests/test_docs_site.py +27 -0
  73. forgegraph-0.7.0/tests/test_key_position.py +219 -0
  74. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_layers.py +238 -0
  75. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_layout.py +15 -1
  76. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_marks.py +146 -0
  77. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_readout.py +138 -1
  78. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_render.py +24 -7
  79. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_series.py +62 -0
  80. {forgegraph-0.6.0 → forgegraph-0.7.0}/uv.lock +1 -1
  81. forgegraph-0.6.0/tests/test_key_position.py +0 -83
  82. {forgegraph-0.6.0 → forgegraph-0.7.0}/.gitignore +0 -0
  83. {forgegraph-0.6.0 → forgegraph-0.7.0}/.pre-commit-config.yaml +0 -0
  84. {forgegraph-0.6.0 → forgegraph-0.7.0}/CITATION.cff +0 -0
  85. {forgegraph-0.6.0 → forgegraph-0.7.0}/LICENSE +0 -0
  86. {forgegraph-0.6.0 → forgegraph-0.7.0}/SECURITY.md +0 -0
  87. {forgegraph-0.6.0 → forgegraph-0.7.0}/TRADEMARKS.md +0 -0
  88. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/design/architecture.md +0 -0
  89. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/design/initial-specification.md +0 -0
  90. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/formats/slide.md +0 -0
  91. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/graphspecs/polarization-curve.md +0 -0
  92. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/layouts/dashboard.md +0 -0
  93. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/pack.md +0 -0
  94. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/schedules/workday.md +0 -0
  95. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/acme/themes/acme.md +0 -0
  96. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/catalogs/formats/compact_format.md +0 -0
  97. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/catalogs/formats/wide_format.md +0 -0
  98. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/catalogs/themes/light_theme.md +0 -0
  99. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/formats/compact_format.md +0 -0
  100. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/formats/wide_format.md +0 -0
  101. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/layouts/layout.md +0 -0
  102. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/packs/forgegraph_default/schedules/schedule.md +0 -0
  103. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/get-started/installation.md +0 -0
  104. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/get-started/quickstart.md +0 -0
  105. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/get-started/skill.md +0 -0
  106. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/index.md +0 -0
  107. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/reference/python-api.md +0 -0
  108. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/site/stylesheets/extra.css +0 -0
  109. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/catalogs/graphtype_xy.md +0 -0
  110. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/catalogs/layer_error_bar.md +0 -0
  111. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/catalogs/layer_note.md +0 -0
  112. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/config.md +0 -0
  113. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/format.md +0 -0
  114. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/layer_error_bar.md +0 -0
  115. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/layer_note.md +0 -0
  116. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/layout_example.md +0 -0
  117. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/provenance.md +0 -0
  118. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/schedule.md +0 -0
  119. {forgegraph-0.6.0 → forgegraph-0.7.0}/docs/specifications/styles.md +0 -0
  120. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/README.md +0 -0
  121. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/forgegraph.toml +0 -0
  122. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/lab_throughput.layout.md +0 -0
  123. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/lab_throughput.layout.yaml +0 -0
  124. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/lost_runs.parquet +0 -0
  125. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/lost_runs.yaml +0 -0
  126. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/ops/formats/dashboard.md +0 -0
  127. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/ops/formats/dashboard.yaml +0 -0
  128. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/ops/pack.yaml +0 -0
  129. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/prep_lab_dashboard.py +0 -0
  130. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/run_time.parquet +0 -0
  131. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/run_time.yaml +0 -0
  132. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/runs_gc_ms_01.yaml +0 -0
  133. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/runs_hplc_01.yaml +0 -0
  134. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/runs_hplc_02.yaml +0 -0
  135. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/runs_icp_oes_01.yaml +0 -0
  136. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/samples_weekly.yaml +0 -0
  137. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/throughput_weekly.yaml +0 -0
  138. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_gc_ms_01.parquet +0 -0
  139. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_hplc_01.parquet +0 -0
  140. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_hplc_02.parquet +0 -0
  141. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_icp_oes_01.parquet +0 -0
  142. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_runs.parquet +0 -0
  143. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/dashboard/weekly_samples.parquet +0 -0
  144. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/cell_durability.parquet +0 -0
  145. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/cell_performance.layout.md +0 -0
  146. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/cell_performance.layout.yaml +0 -0
  147. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/cell_polarization.parquet +0 -0
  148. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/forgegraph.toml +0 -0
  149. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/hfr_time.yaml +0 -0
  150. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/journal/formats/journal-double.md +0 -0
  151. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/journal/formats/journal-double.yaml +0 -0
  152. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/journal/pack.yaml +0 -0
  153. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/polarization.yaml +0 -0
  154. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/prep_cells.py +0 -0
  155. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/layouts/paper/voltage_time.yaml +0 -0
  156. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/formats/slide.yaml +0 -0
  157. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/graphspecs/polarization-curve.yaml +0 -0
  158. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/layouts/dashboard.yaml +0 -0
  159. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/pack.yaml +0 -0
  160. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/references/house.md +0 -0
  161. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/schedules/workday.yaml +0 -0
  162. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/packs/acme/themes/acme.yaml +0 -0
  163. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/air_passengers.csv +0 -0
  164. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/air_passengers_by_month.csv +0 -0
  165. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/anscombe.csv +0 -0
  166. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/assay_summary.csv +0 -0
  167. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/cell_durability.csv +0 -0
  168. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/cell_polarization.csv +0 -0
  169. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/co2_monthly.csv +0 -0
  170. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/diamonds.csv +0 -0
  171. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/dose_response.csv +0 -0
  172. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/economics.csv +0 -0
  173. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/enzyme_kinetics.csv +0 -0
  174. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/fmri.csv +0 -0
  175. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/gapminder.csv +0 -0
  176. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/geyser.csv +0 -0
  177. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/growth.csv +0 -0
  178. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/iris.csv +0 -0
  179. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/lab_export.xlsx +0 -0
  180. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/lab_runs.xlsx +0 -0
  181. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/penguins.csv +0 -0
  182. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/seaice.csv +0 -0
  183. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/sensor_log_eu.csv +0 -0
  184. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/stocks.csv +0 -0
  185. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/tips.csv +0 -0
  186. {forgegraph-0.6.0 → forgegraph-0.7.0}/examples/sample-data/weather.xlsx +0 -0
  187. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/build_recreations.py +0 -0
  188. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/check_denylist.py +0 -0
  189. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/forgemark.py +0 -0
  190. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/mirror_specs.py +0 -0
  191. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/report_skill_evals.py +0 -0
  192. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/run_skill_evals.py +0 -0
  193. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/smoke_installed.py +0 -0
  194. {forgegraph-0.6.0 → forgegraph-0.7.0}/scripts/visual_changelog.py +0 -0
  195. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/__init__.py +0 -0
  196. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/__main__.py +0 -0
  197. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/canvas.py +0 -0
  198. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/__init__.py +0 -0
  199. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/build.py +0 -0
  200. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/examples.py +0 -0
  201. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/files.py +0 -0
  202. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/catalog_build/page.py +0 -0
  203. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/__init__.py +0 -0
  204. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/catalog.py +0 -0
  205. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/graphs.py +0 -0
  206. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/jobs.py +0 -0
  207. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/schema.py +0 -0
  208. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/cli/skill.py +0 -0
  209. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/data.py +0 -0
  210. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/__init__.py +0 -0
  211. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/colorbar.py +0 -0
  212. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/dates.py +0 -0
  213. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/errors.py +0 -0
  214. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/export.py +0 -0
  215. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/figure.py +0 -0
  216. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/layout.py +0 -0
  217. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/limits.py +0 -0
  218. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/lint.py +0 -0
  219. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/markup.py +0 -0
  220. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/spacing.py +0 -0
  221. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/style.py +0 -0
  222. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawing/text.py +0 -0
  223. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/drawn.py +0 -0
  224. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/IBMPlexSerif-Bold.ttf +0 -0
  225. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/IBMPlexSerif-Light.ttf +0 -0
  226. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/IBMPlexSerif-Medium.ttf +0 -0
  227. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/IBMPlexSerif-Regular.ttf +0 -0
  228. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
  229. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/OFL-IBMPlexSerif.txt +0 -0
  230. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/OFL-Roboto.txt +0 -0
  231. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/OFL-SourceSans3.md +0 -0
  232. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-Bold.ttf +0 -0
  233. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-Italic.ttf +0 -0
  234. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-Light.ttf +0 -0
  235. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-Medium.ttf +0 -0
  236. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-Regular.ttf +0 -0
  237. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/Roboto-SemiBold.ttf +0 -0
  238. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-Bold.ttf +0 -0
  239. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-It.ttf +0 -0
  240. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-Light.ttf +0 -0
  241. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-Medium.ttf +0 -0
  242. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-Regular.ttf +0 -0
  243. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/SourceSans3-Semibold.ttf +0 -0
  244. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/fonts/__init__.py +0 -0
  245. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/forgemark.py +0 -0
  246. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/graph.py +0 -0
  247. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/jobs/__init__.py +0 -0
  248. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/jobs/run.py +0 -0
  249. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/jobs/status.py +0 -0
  250. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/layouts/__init__.py +0 -0
  251. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/layouts/separators.py +0 -0
  252. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/__init__.py +0 -0
  253. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/catalogs/formats/compact_format.yaml +0 -0
  254. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/catalogs/formats/wide_format.yaml +0 -0
  255. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/catalogs/themes/light_theme.yaml +0 -0
  256. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/formats/compact_format.yaml +0 -0
  257. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/formats/wide_format.yaml +0 -0
  258. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/graphspecs/dated.parquet +0 -0
  259. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/graphspecs/fanned.parquet +0 -0
  260. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/graphspecs/polarization.parquet +0 -0
  261. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/graphspecs/reinforced.parquet +0 -0
  262. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/layouts/layout.yaml +0 -0
  263. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/packs/forgegraph_default/schedules/schedule.yaml +0 -0
  264. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/__init__.py +0 -0
  265. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/bars.yaml +0 -0
  266. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/figure.layout.yaml +0 -0
  267. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/figure.schedule.yaml +0 -0
  268. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/layers.yaml +0 -0
  269. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/xy.parquet +0 -0
  270. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/examples/xy.yaml +0 -0
  271. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/references/requests.md +0 -0
  272. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/skill/forgegraph/references/themes_formats_configs.md +0 -0
  273. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/__init__.py +0 -0
  274. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/access.py +0 -0
  275. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/common.py +0 -0
  276. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/explain.py +0 -0
  277. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/layers.py +0 -0
  278. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/layout.py +0 -0
  279. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/loaded.py +0 -0
  280. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/parameters.py +0 -0
  281. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/provenance.py +0 -0
  282. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/registry.py +0 -0
  283. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/resolve.py +0 -0
  284. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/schedule.py +0 -0
  285. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/series.py +0 -0
  286. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/tags.py +0 -0
  287. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/spec/validate.py +0 -0
  288. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/catalogs/graphtype_xy.yaml +0 -0
  289. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/catalogs/layer_error_bar.yaml +0 -0
  290. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/catalogs/layer_note.yaml +0 -0
  291. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/config.toml +0 -0
  292. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/format.yaml +0 -0
  293. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/layer_error_bar.yaml +0 -0
  294. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/layer_note.yaml +0 -0
  295. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/layout_example.yaml +0 -0
  296. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/provenance.yaml +0 -0
  297. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/schedule.yaml +0 -0
  298. {forgegraph-0.6.0 → forgegraph-0.7.0}/src/forgegraph/specifications/styles.yaml +0 -0
  299. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/crowded_runs.png +0 -0
  300. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/flow_sweep_wide.png +0 -0
  301. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/fuel_by_size.png +0 -0
  302. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/layout_anode_layers.png +0 -0
  303. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/layout_screening_and_rate.png +0 -0
  304. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/polarization.png +0 -0
  305. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/polarization_narrow.png +0 -0
  306. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/precipitation_loglog.png +0 -0
  307. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/replicates.png +0 -0
  308. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/screening_scatter.png +0 -0
  309. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/baselines/separator_colorbar.png +0 -0
  310. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/conftest.py +0 -0
  311. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/fixtures/catalog_comments.html +0 -0
  312. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/pack_helpers.py +0 -0
  313. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/recreations.py +0 -0
  314. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/render_helpers.py +0 -0
  315. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/spec_mirror.py +0 -0
  316. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_blank.py +0 -0
  317. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_catalog.py +0 -0
  318. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_catalog_files.py +0 -0
  319. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_catalog_inputs.py +0 -0
  320. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_catalog_page.py +0 -0
  321. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_cli.py +0 -0
  322. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_dates.py +0 -0
  323. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_denylist.py +0 -0
  324. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_jobs.py +0 -0
  325. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_labels.py +0 -0
  326. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_lint.py +0 -0
  327. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_markup.py +0 -0
  328. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_packaging.py +0 -0
  329. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_packs.py +0 -0
  330. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_perturbation.py +0 -0
  331. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_regression.py +0 -0
  332. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_schedule.py +0 -0
  333. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_smoke.py +0 -0
  334. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_spec_comments.py +0 -0
  335. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_spec_mirrors.py +0 -0
  336. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_specs.py +0 -0
  337. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_styles.py +0 -0
  338. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_tags.py +0 -0
  339. {forgegraph-0.6.0 → forgegraph-0.7.0}/tests/test_text.py +0 -0
@@ -2,6 +2,39 @@
2
2
 
3
3
  ForgeGraph follows [semantic versioning](https://semver.org). Before 1.0, a minor version may change how graphs look or how specs are written.
4
4
 
5
+ ## 0.7.0 (2026-11-02)
6
+
7
+ ### New Features
8
+
9
+ - **Heat maps.** `marker.shape: grid_cell` makes each point fill its place in a grid, so an xy graph colored by a column of numbers becomes a heat map. The cells fit at any format, and an HTML page shows a cell's values when you point at it. There's an example in the gallery and in the skill.
10
+ - **Reference lines from an equation.** A reference line can now be an equation instead of a value, such as `equation: x` for a y = x line on a parity plot, or `2x^2 - 3x + 1` for a curve. Two equations, such as `x - 10` and `x + 10`, make a tolerance band.
11
+ - **No tick labels.** `tick.algorithm: none` draws no ticks or tick labels on an axis, for when there are too many names to fit and readers can point at a point to see its name.
12
+ - **Tab bars stay in view.** On a layout's HTML page, the tabs now stay at the top of the window as you scroll, and switching tabs keeps your place on the page.
13
+
14
+ ### Changes
15
+
16
+ - **More in the hover box.** On a graph of more than one series, the hover box now always names the series. It also shows each column a series is split by, so splitting a scatter by its sample's name shows that name on each point.
17
+ - **More room for keys.** A reference line's label at `position: auto` now goes after the keys and keeps clear of them, so keys and labels may sit in different places than before. A second key can go under or beside the first, and the y-axis can grow by up to `axis.max_extension` to make room for a key. Some graphs that couldn't fit a key now draw, with a longer y-axis.
18
+ - **Clearer key errors.** When a key doesn't fit, the error now says what's in the way at each position.
19
+
20
+ ### Bug Fixes
21
+
22
+ - Coloring by the column on a categorical axis gave every point the first color and labelled the groups 0.0, 1.0 and 2.0. Each category now gets its own color, and the same goes for marker shapes and line styles. The axis already names the groups, so with `legend.method: auto` they aren't named again.
23
+ - A categorical axis with exactly two categories had no tick labels. It now has one for each category.
24
+ - An aggregated series colored by a column of numbers crashed with a message from matplotlib. If the rows behind a point share one value, the point now takes that color. If they don't, it's an error that says which column to change.
25
+ - The hover box on an integer axis showed `2.0` where it now shows `2`.
26
+
27
+ ## 0.6.1 (2026-10-31)
28
+
29
+ ### Changes
30
+
31
+ - **A reference line for each look.** With `per_series`, a reference layer now draws a line for each look its series are drawn in: each color, marker shape, marker fill and line style. Before, groups that differed only in marker shape, fill or line style shared one line. Lines that `split` draws, such as replicates, still share one.
32
+ - **Guides on the documentation site.** The site now has a guide to each part of ForgeGraph, a gallery of worked examples, help with every lint issue and common error, and the release notes.
33
+
34
+ ### Bug Fixes
35
+
36
+ - `per_series` with series colored on a scale is now an error. Before, it drew a single line over all the rows in the palette's first color.
37
+
5
38
  ## 0.6.0 (2026-10-30)
6
39
 
7
40
  ### New Features
@@ -33,7 +33,7 @@ uv run python scripts/build_recreations.py --baselines
33
33
 
34
34
  ## The documentation site
35
35
 
36
- The site is built with MkDocs from docs/site. Its Reference pages are generated as it's built: the commands from the CLI, the specifications and the built-in pack from their files, and the Python API from the docstrings (scripts/docs_site.py). To build it and read it while you work:
36
+ The site is built with MkDocs from docs/site. Its Reference pages are generated as it's built: the commands from the CLI, the specifications and the built-in pack from their files, and the Python API from the docstrings (scripts/docs_site.py). The guides' and gallery's graphs are drawn as it's built, from the GraphSpecs, layouts and pack in docs/examples and the layouts in examples/layouts, with data from examples/sample-data, so an example that can't be drawn standard and lint-clean fails the build. To build it and read it while you work:
37
37
 
38
38
  ```bash
39
39
  uv run --group docs mkdocs serve
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: forgegraph
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: Fast, consistent, publication-quality graphs from pandas DataFrames, usable by people and AI agents.
5
5
  Project-URL: Repository, https://github.com/sskaye/forgegraph
6
6
  Project-URL: Issues, https://github.com/sskaye/forgegraph/issues
@@ -172,6 +172,7 @@ ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICE
172
172
 
173
173
  ## Documentation
174
174
 
175
+ - [Documentation site](https://sskaye.github.io/forgegraph/): getting started, and a reference for every specification, command and Python function.
175
176
  - [Specifications](https://github.com/sskaye/forgegraph/blob/main/docs/specifications): the file that defines each kind of spec, every parameter with its default, range and description.
176
177
  - [Built-in pack](https://github.com/sskaye/forgegraph/blob/main/docs/packs/forgegraph_default): forgegraph_default's specs.
177
178
  - [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
@@ -142,6 +142,7 @@ ForgeGraph is [MIT-licensed](https://github.com/sskaye/forgegraph/blob/main/LICE
142
142
 
143
143
  ## Documentation
144
144
 
145
+ - [Documentation site](https://sskaye.github.io/forgegraph/): getting started, and a reference for every specification, command and Python function.
145
146
  - [Specifications](https://github.com/sskaye/forgegraph/blob/main/docs/specifications): the file that defines each kind of spec, every parameter with its default, range and description.
146
147
  - [Built-in pack](https://github.com/sskaye/forgegraph/blob/main/docs/packs/forgegraph_default): forgegraph_default's specs.
147
148
  - [Changelog](https://github.com/sskaye/forgegraph/blob/main/CHANGELOG.md).
@@ -0,0 +1,24 @@
1
+ name: acme_polarization
2
+ version: 0
3
+ description: The polarization curves in the example acme pack's theme and slide format.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: acme/acme
9
+ format: acme/slide
10
+ text:
11
+ title: Polarization curves
12
+ data:
13
+ file: cell_polarization.parquet
14
+ preprocessing: examples/sample-data/cell_polarization.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: current_density_a_cm2
19
+ title: Current density (A/cm^2)
20
+ y:
21
+ title: Voltage (V)
22
+ series:
23
+ voltage_v:
24
+ color: cell
@@ -0,0 +1,33 @@
1
+ name: assay_summary
2
+ version: 0
3
+ description: Each compound's mean response at each dose, with error bars from the standard deviations in the data.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Dose response
12
+ data:
13
+ file: assay_summary.parquet
14
+ preprocessing: examples/sample-data/assay_summary.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: dose_uM
19
+ type: categorical
20
+ title: Dose (µM)
21
+ y:
22
+ title: Response (%)
23
+ series:
24
+ mean_response_pct:
25
+ color: compound
26
+ layers:
27
+ spread:
28
+ type: error_bar
29
+ value:
30
+ lower: sd_pct
31
+ upper: sd_pct
32
+ aggregation:
33
+ function: None
@@ -0,0 +1,26 @@
1
+ name: cells
2
+ version: 0
3
+ description: The fuel cells' graphs under one tab, beside a tab of the CO₂ record.
4
+ extends: forgegraph_default/layout
5
+
6
+ parameters:
7
+ specifications:
8
+ format: forgegraph_default/compact_format
9
+ tabs:
10
+ Cells:
11
+ tabs:
12
+ Polarization:
13
+ grid:
14
+ areas: [[curves]]
15
+ tiles:
16
+ curves: polarization.yaml
17
+ Durability:
18
+ grid:
19
+ areas: [[voltage]]
20
+ tiles:
21
+ voltage: durability.yaml
22
+ CO2:
23
+ grid:
24
+ areas: [[record]]
25
+ tiles:
26
+ record: co2.yaml
@@ -0,0 +1,28 @@
1
+ name: co2
2
+ version: 0
3
+ description: Monthly CO₂ at Mauna Loa, on a date axis, with the line broken where a month is missing.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Atmospheric CO_{2}
12
+ data:
13
+ file: co2_monthly.parquet
14
+ preprocessing: examples/sample-data/co2_monthly.csv, with its dates read as dates and -99.99 as missing
15
+ axis:
16
+ x:
17
+ data:
18
+ column: date
19
+ title: None
20
+ y:
21
+ title: CO_{2} (ppm)
22
+ series:
23
+ Monthly mean:
24
+ column: co2_ppm
25
+ marker:
26
+ show: false
27
+ line:
28
+ missing_values: gap
@@ -0,0 +1,33 @@
1
+ name: dose_response
2
+ version: 0
3
+ description: The mean response of three compounds at each dose, with error bars of one standard deviation and a note.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Dose response
12
+ data:
13
+ file: dose_response.parquet
14
+ preprocessing: examples/sample-data/dose_response.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: dose_uM
19
+ type: categorical
20
+ title: Dose (µM)
21
+ y:
22
+ title: Response (%)
23
+ series:
24
+ response_pct:
25
+ aggregation:
26
+ function: mean
27
+ color: compound
28
+ layers:
29
+ spread:
30
+ type: error_bar
31
+ replicates:
32
+ type: note
33
+ text: Mean ± SD of 3 replicates
@@ -0,0 +1,26 @@
1
+ name: durability
2
+ version: 0
3
+ description: Each cell's voltage over a 200-hour durability test, as lines without markers.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Durability test
12
+ data:
13
+ file: cell_durability.parquet
14
+ preprocessing: examples/sample-data/cell_durability.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: hours
19
+ title: Time (h)
20
+ y:
21
+ title: Voltage (V)
22
+ series:
23
+ voltage_v:
24
+ color: cell
25
+ marker:
26
+ show: false
@@ -0,0 +1,24 @@
1
+ name: lab_polarization
2
+ version: 0
3
+ description: The polarization curves in the lab pack's theme and poster format.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: lab/lab_theme
9
+ format: lab/poster
10
+ text:
11
+ title: Polarization curves
12
+ data:
13
+ file: cell_polarization.parquet
14
+ preprocessing: examples/sample-data/cell_polarization.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: current_density_a_cm2
19
+ title: Current density (A/cm^2)
20
+ y:
21
+ title: Voltage (V)
22
+ series:
23
+ voltage_v:
24
+ color: cell
@@ -0,0 +1,11 @@
1
+ name: poster
2
+ version: 0
3
+ description: A graph for a poster, wider than the built-in compact format and with larger text.
4
+ extends: forgegraph_default/compact_format
5
+
6
+ parameters:
7
+ figure:
8
+ width: 200
9
+ base_size: 22
10
+ output:
11
+ file_types: [png, pdf]
@@ -0,0 +1,5 @@
1
+ name: lab
2
+ version: 1.0.0
3
+ description: A lab's house style, for the guide to themes, formats and packs.
4
+ issues: https://github.com/sskaye/forgegraph/issues
5
+ requires: ">=0.6, <1"
@@ -0,0 +1,13 @@
1
+ name: lab_theme
2
+ version: 0
3
+ description: The lab's look, the built-in theme with Paul Tol's bright colors and horizontal grid lines.
4
+ extends: forgegraph_default/light_theme
5
+
6
+ parameters:
7
+ series:
8
+ colors: tol_bright
9
+ grid:
10
+ y:
11
+ show: true
12
+ title:
13
+ weight: bold
@@ -0,0 +1,29 @@
1
+ name: penguins
2
+ version: 0
3
+ description: Bill depth against bill length for three penguin species, as markers colored and shaped by species.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Penguin bills
12
+ data:
13
+ file: penguins.parquet
14
+ preprocessing: examples/sample-data/penguins.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: bill_length_mm
19
+ title: Bill length (mm)
20
+ y:
21
+ title: Bill depth (mm)
22
+ series:
23
+ bill_depth_mm:
24
+ color: species
25
+ line:
26
+ show: false
27
+ marker:
28
+ shape: species
29
+ size: 0.3
@@ -0,0 +1,32 @@
1
+ name: plate_spectra
2
+ version: 0
3
+ description: A heat map of a plate's spectra, one row for each sample, colored by absorbance.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: A plate of UV-Vis spectra
12
+ data:
13
+ file: plate_spectra.parquet
14
+ preprocessing: examples/sample-data/plate_spectra.csv
15
+ arrangement:
16
+ base_axis: y
17
+ axis:
18
+ x:
19
+ title: Wavelength (nm)
20
+ y:
21
+ data:
22
+ column: Sample
23
+ type: categorical
24
+ title: Sample
25
+ series:
26
+ Wavelength (nm):
27
+ color: Normalized absorbance
28
+ color_scale: continuous
29
+ marker:
30
+ shape: grid_cell
31
+ line:
32
+ show: false
@@ -0,0 +1,24 @@
1
+ name: polarization
2
+ version: 0
3
+ description: Polarization curves of three fuel cells, voltage against current density.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Polarization curves
12
+ data:
13
+ file: cell_polarization.parquet
14
+ preprocessing: examples/sample-data/cell_polarization.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: current_density_a_cm2
19
+ title: Current density (A/cm^2)
20
+ y:
21
+ title: Voltage (V)
22
+ series:
23
+ voltage_v:
24
+ color: cell
@@ -0,0 +1,58 @@
1
+ name: savings
2
+ version: 0
3
+ description: The personal savings rate by month, with a line at its mean and a band one standard deviation either side.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Personal savings rate
12
+ data:
13
+ file: economics.parquet
14
+ preprocessing: examples/sample-data/economics.csv, with its dates read as dates
15
+ axis:
16
+ x:
17
+ data:
18
+ column: date
19
+ title: None
20
+ y:
21
+ title: Savings rate (%)
22
+ series:
23
+ Savings rate:
24
+ column: psavert
25
+ marker:
26
+ show: false
27
+ layers:
28
+ spread:
29
+ type: reference
30
+ axis: y
31
+ line_1:
32
+ value: psavert
33
+ aggregation:
34
+ function: mean
35
+ offset:
36
+ function: stddev
37
+ multiplier: -1
38
+ line:
39
+ style: None
40
+ line_2:
41
+ value: psavert
42
+ aggregation:
43
+ function: mean
44
+ offset:
45
+ function: stddev
46
+ line:
47
+ style: None
48
+ mean:
49
+ type: reference
50
+ axis: y
51
+ line_1:
52
+ value: psavert
53
+ aggregation:
54
+ function: mean
55
+ label:
56
+ text: aggregation_value
57
+ position: end_above
58
+ inside: false
@@ -0,0 +1,46 @@
1
+ name: tips_side_by_side
2
+ version: 0
3
+ description: The mean tip on each day, for women and men side by side, with the 95 % confidence interval of each mean.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Tips by day
12
+ data:
13
+ file: tips.parquet
14
+ preprocessing: examples/sample-data/tips.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: day
19
+ order:
20
+ method: value
21
+ direction: descending
22
+ title: None
23
+ y:
24
+ title: Mean tip ($)
25
+ arrangement:
26
+ offset: side_by_side
27
+ legend:
28
+ key:
29
+ inside: false
30
+ series:
31
+ tip:
32
+ aggregation:
33
+ function: mean
34
+ color: sex
35
+ line:
36
+ show: false
37
+ marker:
38
+ show: false
39
+ bar:
40
+ show: true
41
+ layers:
42
+ spread:
43
+ type: error_bar
44
+ value:
45
+ aggregation:
46
+ function: ci
@@ -0,0 +1,42 @@
1
+ name: tips_stacked
2
+ version: 0
3
+ description: The total of the bills on each day, stacked by lunch and dinner, with each day's total written above.
4
+ extends: None
5
+ parameters: !var
6
+ specifications:
7
+ graph_type: xy
8
+ theme: forgegraph_default/light_theme
9
+ format: forgegraph_default/compact_format
10
+ text:
11
+ title: Bills by day
12
+ data:
13
+ file: tips.parquet
14
+ preprocessing: examples/sample-data/tips.csv, unchanged
15
+ axis:
16
+ x:
17
+ data:
18
+ column: day
19
+ order:
20
+ method: value
21
+ direction: descending
22
+ title: None
23
+ y:
24
+ title: Total of the bills ($)
25
+ arrangement:
26
+ stacking: sum
27
+ total:
28
+ show: true
29
+ legend:
30
+ key:
31
+ inside: false
32
+ series:
33
+ total_bill:
34
+ aggregation:
35
+ function: sum
36
+ color: time
37
+ line:
38
+ show: false
39
+ marker:
40
+ show: false
41
+ bar:
42
+ show: true
@@ -30,7 +30,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
30
30
              min: None          *# \[None, float, date\]; The axis minimum. On a datetime axis, it's a date, e.g. 2025-08-25 or "2025-08-25T06:00". If None, it's the lowest value minus plot_area.gap × the data's range.*\
31
31
              max: None          *# \[None, float, date\]; The axis maximum. On a datetime axis, it's a date, e.g. 2025-08-25 or "2025-08-25T06:00". If None, it's the highest value plus plot_area.gap × the data's range.*\
32
32
              tick:\
33
-                 algorithm: auto          *# \[auto, all, manual\]; How the ticks are placed. auto uses the theme's algorithm, or on dates, the boundaries of one calendar unit. all places a tick at every value. manual places one every tick.step.*\
33
+                 algorithm: auto          *# \[auto, all, manual, none\]; How the ticks are placed. auto uses the theme's algorithm, or on dates, the boundaries of one calendar unit. all places a tick at every value. manual places one every tick.step. none draws no ticks or tick labels.*\
34
34
                  step: None          *# \[None, float > 0, text\]; The distance between ticks when algorithm is manual, e.g. 5 or "2 week". On a log axis, it's a factor.*\
35
35
                  label:\
36
36
                      format: auto          *# \[auto, format\]; The tick label format. auto chooses one from the values, and for dates, from the tick unit.*\
@@ -46,7 +46,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
46
46
              min: None          *# \[None, float, date\]; The axis minimum. On a datetime axis, it's a date, e.g. 2025-08-25 or "2025-08-25T06:00". If None, it's the lowest value minus plot_area.gap × the data's range.*\
47
47
              max: None          *# \[None, float, date\]; The axis maximum. On a datetime axis, it's a date, e.g. 2025-08-25 or "2025-08-25T06:00". If None, it's the highest value plus plot_area.gap × the data's range.*\
48
48
              tick:\
49
-                 algorithm: auto          *# \[auto, all, manual\]; How the ticks are placed. auto uses the theme's algorithm, or on dates, the boundaries of one calendar unit. all places a tick at every value. manual places one every tick.step.*\
49
+                 algorithm: auto          *# \[auto, all, manual, none\]; How the ticks are placed. auto uses the theme's algorithm, or on dates, the boundaries of one calendar unit. all places a tick at every value. manual places one every tick.step. none draws no ticks or tick labels.*\
50
50
                  step: None          *# \[None, float > 0, text\]; The distance between ticks when algorithm is manual, e.g. 5 or "2 week". On a log axis, it's a factor.*\
51
51
                  label:\
52
52
                      format: auto          *# \[auto, format\]; The tick label format. auto chooses one from the values, and for dates, from the tick unit.*\
@@ -60,7 +60,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
60
60
          "Cell Voltage (V)":\
61
61
              column: name          *# \[name, column\]; The column of values the series draws along the axis that isn't arrangement.base_axis. name uses the column with the series' name.*\
62
62
              aggregation:          *# \[aggregation style\]; How rows at the same location are combined into one point. If its function is None, each row is drawn.*\
63
-             split: \[Cell, Run\]          *# \[None, columns\]; Columns whose values split the series into separate lines, e.g. replicates.*\
63
+             split: \[Cell, Run\]          *# \[None, columns\]; Columns whose values split the series into separate lines, e.g. replicates. An html page's readout shows each one.*\
64
64
              order: sorted          *# \[sorted, data\]; The order of the series' groups: sorted, or data for the order in which they first appear.*\
65
65
              color: Cell          *# \[series, hex color, column\]; The series' color. series takes the next palette color, and a column gives each of its values its own.*\
66
66
              color_scale: auto          *# \[auto, categorical, continuous\]; For a color column: categorical uses the palette, continuous a color scale and color bar, and auto continuous for numbers.*\
@@ -73,7 +73,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
73
73
                  missing_values: drop          *# \[drop, gap\]; What happens to rows missing x or y. drop joins the line across them, and gap breaks the line. Lint counts both in dropped-rows.*\
74
74
              marker:\
75
75
                  show: true          *# \[true, false\]; Whether to draw markers.*\
76
-                 shape: first          *# \[first, series, circle, square, triangle_up, triangle_down, diamond, cross, plus, column\]; The marker shape. first is the theme's first marker shape, series takes the next one, and a column gives each of its values its own.*\
76
+                 shape: first          *# \[first, series, circle, square, triangle_up, triangle_down, diamond, cross, plus, grid_cell, column\]; The marker shape. first is the theme's first marker shape, series takes the next one, and a column gives each of its values its own. grid_cell fills the grid the points lie on, for a heat map.*\
77
77
                  fill: first          *# \[first, series, filled, open, column\]; The marker fill. first is the theme's first marker fill, series takes the next one, and a column gives each of its values its own.*\
78
78
                  size: 0.5          *# \[float > 0\]; The marker size, × base size.*\
79
79
              bar:\
@@ -91,7 +91,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
91
91
      legend:\
92
92
          method: auto          *# \[auto, direct, key, none\]; How this graph names its series: one of the theme's legend.methods.*\
93
93
          key:\
94
-             positions: \[top_right, top_left, bottom_right, bottom_left\]          *# \[top_left, top_center, top_right, bottom_left, bottom_center, bottom_right, right_top, right_center, right_bottom\]; The positions to try, in order. The key goes in the first one where it doesn't overlap the data.*\
94
+             positions: \[top_right, top_left, bottom_right, bottom_left\]          *# \[top_left, top_center, top_right, bottom_left, bottom_center, bottom_right, right_top, right_center, right_bottom\]; The positions to try, in order. The key goes in the first one where it doesn't overlap the data. If there's none inside the plot, it goes beside a key there, or the y-axis is extended.*\
95
95
              inside: true          *# \[true, false\]; Whether the key is inside the plot area. If false, top positions are above the plot area, bottom positions are below the x-axis title, and right positions are to its right.*\
96
96
              title:\
97
97
                  text: column_name          *# \[None, column_name, text\]; The title of every key. column_name uses the name of each key's column. Other text is allowed only when there is one key. If None, there is no title.*\
@@ -106,11 +106,11 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
106
106
      layers:          *# The layers drawn on the graph, in this order, each under a name the GraphSpec chooses. A layer may set the look its theme marks !var.*\
107
107
          target:\
108
108
              type: reference          *# \[layer type\]; The layer's type: one of the graph type's layer.types.*\
109
-             axis: y          *# \[x, y\]; The axis the values are on. y draws horizontal lines.*\
109
+             axis: y          *# \[x, y\]; The axis the values are on. y draws horizontal lines, and an equation then gives y in terms of x.*\
110
110
              line_1:\
111
111
                  value: 1.2          *# \[None, float, date, column\]; A number, a date, or a column.*\
112
112
                  label:\
113
-                     text: Target 1.2 V          *# \[None, aggregation, value, aggregation_value, text\]; aggregation writes e.g. Mean, value e.g. 14.9, and aggregation_value e.g. Mean: 14.9. Other text is written as given.*\
113
+                     text: Target 1.2 V          *# \[None, aggregation, value, aggregation_value, text\]; aggregation writes e.g. Mean, value e.g. 14.9, and aggregation_value e.g. Mean: 14.9. With an equation, value writes e.g. y = 2x. Other text is written as given.*\
114
114
          conditions:\
115
115
              type: note          *# \[layer type\]; The layer's type: one of the graph type's layer.types.*\
116
116
              text: "60 °C, 1 atm, H₂/air"          *# \[text\]; The note's text, in label markup. A line break starts a new line.*
@@ -3,7 +3,7 @@
3
3
  This page mirrors src/forgegraph/packs/forgegraph_default/pack.yaml, which is the specification. A test fails if they ever differ.
4
4
 
5
5
  name: forgegraph_default          *# \[text\]; The pack's name, which its specs' names start with (pack/name); a pip pack's must match its entry point.*\
6
- version: 0.6.0          *# \[text\]; The pack's release version.*\
6
+ version: 0.7.0          *# \[text\]; The pack's release version.*\
7
7
  description: ForgeGraph's built-in default pack. So it’s always possible to create a graph.          *# \[text\]; One line, describing what the pack is.*\
8
8
  issues: https://github.com/sskaye/forgegraph/issues          *# \[text\]; Where to file feature requests and bug reports about the pack.*\
9
- requires: ">=0.6, <0.7"          *# \[None, version specifier\]; The ForgeGraph version required for the pack. pip format, e.g. ">=0.6, <1". If None, it works with any version.*
9
+ requires: ">=0.7, <0.8"          *# \[None, version specifier\]; The ForgeGraph version required for the pack. pip format, e.g. ">=0.6, <1". If None, it works with any version.*
@@ -46,7 +46,7 @@ parameters: !var          *# !var/!fix sets whether a GraphSpec may ch
46
46
                  count: 0          *# \[int ≥ 0\]; The number of minor ticks between major ticks. If 0, there are none.*\
47
47
                  length: 0.15          *# \[float ≥ 0\]; The minor tick length, × base size.*\
48
48
                  width: 0.05          *# \[float ≥ 0\]; The width, × base size. If 0, no line is drawn.*\
49
-         max_extension: 0.15          *# \[0-1\]; The most an axis may be extended to fit direct labels, notes and line labels inside the plot area, × its range. If 0, it's never extended.*\
49
+         max_extension: 0.15          *# \[0-1\]; The most an axis may be extended to fit direct labels, keys, notes and line labels inside the plot area, × its range. If 0, it's never extended.*\
50
50
      plot_area:\
51
51
          border:          *# \[line style\]; The plot area's border.*\
52
52
              width: 0.08          *# \[float ≥ 0\]; The width, × base size. If 0, no line is drawn.*\