plotstyle 1.0.0__tar.gz → 1.2.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 (162) hide show
  1. {plotstyle-1.0.0 → plotstyle-1.2.0}/.gitignore +3 -0
  2. {plotstyle-1.0.0 → plotstyle-1.2.0}/CHANGELOG.md +58 -1
  3. plotstyle-1.2.0/PKG-INFO +594 -0
  4. plotstyle-1.2.0/README.md +513 -0
  5. {plotstyle-1.0.0 → plotstyle-1.2.0}/pyproject.toml +3 -2
  6. plotstyle-1.2.0/src/plotstyle/__init__.py +95 -0
  7. plotstyle-1.2.0/src/plotstyle/_compat/__init__.py +13 -0
  8. plotstyle-1.2.0/src/plotstyle/_compat/mpl_style.py +137 -0
  9. plotstyle-1.2.0/src/plotstyle/_utils/__init__.py +17 -0
  10. plotstyle-1.2.0/src/plotstyle/_utils/io.py +49 -0
  11. plotstyle-1.2.0/src/plotstyle/_utils/warnings.py +38 -0
  12. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/_version.py +2 -2
  13. plotstyle-1.2.0/src/plotstyle/cli/main.py +519 -0
  14. plotstyle-1.2.0/src/plotstyle/color/__init__.py +11 -0
  15. plotstyle-1.2.0/src/plotstyle/color/_rendering.py +39 -0
  16. plotstyle-1.2.0/src/plotstyle/color/accessibility.py +198 -0
  17. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/color/data/tol_bright.json +1 -1
  18. plotstyle-1.2.0/src/plotstyle/color/data/tol_high_contrast.json +5 -0
  19. plotstyle-1.2.0/src/plotstyle/color/data/tol_light.json +5 -0
  20. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/color/data/tol_muted.json +1 -1
  21. plotstyle-1.2.0/src/plotstyle/color/data/tol_rainbow_10.json +5 -0
  22. plotstyle-1.2.0/src/plotstyle/color/data/tol_rainbow_12.json +5 -0
  23. plotstyle-1.2.0/src/plotstyle/color/data/tol_rainbow_4.json +5 -0
  24. plotstyle-1.2.0/src/plotstyle/color/data/tol_rainbow_6.json +5 -0
  25. plotstyle-1.2.0/src/plotstyle/color/data/tol_rainbow_8.json +5 -0
  26. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/color/data/tol_vibrant.json +1 -1
  27. plotstyle-1.2.0/src/plotstyle/color/grayscale.py +165 -0
  28. plotstyle-1.2.0/src/plotstyle/color/palettes.py +236 -0
  29. plotstyle-1.2.0/src/plotstyle/core/export.py +379 -0
  30. plotstyle-1.2.0/src/plotstyle/core/figure.py +397 -0
  31. plotstyle-1.2.0/src/plotstyle/core/migrate.py +421 -0
  32. plotstyle-1.2.0/src/plotstyle/core/style.py +836 -0
  33. plotstyle-1.2.0/src/plotstyle/engine/fonts.py +196 -0
  34. plotstyle-1.2.0/src/plotstyle/engine/latex.py +154 -0
  35. plotstyle-1.2.0/src/plotstyle/engine/rcparams.py +259 -0
  36. plotstyle-1.2.0/src/plotstyle/integrations/seaborn.py +114 -0
  37. plotstyle-1.2.0/src/plotstyle/overlays/__init__.py +252 -0
  38. plotstyle-1.2.0/src/plotstyle/overlays/bar.toml +10 -0
  39. plotstyle-1.2.0/src/plotstyle/overlays/cjk-japanese.toml +17 -0
  40. plotstyle-1.2.0/src/plotstyle/overlays/cjk-korean.toml +17 -0
  41. plotstyle-1.2.0/src/plotstyle/overlays/cjk-simplified.toml +17 -0
  42. plotstyle-1.2.0/src/plotstyle/overlays/cjk-traditional.toml +17 -0
  43. plotstyle-1.2.0/src/plotstyle/overlays/grid.toml +10 -0
  44. plotstyle-1.2.0/src/plotstyle/overlays/high-vis.toml +13 -0
  45. plotstyle-1.2.0/src/plotstyle/overlays/latex-sans.toml +10 -0
  46. plotstyle-1.2.0/src/plotstyle/overlays/minimal.toml +12 -0
  47. plotstyle-1.2.0/src/plotstyle/overlays/no-latex.toml +9 -0
  48. plotstyle-1.2.0/src/plotstyle/overlays/notebook.toml +16 -0
  49. plotstyle-1.2.0/src/plotstyle/overlays/okabe-ito.toml +7 -0
  50. plotstyle-1.2.0/src/plotstyle/overlays/pgf.toml +9 -0
  51. plotstyle-1.2.0/src/plotstyle/overlays/presentation.toml +14 -0
  52. plotstyle-1.2.0/src/plotstyle/overlays/russian.toml +15 -0
  53. plotstyle-1.2.0/src/plotstyle/overlays/safe-grayscale.toml +7 -0
  54. plotstyle-1.2.0/src/plotstyle/overlays/scatter.toml +11 -0
  55. plotstyle-1.2.0/src/plotstyle/overlays/schema.py +125 -0
  56. plotstyle-1.2.0/src/plotstyle/overlays/tol-bright.toml +7 -0
  57. plotstyle-1.2.0/src/plotstyle/overlays/tol-high-contrast.toml +7 -0
  58. plotstyle-1.2.0/src/plotstyle/overlays/tol-light.toml +7 -0
  59. plotstyle-1.2.0/src/plotstyle/overlays/tol-muted.toml +7 -0
  60. plotstyle-1.2.0/src/plotstyle/overlays/tol-rainbow-10.toml +7 -0
  61. plotstyle-1.2.0/src/plotstyle/overlays/tol-rainbow-12.toml +7 -0
  62. plotstyle-1.2.0/src/plotstyle/overlays/tol-rainbow-4.toml +7 -0
  63. plotstyle-1.2.0/src/plotstyle/overlays/tol-rainbow-6.toml +7 -0
  64. plotstyle-1.2.0/src/plotstyle/overlays/tol-rainbow-8.toml +7 -0
  65. plotstyle-1.2.0/src/plotstyle/overlays/tol-vibrant.toml +7 -0
  66. plotstyle-1.2.0/src/plotstyle/overlays/turkish.toml +15 -0
  67. plotstyle-1.2.0/src/plotstyle/preview/__init__.py +11 -0
  68. plotstyle-1.2.0/src/plotstyle/preview/gallery.py +173 -0
  69. plotstyle-1.2.0/src/plotstyle/preview/print_size.py +135 -0
  70. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/__init__.py +96 -83
  71. plotstyle-1.2.0/src/plotstyle/specs/acs.toml +32 -0
  72. plotstyle-1.2.0/src/plotstyle/specs/cell.toml +35 -0
  73. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/elsevier.toml +9 -13
  74. plotstyle-1.2.0/src/plotstyle/specs/ieee.toml +31 -0
  75. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/nature.toml +7 -10
  76. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/plos.toml +7 -10
  77. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/prl.toml +7 -12
  78. plotstyle-1.2.0/src/plotstyle/specs/schema.py +1012 -0
  79. plotstyle-1.2.0/src/plotstyle/specs/science.toml +31 -0
  80. plotstyle-1.2.0/src/plotstyle/specs/springer.toml +26 -0
  81. plotstyle-1.2.0/src/plotstyle/specs/units.py +451 -0
  82. plotstyle-1.2.0/src/plotstyle/specs/wiley.toml +27 -0
  83. plotstyle-1.2.0/src/plotstyle/validation/__init__.py +48 -0
  84. plotstyle-1.2.0/src/plotstyle/validation/checks/__init__.py +48 -0
  85. plotstyle-1.2.0/src/plotstyle/validation/checks/_base.py +50 -0
  86. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/validation/checks/colors.py +48 -150
  87. plotstyle-1.2.0/src/plotstyle/validation/checks/dimensions.py +138 -0
  88. plotstyle-1.2.0/src/plotstyle/validation/checks/export.py +145 -0
  89. plotstyle-1.2.0/src/plotstyle/validation/checks/lines.py +105 -0
  90. plotstyle-1.2.0/src/plotstyle/validation/checks/typography.py +145 -0
  91. plotstyle-1.2.0/src/plotstyle/validation/report.py +162 -0
  92. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_color/test_palettes.py +21 -19
  93. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_core/test_export.py +3 -3
  94. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_core/test_migrate.py +4 -44
  95. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_core/test_style.py +3 -3
  96. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_engine/test_fonts.py +6 -1
  97. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_specs/test_registry.py +7 -4
  98. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_specs/test_schema.py +1 -48
  99. plotstyle-1.0.0/PKG-INFO +0 -395
  100. plotstyle-1.0.0/README.md +0 -334
  101. plotstyle-1.0.0/src/plotstyle/__init__.py +0 -120
  102. plotstyle-1.0.0/src/plotstyle/_utils/io.py +0 -113
  103. plotstyle-1.0.0/src/plotstyle/_utils/warnings.py +0 -86
  104. plotstyle-1.0.0/src/plotstyle/cli/main.py +0 -553
  105. plotstyle-1.0.0/src/plotstyle/color/__init__.py +0 -42
  106. plotstyle-1.0.0/src/plotstyle/color/_rendering.py +0 -86
  107. plotstyle-1.0.0/src/plotstyle/color/accessibility.py +0 -288
  108. plotstyle-1.0.0/src/plotstyle/color/grayscale.py +0 -285
  109. plotstyle-1.0.0/src/plotstyle/color/palettes.py +0 -259
  110. plotstyle-1.0.0/src/plotstyle/core/export.py +0 -416
  111. plotstyle-1.0.0/src/plotstyle/core/figure.py +0 -402
  112. plotstyle-1.0.0/src/plotstyle/core/migrate.py +0 -586
  113. plotstyle-1.0.0/src/plotstyle/core/style.py +0 -393
  114. plotstyle-1.0.0/src/plotstyle/engine/fonts.py +0 -309
  115. plotstyle-1.0.0/src/plotstyle/engine/latex.py +0 -287
  116. plotstyle-1.0.0/src/plotstyle/engine/rcparams.py +0 -352
  117. plotstyle-1.0.0/src/plotstyle/integrations/__init__.py +0 -0
  118. plotstyle-1.0.0/src/plotstyle/integrations/seaborn.py +0 -305
  119. plotstyle-1.0.0/src/plotstyle/preview/__init__.py +0 -50
  120. plotstyle-1.0.0/src/plotstyle/preview/gallery.py +0 -337
  121. plotstyle-1.0.0/src/plotstyle/preview/print_size.py +0 -304
  122. plotstyle-1.0.0/src/plotstyle/specs/acs.toml +0 -36
  123. plotstyle-1.0.0/src/plotstyle/specs/cell.toml +0 -35
  124. plotstyle-1.0.0/src/plotstyle/specs/ieee.toml +0 -35
  125. plotstyle-1.0.0/src/plotstyle/specs/schema.py +0 -1098
  126. plotstyle-1.0.0/src/plotstyle/specs/science.toml +0 -35
  127. plotstyle-1.0.0/src/plotstyle/specs/springer.toml +0 -35
  128. plotstyle-1.0.0/src/plotstyle/specs/units.py +0 -761
  129. plotstyle-1.0.0/src/plotstyle/specs/wiley.toml +0 -35
  130. plotstyle-1.0.0/src/plotstyle/validation/__init__.py +0 -96
  131. plotstyle-1.0.0/src/plotstyle/validation/checks/__init__.py +0 -95
  132. plotstyle-1.0.0/src/plotstyle/validation/checks/_base.py +0 -149
  133. plotstyle-1.0.0/src/plotstyle/validation/checks/dimensions.py +0 -166
  134. plotstyle-1.0.0/src/plotstyle/validation/checks/export.py +0 -222
  135. plotstyle-1.0.0/src/plotstyle/validation/checks/lines.py +0 -147
  136. plotstyle-1.0.0/src/plotstyle/validation/checks/typography.py +0 -200
  137. plotstyle-1.0.0/src/plotstyle/validation/report.py +0 -300
  138. {plotstyle-1.0.0 → plotstyle-1.2.0}/LICENSE +0 -0
  139. {plotstyle-1.0.0/src/plotstyle/_utils → plotstyle-1.2.0/src/plotstyle/cli}/__init__.py +0 -0
  140. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/color/data/okabe_ito.json +0 -0
  141. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/color/data/safe_grayscale.json +0 -0
  142. {plotstyle-1.0.0/src/plotstyle/cli → plotstyle-1.2.0/src/plotstyle/core}/__init__.py +0 -0
  143. {plotstyle-1.0.0/src/plotstyle/core → plotstyle-1.2.0/src/plotstyle/engine}/__init__.py +0 -0
  144. {plotstyle-1.0.0/src/plotstyle/engine → plotstyle-1.2.0/src/plotstyle/integrations}/__init__.py +0 -0
  145. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/py.typed +0 -0
  146. {plotstyle-1.0.0 → plotstyle-1.2.0}/src/plotstyle/specs/_templates.toml +0 -0
  147. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/conftest.py +0 -0
  148. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_cli/test_main.py +0 -0
  149. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_color/test_accessibility.py +0 -0
  150. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_color/test_grayscale.py +0 -0
  151. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_color/test_rendering.py +0 -0
  152. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_core/test_figure.py +0 -0
  153. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_engine/test_latex.py +0 -0
  154. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_engine/test_rcparams.py +0 -0
  155. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_integrations/test_seaborn.py +0 -0
  156. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_preview/test_gallery.py +0 -0
  157. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_preview/test_print_size.py +0 -0
  158. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_specs/test_units.py +0 -0
  159. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_utils/test_io.py +0 -0
  160. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_utils/test_warnings.py +0 -0
  161. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_validation/test_checks.py +0 -0
  162. {plotstyle-1.0.0 → plotstyle-1.2.0}/tests/test_validation/test_report.py +0 -0
@@ -157,3 +157,6 @@ celerybeat-schedule
157
157
 
158
158
  # secrets (just in case)
159
159
  secrets.json
160
+
161
+ # local files
162
+ local/
@@ -13,6 +13,61 @@ _Nothing yet._
13
13
 
14
14
  ---
15
15
 
16
+ ## [1.2.0] - 2026-04-23
17
+
18
+ Feature release: **overlays**, **units & conversions**, **Seaborn integration**, improved **font/LaTeX controls**, plus major CLI/docs/example expansion.
19
+
20
+ ### Added
21
+
22
+ - **Style overlays** (`plotstyle.overlays`, `plotstyle.list_overlays()`): additive layers that can be composed with a base journal preset.
23
+ - Categories: `color`, `context`, `rendering`, `plot-type`, `script`.
24
+ - Built-in overlays include `minimal`, `notebook`, `presentation`, `high-vis`, `grid`, `bar`, `scatter`, `no-latex`, `pgf`, `latex-sans`, `okabe-ito`, `safe-grayscale`, and `tol-*` palette overlays, plus CJK/Turkish/Russian script overlays.
25
+ - **New CLI commands for overlays**
26
+ - `plotstyle overlays [--category <category>]` to list overlays.
27
+ - `plotstyle overlay-info <overlay>` to inspect overlay metadata and `rcParams`.
28
+ - **Font checks for overlays**: `plotstyle fonts --overlay <overlay>` (in addition to `--journal`).
29
+ - **Seaborn integration**: helpers to keep PlotStyle `rcParams` consistent when using Seaborn themes (`patch_seaborn()`, `plotstyle_theme()`, `unpatch_seaborn()`).
30
+ - **Units & conversions**: new/expanded utilities and docs for consistent size specification across specs and helpers.
31
+ - **Matplotlib-native styles compatibility**: support for registering/using PlotStyle presets as Matplotlib styles where applicable.
32
+ - **New examples & previews**: additional example scripts including overlays, Seaborn integration, units/conversions, print-size preview, Matplotlib native styles, and LaTeX/fonts.
33
+
34
+ ### Changed
35
+
36
+ - **CLI UX improvements**
37
+ - `plotstyle fonts` now supports `--journal` *or* `--overlay` (mutually exclusive, required).
38
+ - More robust argument parsing (e.g. ignores empty entries in `--formats`).
39
+ - Friendlier output for empty registries (journals/overlays) and clearer reporting for overlay font availability.
40
+ - **Docs & README expansion**: new/expanded guides and API reference for overlays, units, warnings, Seaborn, preview tooling, and updated patterns/examples.
41
+
42
+ ### Fixed
43
+
44
+ - **CLI stability**: avoid noisy/unclear behavior in edge cases (empty registry listings, malformed format lists) and improve error messaging around missing overlay keys.
45
+
46
+ ---
47
+
48
+ ## [1.1.0] - 2026-04-16
49
+
50
+ Minor feature release : ergonomics improvements, hardened error handling, and spec updates.
51
+
52
+ ### Added
53
+
54
+ - **`quiet` parameter on `JournalStyle.export()`** : suppresses compliance summaries and manifest output for scripting workflows.
55
+ - **Pre-computed Type 3 font checks** : compliance summary now accepts a pre-computed result for Type 3 font detection, improving performance when the check has already been run by the caller.
56
+ - **`JournalSpec` key access** : `JournalSpec` now supports key-style access, and the dimension check message has been updated for clarity.
57
+
58
+ ### Fixed
59
+
60
+ - **`SpecNotFoundError` base classes** : now inherits from both `ValueError` and `KeyError` so existing `except ValueError` and `except KeyError` handlers catch it correctly; a custom `__str__` produces clearer diagnostic messages.
61
+
62
+ ### Changed
63
+
64
+ - **IEEE Transactions spec updated** : column widths, max height, font family, panel-label properties, and preferred output formats revised to match current IEEE author guidelines.
65
+ - **CI documentation build** : Sphinx `docs` job (`sphinx-build -W -n`) added to the CI workflow; rendered HTML is uploaded as an artifact on every push.
66
+ - **Module docstrings** : expanded and standardised across `__init__.py`, `_utils/`, `color/`, `core/`, and `validation/` for consistent Sphinx rendering.
67
+ - **Context-manager examples** : all `plotstyle.use()` call sites in docs and examples updated to the `with plotstyle.use(...) as style:` form to ensure correct `rcParams` restoration.
68
+
69
+ ---
70
+
16
71
  ## [1.0.0] - 2026-04-12
17
72
 
18
73
  First stable release — production-ready for scientific publication workflows.
@@ -72,7 +127,9 @@ First public alpha release.
72
127
  - **Dynamic versioning** — version derived from git tags via `hatch-vcs` and `importlib.metadata`.
73
128
  - **CI/CD pipeline** — GitHub Actions workflows for lint, type-check, test matrix, and automated PyPI release via OIDC Trusted Publishing.
74
129
 
75
- [Unreleased]: https://github.com/rahulkaushal04/plotstyle/compare/v1.0.0...HEAD
130
+ [Unreleased]: https://github.com/rahulkaushal04/plotstyle/compare/v1.2.0...HEAD
131
+ [1.2.0]: https://github.com/rahulkaushal04/plotstyle/compare/v1.1.0...v1.2.0
132
+ [1.1.0]: https://github.com/rahulkaushal04/plotstyle/compare/v1.0.0...v1.1.0
76
133
  [1.0.0]: https://github.com/rahulkaushal04/plotstyle/compare/v0.1.0a2...v1.0.0
77
134
  [0.1.0a2]: https://github.com/rahulkaushal04/plotstyle/compare/v0.1.0a1...v0.1.0a2
78
135
  [0.1.0a1]: https://github.com/rahulkaushal04/plotstyle/releases/tag/v0.1.0a1
@@ -0,0 +1,594 @@
1
+ Metadata-Version: 2.4
2
+ Name: plotstyle
3
+ Version: 1.2.0
4
+ Summary: Matplotlib/seaborn style presets matching scientific journal requirements, with validation, export safety, and preview capabilities.
5
+ Project-URL: Homepage, https://github.com/rahulkaushal04/plotstyle
6
+ Project-URL: Documentation, https://plotstyle.readthedocs.io
7
+ Project-URL: Repository, https://github.com/rahulkaushal04/plotstyle
8
+ Project-URL: Issues, https://github.com/rahulkaushal04/plotstyle/issues
9
+ Project-URL: Changelog, https://github.com/rahulkaushal04/plotstyle/blob/main/CHANGELOG.md
10
+ Project-URL: Download, https://pypi.org/project/plotstyle/
11
+ Author: Rahul Kaushal
12
+ License: MIT License
13
+
14
+ Copyright (c) 2026 Rahul Kaushal
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+ License-File: LICENSE
34
+ Keywords: academic,accessibility,colorblind,export,figures,ieee,journal,matplotlib,nature,plotting,publication,rcParams,research,science,scientific,seaborn,style,typesetting,validation,visualization
35
+ Classifier: Development Status :: 5 - Production/Stable
36
+ Classifier: Framework :: Matplotlib
37
+ Classifier: Intended Audience :: Education
38
+ Classifier: Intended Audience :: Science/Research
39
+ Classifier: License :: OSI Approved :: MIT License
40
+ Classifier: Natural Language :: English
41
+ Classifier: Operating System :: OS Independent
42
+ Classifier: Programming Language :: Python :: 3
43
+ Classifier: Programming Language :: Python :: 3.10
44
+ Classifier: Programming Language :: Python :: 3.11
45
+ Classifier: Programming Language :: Python :: 3.12
46
+ Classifier: Programming Language :: Python :: 3.13
47
+ Classifier: Topic :: Multimedia :: Graphics
48
+ Classifier: Topic :: Scientific/Engineering
49
+ Classifier: Topic :: Scientific/Engineering :: Visualization
50
+ Classifier: Typing :: Typed
51
+ Requires-Python: >=3.10
52
+ Requires-Dist: matplotlib<4,>=3.9
53
+ Requires-Dist: tomli>=2.0; python_version < '3.11'
54
+ Provides-Extra: all
55
+ Requires-Dist: fonttools<5,>=4.55; extra == 'all'
56
+ Requires-Dist: pandas<3,>=2.2; extra == 'all'
57
+ Requires-Dist: pillow<13,>=11.0; extra == 'all'
58
+ Requires-Dist: seaborn<1,>=0.13.2; extra == 'all'
59
+ Provides-Extra: color
60
+ Requires-Dist: pillow<13,>=11.0; extra == 'color'
61
+ Provides-Extra: dev
62
+ Requires-Dist: mypy<2,>=1.15; extra == 'dev'
63
+ Requires-Dist: pillow<13,>=11.0; extra == 'dev'
64
+ Requires-Dist: pre-commit<5,>=4.0; extra == 'dev'
65
+ Requires-Dist: pytest-cov<8,>=6.0; extra == 'dev'
66
+ Requires-Dist: pytest-mpl<1,>=0.18; extra == 'dev'
67
+ Requires-Dist: pytest<10,>=8.3; extra == 'dev'
68
+ Requires-Dist: ruff<1,>=0.15; extra == 'dev'
69
+ Provides-Extra: docs
70
+ Requires-Dist: furo>=2025.12.19; extra == 'docs'
71
+ Requires-Dist: myst-parser<6,>=5.0; extra == 'docs'
72
+ Requires-Dist: sphinx-autodoc-typehints<4,>=3.0; extra == 'docs'
73
+ Requires-Dist: sphinx-copybutton<1,>=0.5; extra == 'docs'
74
+ Requires-Dist: sphinx<10,>=9.0; extra == 'docs'
75
+ Provides-Extra: fonttools
76
+ Requires-Dist: fonttools<5,>=4.55; extra == 'fonttools'
77
+ Provides-Extra: seaborn
78
+ Requires-Dist: pandas<3,>=2.2; extra == 'seaborn'
79
+ Requires-Dist: seaborn<1,>=0.13.2; extra == 'seaborn'
80
+ Description-Content-Type: text/markdown
81
+
82
+ <p align="center">
83
+ <strong>plotstyle</strong>
84
+ </p>
85
+
86
+ <p align="center">
87
+ <em>Matplotlib figures formatted for journal submission, automatically.</em>
88
+ </p>
89
+
90
+ <p align="center">
91
+ <a href="https://pypi.org/project/plotstyle/"><img alt="PyPI version" src="https://img.shields.io/pypi/v/plotstyle?color=blue"></a>
92
+ <a href="https://pypi.org/project/plotstyle/"><img alt="Python versions" src="https://img.shields.io/pypi/pyversions/plotstyle"></a>
93
+ <a href="https://github.com/rahulkaushal04/plotstyle/blob/main/LICENSE"><img alt="License: MIT" src="https://img.shields.io/github/license/rahulkaushal04/plotstyle"></a>
94
+ <a href="https://github.com/rahulkaushal04/plotstyle/actions"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/rahulkaushal04/plotstyle/ci.yml?label=CI"></a>
95
+ <a href="https://plotstyle.readthedocs.io/en/stable/"><img alt="Docs" src="https://img.shields.io/readthedocs/plotstyle/stable?label=docs"></a>
96
+ </p>
97
+
98
+ ---
99
+
100
+ **PlotStyle** makes it easy to produce Matplotlib figures that meet the exact typographic, dimensional, and export requirements of major academic journals. It also integrates with Seaborn, with more integrations planned. Pick a journal, create your figure, save it. PlotStyle handles the rest.
101
+
102
+ ---
103
+
104
+ ## Table of Contents
105
+
106
+ - [Installation](#installation)
107
+ - [Quick Start](#quick-start)
108
+ - [Examples](#examples)
109
+ - [Multi-panel figures](#multi-panel-figures)
110
+ - [Color palettes](#color-palettes)
111
+ - [Overlays](#overlays)
112
+ - [Colorblind and grayscale previews](#colorblind-and-grayscale-previews)
113
+ - [Validation and submission export](#validation-and-submission-export)
114
+ - [Supported Journals](#supported-journals)
115
+ - [CLI](#cli)
116
+ - [Documentation](#documentation)
117
+ - [Contributing](#contributing)
118
+ - [Citation](#citation)
119
+ - [License](#license)
120
+
121
+ ---
122
+
123
+ ## Installation
124
+
125
+ Requires **Python 3.10+** and **Matplotlib >= 3.9**.
126
+
127
+ ```bash
128
+ pip install plotstyle
129
+ ```
130
+
131
+ Optional extras:
132
+
133
+ ```bash
134
+ pip install "plotstyle[color]" # colorblind / grayscale previews
135
+ pip install "plotstyle[seaborn]" # seaborn integration
136
+ pip install "plotstyle[all]" # everything
137
+ ```
138
+
139
+ ---
140
+
141
+ ## Quick Start
142
+
143
+ ```python
144
+ import numpy as np
145
+ import plotstyle
146
+
147
+ with plotstyle.use("nature") as style:
148
+ fig, ax = style.figure(columns=1) # sized to Nature's single-column width (89 mm)
149
+
150
+ x = np.linspace(0, 2 * np.pi, 200)
151
+ ax.plot(x, np.sin(x), label="sin(x)")
152
+ ax.plot(x, np.cos(x), label="cos(x)")
153
+ ax.set_xlabel("Phase (rad)")
154
+ ax.set_ylabel("Amplitude (a.u.)")
155
+ ax.legend()
156
+
157
+ style.savefig(fig, "figure.pdf") # 300 DPI minimum, TrueType fonts embedded
158
+ ```
159
+
160
+ <p align="center">
161
+ <img src="https://raw.githubusercontent.com/rahulkaushal04/plotstyle/main/examples/output/quickstart_nature.png" width="55%" alt="Quickstart output: sin and cos figure styled for Nature">
162
+ </p>
163
+
164
+ The `with` block is the recommended pattern. Matplotlib's `rcParams` are restored automatically when it exits, even if an exception occurs.
165
+
166
+ ---
167
+
168
+ ## Examples
169
+
170
+ ### Multi-panel figures
171
+
172
+ `style.subplots()` works like `plt.subplots()` but sizes the figure to the journal spec and adds panel labels automatically. All built-in journal specs use bold lowercase labels (**a**, **b**, **c**, …). The label style is driven by each spec's `panel_label_case` field and can be `lower`, `upper`, `parens_lower`, `parens_upper`, `sentence`, or `title`.
173
+
174
+ ```python
175
+ import numpy as np
176
+ import plotstyle
177
+
178
+ rng = np.random.default_rng(42)
179
+
180
+ with plotstyle.use("science") as style:
181
+ fig, axes = style.subplots(nrows=2, ncols=2, columns=2)
182
+
183
+ x = np.linspace(0, 10, 100)
184
+ axes[0, 0].plot(x, np.sin(x), label="sin")
185
+ axes[0, 0].plot(x, np.cos(x), label="cos")
186
+ axes[0, 0].set_xlabel("x")
187
+ axes[0, 0].set_ylabel("f(x)")
188
+ axes[0, 0].legend()
189
+
190
+ xs = rng.normal(0, 1, 60)
191
+ ys = 0.7 * xs + rng.normal(0, 0.3, 60)
192
+ axes[0, 1].scatter(xs, ys, s=12, alpha=0.7)
193
+ axes[0, 1].set_xlabel("Variable X")
194
+ axes[0, 1].set_ylabel("Variable Y")
195
+
196
+ axes[1, 0].bar(["A", "B", "C", "D"], [3.2, 5.8, 4.1, 6.5])
197
+ axes[1, 0].set_xlabel("Category")
198
+ axes[1, 0].set_ylabel("Count")
199
+
200
+ axes[1, 1].hist(rng.normal(0, 1, 500), bins=25, edgecolor="white", linewidth=0.5)
201
+ axes[1, 1].set_xlabel("Value")
202
+ axes[1, 1].set_ylabel("Frequency")
203
+
204
+ style.savefig(fig, "multi_panel.pdf")
205
+ ```
206
+
207
+ <p align="center">
208
+ <img src="https://raw.githubusercontent.com/rahulkaushal04/plotstyle/main/examples/output/multi_panel_science.png" width="70%" alt="2x2 multi-panel Science figure with automatic panel labels a b c d">
209
+ </p>
210
+
211
+ > `axes` is always a 2-D NumPy array. Use `axes[0, 0]` to access a single panel or `axes.flat` to iterate. Pass `panels=False` to suppress the automatic labels.
212
+
213
+ ---
214
+
215
+ ### Color palettes
216
+
217
+ Each journal has a recommended colorblind-safe palette. `plotstyle.palette()` returns hex color strings, cycling if you need more than the palette length.
218
+
219
+ ```python
220
+ import matplotlib.pyplot as plt
221
+ import plotstyle
222
+
223
+ journals = ["nature", "science", "ieee", "acs"]
224
+ fig, axes = plt.subplots(len(journals), 1, figsize=(6, 0.6 * len(journals)))
225
+
226
+ for ax, journal in zip(axes, journals, strict=False):
227
+ pal = plotstyle.palette(journal, n=8)
228
+ for i, color in enumerate(pal):
229
+ ax.barh(0, 1, left=i, color=color, edgecolor="none", height=0.8)
230
+ ax.set_xlim(0, 8)
231
+ ax.set_yticks([])
232
+ ax.set_ylabel(journal, rotation=0, ha="right", va="center")
233
+ ax.set_xticks([])
234
+
235
+ fig.suptitle("Journal Color Palettes")
236
+ fig.tight_layout()
237
+ fig.savefig("palette_comparison.png", dpi=150)
238
+ ```
239
+
240
+ <p align="center">
241
+ <img src="https://raw.githubusercontent.com/rahulkaushal04/plotstyle/main/examples/output/palette_comparison.png" width="70%" alt="Color swatch comparison for Nature, Science, IEEE, and ACS palettes">
242
+ </p>
243
+
244
+ Pass `with_markers=True` to get `(color, linestyle, marker)` tuples, useful for journals like IEEE that print in grayscale:
245
+
246
+ ```python
247
+ styled = plotstyle.palette("ieee", n=4, with_markers=True)
248
+ for color, ls, marker in styled:
249
+ ax.plot(x, y, color=color, linestyle=ls, marker=marker)
250
+ ```
251
+
252
+ ```text
253
+ # styled — one (color, linestyle, marker) tuple per series:
254
+ [('#000000', '-', 'o'), ('#333333', '--', 's'), ('#666666', '-.', '^'), ('#999999', ':', 'D')]
255
+ ```
256
+
257
+ ---
258
+
259
+ ### Overlays
260
+
261
+ Overlays are additive patches that layer on top of a journal preset. They let you adjust one aspect of a figure — the colour palette, the context, the chart type — without changing the base journal settings.
262
+
263
+ Pass overlay names in the same list as the journal key:
264
+
265
+ ```python
266
+ import plotstyle
267
+
268
+ # Strip top/right spines for a clean editorial look
269
+ with plotstyle.use(["nature", "minimal"]) as style:
270
+ fig, ax = style.figure(columns=1)
271
+ ax.plot([1, 2, 3])
272
+ style.savefig(fig, "figure.pdf")
273
+
274
+ # Larger figure and fonts for Jupyter notebooks
275
+ with plotstyle.use(["nature", "notebook"]) as style:
276
+ import matplotlib.pyplot as plt
277
+ fig, ax = plt.subplots() # plt.subplots() picks up the notebook figsize
278
+ ax.plot([1, 2, 3])
279
+
280
+ # Swap the colour cycle to a specific palette
281
+ with plotstyle.use(["ieee", "okabe-ito"]) as style:
282
+ fig, ax = style.figure(columns=1)
283
+ ax.plot([1, 2, 3])
284
+ ```
285
+
286
+ | Category | Purpose | Examples |
287
+ |----------|---------|---------|
288
+ | `color` | Swap the colour cycle | `okabe-ito`, `tol-bright`, `safe-grayscale` |
289
+ | `context` | Adjust scale for the medium | `notebook`, `presentation`, `minimal`, `high-vis` |
290
+ | `rendering` | Control LaTeX and grid rendering | `no-latex`, `grid`, `latex-sans`, `pgf` |
291
+ | `plot-type` | Optimise for a chart type | `bar`, `scatter` |
292
+ | `script` | Non-Latin font support | `cjk-simplified`, `russian`, `turkish` |
293
+
294
+ ```python
295
+ # List all available overlays
296
+ plotstyle.list_overlays()
297
+ plotstyle.list_overlays(category="context")
298
+ ```
299
+
300
+ ```text
301
+ # plotstyle.list_overlays()
302
+ ['bar', 'cjk-japanese', 'cjk-korean', 'cjk-simplified', 'cjk-traditional', 'grid',
303
+ 'high-vis', 'latex-sans', 'minimal', 'no-latex', 'notebook', 'okabe-ito', 'pgf',
304
+ 'presentation', 'russian', 'safe-grayscale', 'scatter', 'tol-bright',
305
+ 'tol-high-contrast', 'tol-light', 'tol-muted', 'tol-rainbow-10', 'tol-rainbow-12',
306
+ 'tol-rainbow-4', 'tol-rainbow-6', 'tol-rainbow-8', 'tol-vibrant', 'turkish']
307
+
308
+ # plotstyle.list_overlays(category="context")
309
+ ['high-vis', 'minimal', 'notebook', 'presentation']
310
+ ```
311
+
312
+ ---
313
+
314
+ ### Colorblind and grayscale previews
315
+
316
+ Build a figure, then simulate how it looks under color vision deficiency or grayscale printing before you submit.
317
+
318
+ ```python
319
+ import numpy as np
320
+ import plotstyle
321
+
322
+ with plotstyle.use("nature") as style:
323
+ colors = style.palette(n=4)
324
+ fig, ax = style.figure(columns=1)
325
+ x = np.linspace(0, 5, 80)
326
+ for i, c in enumerate(colors):
327
+ ax.plot(x, np.sin(x + i), color=c, linewidth=1.5, label=f"Series {i + 1}")
328
+ ax.set_xlabel("Time (s)")
329
+ ax.set_ylabel("Signal")
330
+ ax.legend()
331
+
332
+ # Simulate colour vision deficiency (deuteranopia, protanopia, tritanopia)
333
+ cvd_fig = plotstyle.preview_colorblind(fig)
334
+ cvd_fig.savefig("accessibility_colorblind.png", dpi=150, bbox_inches="tight")
335
+
336
+ # Simulate grayscale print
337
+ gray_fig = plotstyle.preview_grayscale(fig)
338
+ gray_fig.savefig("accessibility_grayscale.png", dpi=150, bbox_inches="tight")
339
+ ```
340
+
341
+ <p align="center">
342
+ <img src="https://raw.githubusercontent.com/rahulkaushal04/plotstyle/main/examples/output/accessibility_colorblind.png" width="90%" alt="Colorblind simulation: original, deuteranopia, protanopia, tritanopia">
343
+ </p>
344
+
345
+ <p align="center">
346
+ <img src="https://raw.githubusercontent.com/rahulkaushal04/plotstyle/main/examples/output/accessibility_grayscale.png" width="60%" alt="Grayscale simulation: original vs grayscale rendering">
347
+ </p>
348
+
349
+ ---
350
+
351
+ ### Validation and submission export
352
+
353
+ Validate a figure against the journal's requirements, then export in all required formats at once.
354
+
355
+ ```python
356
+ report = plotstyle.validate(fig, journal="nature")
357
+ print(report) # formatted compliance table
358
+ print(report.passed) # True if everything is OK
359
+
360
+ for failure in report.failures:
361
+ print(failure.message) # what failed
362
+ print(failure.fix_suggestion) # how to fix it
363
+ ```
364
+
365
+ ```text
366
+ ┌──────────────────────────────────────────────────────┐
367
+ │ PlotStyle Validation Report — Nature │
368
+ ├──────────┬───────────────────────────────────────────┤
369
+ │ ✓ PASS │ Figure width 89.0mm matches single colu...│
370
+ │ ✓ PASS │ Figure height 55.0mm is within the Natu...│
371
+ │ ✗ FAIL │ pdf.fonttype = 3; must be 42 for TrueTy...│
372
+ │ ✗ FAIL │ ps.fonttype = 3; must be 42 for TrueTyp...│
373
+ │ ⚠ WARN │ savefig.dpi = 'figure'; Nature requires...│
374
+ │ ✓ PASS │ All plotted lines and spines meet the N...│
375
+ │ ✗ FAIL │ 14 text element(s) outside the Nature r...│
376
+ └──────────┴───────────────────────────────────────────┘
377
+ 3/7 checks passed, 1 warning(s), 3 failure(s)
378
+
379
+ passed: False
380
+
381
+ failure.message: pdf.fonttype = 3; must be 42 for TrueType font embedding.
382
+ failure.fix_suggestion: Call plotstyle.use() to apply all required rcParams, or set
383
+ mpl.rcParams['pdf.fonttype'] = 42 manually.
384
+ ```
385
+
386
+ When called inside `plotstyle.use()`, all checks pass:
387
+
388
+ ```text
389
+ ┌──────────────────────────────────────────────────────┐
390
+ │ PlotStyle Validation Report — Nature │
391
+ ├──────────┬───────────────────────────────────────────┤
392
+ │ ✓ PASS │ Figure width 89.0mm matches single colu...│
393
+ │ ✓ PASS │ Figure height 55.0mm is within the Natu...│
394
+ │ ✓ PASS │ pdf.fonttype = 42 (TrueType fonts will ...│
395
+ │ ✓ PASS │ ps.fonttype = 42 (TrueType fonts will b...│
396
+ │ ✓ PASS │ savefig.dpi = 300.0 meets the Nature mi...│
397
+ │ ✓ PASS │ All plotted lines and spines meet the N...│
398
+ │ ✓ PASS │ All text elements are within the Nature...│
399
+ └──────────┴───────────────────────────────────────────┘
400
+ 7/7 checks passed, 0 warning(s), 0 failure(s)
401
+
402
+ passed: True
403
+ ```
404
+
405
+ ```python
406
+ paths = plotstyle.export_submission(
407
+ fig,
408
+ "figure1",
409
+ journal="ieee",
410
+ author_surname="Smith", # IEEE prepends the surname prefix to filenames
411
+ output_dir="submission/",
412
+ )
413
+ print(paths)
414
+ ```
415
+
416
+ ```text
417
+ [PosixPath('submission/smith_figure1.tiff'),
418
+ PosixPath('submission/smith_figure1.eps'),
419
+ PosixPath('submission/smith_figure1.pdf'),
420
+ PosixPath('submission/smith_figure1.png')]
421
+ ```
422
+
423
+ ---
424
+
425
+ ## Supported Journals
426
+
427
+ | Key | Journal | Publisher |
428
+ |-----|---------|-----------|
429
+ | `acs` | ACS (JACS) | American Chemical Society |
430
+ | `cell` | Cell | Cell Press |
431
+ | `elsevier` | Elsevier | Elsevier |
432
+ | `ieee` | IEEE Transactions | IEEE |
433
+ | `nature` | Nature | Springer Nature |
434
+ | `plos` | PLOS ONE | Public Library of Science |
435
+ | `prl` | Physical Review Letters | American Physical Society |
436
+ | `science` | Science | AAAS |
437
+ | `springer` | Springer | Springer |
438
+ | `wiley` | Wiley | Wiley |
439
+
440
+ > Need another journal? See [CONTRIBUTING.md](CONTRIBUTING.md).
441
+
442
+ ---
443
+
444
+ ## CLI
445
+
446
+ ```
447
+ plotstyle list # list all journal presets
448
+ plotstyle info <journal> # show spec details
449
+ plotstyle diff <journal_a> <journal_b> # compare two journals
450
+ plotstyle fonts --journal <journal> # check font availability
451
+ plotstyle overlays [--category <category>] # list available overlays
452
+ plotstyle overlay-info <overlay> # show overlay details
453
+ plotstyle validate <file> --journal <journal> # validate a saved figure
454
+ plotstyle export <file> --journal <journal> # print snippet for re-exporting
455
+ ```
456
+
457
+ **`plotstyle list`**
458
+ ```text
459
+ acs American Chemical Society
460
+ cell Cell Press
461
+ elsevier Elsevier
462
+ ieee IEEE
463
+ nature Springer Nature
464
+ plos Public Library of Science
465
+ prl American Physical Society
466
+ science AAAS
467
+ springer Springer Nature
468
+ wiley Wiley
469
+ ```
470
+
471
+ **`plotstyle info nature`**
472
+ ```text
473
+ Journal: Nature
474
+ Publisher: Springer Nature
475
+ Source: https://www.nature.com/documents/nature-final-artwork.pdf
476
+ Last Verified: 2026-04-22
477
+ ──────────────────────────
478
+ Dimensions:
479
+ Single column: 89.0mm (3.50in)
480
+ Double column: 183.0mm (7.20in)
481
+ Max height: 247.0mm
482
+ Typography:
483
+ Font: Helvetica, Arial (fallback: sans-serif)
484
+ Size range: 5.0-7.0pt
485
+ Panel labels: 5.0pt bold lower (a, b, c)
486
+ Export:
487
+ Formats: ai, eps, pdf
488
+ Min DPI: 300
489
+ Color: rgb
490
+ Accessibility:
491
+ Colorblind safe: Not required
492
+ Grayscale safe: Not required
493
+ ```
494
+
495
+ **`plotstyle diff nature science`**
496
+ ```text
497
+ Nature → Science
498
+ ──────────────────────────────────────────────────
499
+ Column Width (single): 89.0mm → 86.4mm
500
+ Column Width (double): 183.0mm → 177.8mm
501
+ Max Height: 247.0mm → —
502
+ Font Family: Helvetica, Arial → Minion Pro, Benton Sans Condensed
503
+ Min Font Size: 5.0pt → 7.5pt
504
+ Max Font Size: 7.0pt → 10.0pt
505
+ Panel Label Size: 5.0pt → 7.5pt
506
+ Preferred Formats: ai, eps, pdf → ai, eps, pdf, tiff
507
+ Colorblind Required: No → Yes
508
+ ```
509
+
510
+ **`plotstyle fonts --journal nature`**
511
+ ```text
512
+ Font check for: Nature
513
+ Required: Helvetica, Arial
514
+ Available: Helvetica, Arial
515
+ Selected: Helvetica
516
+ Exact match: Yes
517
+ ```
518
+
519
+ **`plotstyle overlays`**
520
+ ```text
521
+ bar [plot-type] Optimised rcParams for bar charts.
522
+ cjk-simplified [script] Font configuration for Simplified Chinese labels.
523
+ grid [rendering] Enable major grid lines with a subtle dashed style.
524
+ high-vis [context] Maximum contrast, bold lines, and oversized ticks.
525
+ latex-sans [rendering] Enable LaTeX rendering with a sans-serif font family.
526
+ minimal [context] Stripped-down axes with no top/right spines.
527
+ no-latex [rendering] Disable LaTeX text rendering; use Matplotlib MathText.
528
+ notebook [context] Enlarged figures and larger fonts for Jupyter.
529
+ okabe-ito [color] Colorblind-safe 8-color qualitative palette.
530
+ pgf [rendering] Use the PGF LaTeX backend for vector output.
531
+ presentation [context] Large text and thick lines for slide decks.
532
+ safe-grayscale [color] 6-step grayscale palette for black-and-white print.
533
+ scatter [plot-type] Optimised rcParams for scatter plots.
534
+ tol-bright [color] Paul Tol's bright 7-color qualitative palette.
535
+ ...
536
+ ```
537
+
538
+ **`plotstyle overlay-info minimal`**
539
+ ```text
540
+ Overlay: Minimal
541
+ Key: minimal
542
+ Category: context
543
+ Description: Stripped-down axes with no top/right spines for editorial and blog use.
544
+ ──────────────────────────
545
+ rcParams:
546
+ axes.spines.top = False
547
+ axes.spines.right = False
548
+ xtick.top = False
549
+ ytick.right = False
550
+ axes.grid = False
551
+ axes.linewidth = 0.8
552
+ ```
553
+
554
+ ---
555
+
556
+ ## Documentation
557
+
558
+ Full documentation at **[plotstyle.readthedocs.io](https://plotstyle.readthedocs.io)**:
559
+
560
+ - [Installation guide](https://plotstyle.readthedocs.io/en/stable/installation.html)
561
+ - [Quick start tutorial](https://plotstyle.readthedocs.io/en/stable/quickstart.html)
562
+ - [API reference](https://plotstyle.readthedocs.io/en/stable/api/index.html)
563
+ - [CLI reference](https://plotstyle.readthedocs.io/en/stable/cli.html)
564
+ - [FAQ](https://plotstyle.readthedocs.io/en/stable/faq.html)
565
+
566
+ Working examples are in the [`examples/`](examples/) directory.
567
+
568
+ ---
569
+
570
+ ## Contributing
571
+
572
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, adding journal specs, and pull request guidelines.
573
+
574
+ ---
575
+
576
+ ## Citation
577
+
578
+ If PlotStyle helps your research, a citation or star is appreciated:
579
+
580
+ ```bibtex
581
+ @misc{plotstyle,
582
+ author = {Kaushal, Rahul},
583
+ title = {PlotStyle: Publication-ready scientific figure presets for Matplotlib},
584
+ year = {2026},
585
+ url = {https://github.com/rahulkaushal04/plotstyle},
586
+ note = {Version 1.2.0},
587
+ }
588
+ ```
589
+
590
+ ---
591
+
592
+ ## License
593
+
594
+ [MIT](LICENSE) © 2026 Rahul Kaushal