starplot 0.21.0__tar.gz → 0.21.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. {starplot-0.21.0 → starplot-0.21.1}/CITATION.cff +1 -1
  2. {starplot-0.21.0 → starplot-0.21.1}/Makefile +1 -1
  3. {starplot-0.21.0 → starplot-0.21.1}/PKG-INFO +1 -6
  4. {starplot-0.21.0 → starplot-0.21.1}/README.md +0 -5
  5. {starplot-0.21.0 → starplot-0.21.1}/docs/changelog.md +1 -0
  6. {starplot-0.21.0 → starplot-0.21.1}/examples/map_milky_way_stars.py +1 -1
  7. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/__init__.py +1 -1
  8. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/canvas.py +67 -9
  9. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_canvas.py +41 -0
  10. starplot-0.21.0/examples/galaxy_custom_marker.py +0 -177
  11. starplot-0.21.0/examples/horizon_sgr.py +0 -39
  12. {starplot-0.21.0 → starplot-0.21.1}/.dockerignore +0 -0
  13. {starplot-0.21.0 → starplot-0.21.1}/.github/FUNDING.yml +0 -0
  14. {starplot-0.21.0 → starplot-0.21.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {starplot-0.21.0 → starplot-0.21.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/archives.yaml +0 -0
  17. {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/docs.yml +0 -0
  18. {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/release.yml +0 -0
  19. {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/test.yml +0 -0
  20. {starplot-0.21.0 → starplot-0.21.1}/.gitignore +0 -0
  21. {starplot-0.21.0 → starplot-0.21.1}/CLAUDE.md +0 -0
  22. {starplot-0.21.0 → starplot-0.21.1}/CODE_OF_CONDUCT.md +0 -0
  23. {starplot-0.21.0 → starplot-0.21.1}/CONTRIBUTING.md +0 -0
  24. {starplot-0.21.0 → starplot-0.21.1}/Dockerfile +0 -0
  25. {starplot-0.21.0 → starplot-0.21.1}/LICENSE +0 -0
  26. {starplot-0.21.0 → starplot-0.21.1}/data/raw/constellation_borders.json +0 -0
  27. {starplot-0.21.0 → starplot-0.21.1}/data/raw/constellations.json +0 -0
  28. {starplot-0.21.0 → starplot-0.21.1}/data/raw/milkyway.json +0 -0
  29. {starplot-0.21.0 → starplot-0.21.1}/data/raw/star_designations.csv +0 -0
  30. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/constellation_names.csv +0 -0
  31. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/dso_names.csv +0 -0
  32. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/constellation_names.csv +0 -0
  33. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/dso_names.csv +0 -0
  34. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/other_terms.csv +0 -0
  35. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/star_names.csv +0 -0
  36. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/constellation_names.csv +0 -0
  37. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/dso_names.csv +0 -0
  38. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/other_terms.csv +0 -0
  39. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/star_names.csv +0 -0
  40. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/constellation_names.csv +0 -0
  41. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/dso_names.csv +0 -0
  42. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/other_terms.csv +0 -0
  43. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/star_names.csv +0 -0
  44. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/constellation_names.csv +0 -0
  45. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/dso_names.csv +0 -0
  46. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/other_terms.csv +0 -0
  47. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/star_names.csv +0 -0
  48. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/constellation_names.csv +0 -0
  49. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/dso_names.csv +0 -0
  50. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/other_terms.csv +0 -0
  51. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/readme.md +0 -0
  52. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/star_names.csv +0 -0
  53. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/constellation_names.csv +0 -0
  54. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/dso_names.csv +0 -0
  55. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/other_terms.csv +0 -0
  56. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/readme.md +0 -0
  57. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/star_names.csv +0 -0
  58. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/constellation_names.csv +0 -0
  59. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/dso_names.csv +0 -0
  60. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/other_terms.csv +0 -0
  61. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/readme.md +0 -0
  62. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/star_names.csv +0 -0
  63. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/other_terms.csv +0 -0
  64. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/readme.md +0 -0
  65. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/star_names.csv +0 -0
  66. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/constellation_names.csv +0 -0
  67. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/dso_names.csv +0 -0
  68. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/other_terms.csv +0 -0
  69. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/star_names.csv +0 -0
  70. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/constellation_names.csv +0 -0
  71. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/dso_names.csv +0 -0
  72. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/other_terms.csv +0 -0
  73. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/readme.md +0 -0
  74. {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/star_names.csv +0 -0
  75. {starplot-0.21.0 → starplot-0.21.1}/data/readme.md +0 -0
  76. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/constellation_names.py +0 -0
  77. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/data_settings.py +0 -0
  78. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/db.py +0 -0
  79. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/dso_names.py +0 -0
  80. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/star_designations.py +0 -0
  81. {starplot-0.21.0 → starplot-0.21.1}/data/scripts/translations.py +0 -0
  82. {starplot-0.21.0 → starplot-0.21.1}/docs/about.md +0 -0
  83. {starplot-0.21.0 → starplot-0.21.1}/docs/coming-soon.md +0 -0
  84. {starplot-0.21.0 → starplot-0.21.1}/docs/css/extra.css +0 -0
  85. {starplot-0.21.0 → starplot-0.21.1}/docs/custom/main.html +0 -0
  86. {starplot-0.21.0 → starplot-0.21.1}/docs/data/building.md +0 -0
  87. {starplot-0.21.0 → starplot-0.21.1}/docs/data/constellations.md +0 -0
  88. {starplot-0.21.0 → starplot-0.21.1}/docs/data/dsos.md +0 -0
  89. {starplot-0.21.0 → starplot-0.21.1}/docs/data/index.md +0 -0
  90. {starplot-0.21.0 → starplot-0.21.1}/docs/data/stars.md +0 -0
  91. {starplot-0.21.0 → starplot-0.21.1}/docs/data-sources.md +0 -0
  92. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-double-cluster.md +0 -0
  93. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-gradient.md +0 -0
  94. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-sgr.md +0 -0
  95. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-big-dipper.md +0 -0
  96. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-big.md +0 -0
  97. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-canis-major.md +0 -0
  98. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-carina-nebula.md +0 -0
  99. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-cassiopeia.md +0 -0
  100. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-custom-marker.md +0 -0
  101. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-galaxy.md +0 -0
  102. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-milky-way-stars.md +0 -0
  103. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-orion.md +0 -0
  104. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-orthographic.md +0 -0
  105. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-sagittarius.md +0 -0
  106. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-virgo-cluster.md +0 -0
  107. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-iss-transit.md +0 -0
  108. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-m45.md +0 -0
  109. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-orion.md +0 -0
  110. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-solar-eclipse.md +0 -0
  111. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-basic.md +0 -0
  112. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-detail.md +0 -0
  113. {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-french.md +0 -0
  114. {starplot-0.21.0 → starplot-0.21.1}/docs/examples.md +0 -0
  115. {starplot-0.21.0 → starplot-0.21.1}/docs/images/celestial-globe.svg +0 -0
  116. {starplot-0.21.0 → starplot-0.21.1}/docs/images/cover-front-sm-360.png +0 -0
  117. {starplot-0.21.0 → starplot-0.21.1}/docs/images/discord.svg +0 -0
  118. {starplot-0.21.0 → starplot-0.21.1}/docs/images/examples/.keep +0 -0
  119. {starplot-0.21.0 → starplot-0.21.1}/docs/images/favicon.png +0 -0
  120. {starplot-0.21.0 → starplot-0.21.1}/docs/images/figure_layout.svg +0 -0
  121. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-2400px.png +0 -0
  122. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.png +0 -0
  123. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.svg +0 -0
  124. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.vectornator +0 -0
  125. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.png +0 -0
  126. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.svg +0 -0
  127. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.vectornator +0 -0
  128. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo2.png +0 -0
  129. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo.svg +0 -0
  130. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo2.vectornator +0 -0
  131. {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo500.png +0 -0
  132. {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono-2400px.png +0 -0
  133. {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono.png +0 -0
  134. {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono.svg +0 -0
  135. {starplot-0.21.0 → starplot-0.21.1}/docs/images/star.svg +0 -0
  136. {starplot-0.21.0 → starplot-0.21.1}/docs/images/starplot-header.svg +0 -0
  137. {starplot-0.21.0 → starplot-0.21.1}/docs/images/tutorial/.keep +0 -0
  138. {starplot-0.21.0 → starplot-0.21.1}/docs/index.md +0 -0
  139. {starplot-0.21.0 → starplot-0.21.1}/docs/installation.md +0 -0
  140. {starplot-0.21.0 → starplot-0.21.1}/docs/license.md +0 -0
  141. {starplot-0.21.0 → starplot-0.21.1}/docs/migration-guides/0.16.0.md +0 -0
  142. {starplot-0.21.0 → starplot-0.21.1}/docs/migration-guides/0.21.0.md +0 -0
  143. {starplot-0.21.0 → starplot-0.21.1}/docs/models/comet.md +0 -0
  144. {starplot-0.21.0 → starplot-0.21.1}/docs/models/constellation.md +0 -0
  145. {starplot-0.21.0 → starplot-0.21.1}/docs/models/dso.md +0 -0
  146. {starplot-0.21.0 → starplot-0.21.1}/docs/models/index.md +0 -0
  147. {starplot-0.21.0 → starplot-0.21.1}/docs/models/moon.md +0 -0
  148. {starplot-0.21.0 → starplot-0.21.1}/docs/models/object-list.md +0 -0
  149. {starplot-0.21.0 → starplot-0.21.1}/docs/models/observer.md +0 -0
  150. {starplot-0.21.0 → starplot-0.21.1}/docs/models/optics.md +0 -0
  151. {starplot-0.21.0 → starplot-0.21.1}/docs/models/planet.md +0 -0
  152. {starplot-0.21.0 → starplot-0.21.1}/docs/models/satellite.md +0 -0
  153. {starplot-0.21.0 → starplot-0.21.1}/docs/models/star.md +0 -0
  154. {starplot-0.21.0 → starplot-0.21.1}/docs/models/sun.md +0 -0
  155. {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/constellations.md +0 -0
  156. {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/dsos.md +0 -0
  157. {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/stars.md +0 -0
  158. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-callables.md +0 -0
  159. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-collisions.md +0 -0
  160. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-galaxyplot.md +0 -0
  161. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-horizonplot.md +0 -0
  162. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-localization.md +0 -0
  163. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-mapplot.md +0 -0
  164. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-ongc.md +0 -0
  165. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-opticplot.md +0 -0
  166. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-positions.md +0 -0
  167. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-projections.md +0 -0
  168. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-selecting-objects.md +0 -0
  169. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-settings.md +0 -0
  170. {starplot-0.21.0 → starplot-0.21.1}/docs/reference-zenithplot.md +0 -0
  171. {starplot-0.21.0 → starplot-0.21.1}/docs/robots.txt +0 -0
  172. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/data.py +0 -0
  173. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/gradients.py +0 -0
  174. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/markers.py +0 -0
  175. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projection_list.html +0 -0
  176. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projection_list.py +0 -0
  177. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projections.py +0 -0
  178. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/style_explorer.html +0 -0
  179. {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/style_explorer.py +0 -0
  180. {starplot-0.21.0 → starplot-0.21.1}/docs/showcase.md +0 -0
  181. {starplot-0.21.0 → starplot-0.21.1}/docs/snippets/_newsletter.html +0 -0
  182. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/color.md +0 -0
  183. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/explorer.md +0 -0
  184. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/extensions.md +0 -0
  185. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/gradients.md +0 -0
  186. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/index.md +0 -0
  187. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/layout.md +0 -0
  188. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/markers.md +0 -0
  189. {starplot-0.21.0 → starplot-0.21.1}/docs/styling/reference.md +0 -0
  190. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/01.md +0 -0
  191. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/02.md +0 -0
  192. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/03.md +0 -0
  193. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/04.md +0 -0
  194. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/05.md +0 -0
  195. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/06.md +0 -0
  196. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/07.md +0 -0
  197. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/08.md +0 -0
  198. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/09.md +0 -0
  199. {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/index.md +0 -0
  200. {starplot-0.21.0 → starplot-0.21.1}/examples/constellation.py +0 -0
  201. {starplot-0.21.0 → starplot-0.21.1}/examples/examples.py +0 -0
  202. {starplot-0.21.0 → starplot-0.21.1}/examples/galaxy.py +0 -0
  203. {starplot-0.21.0 → starplot-0.21.1}/examples/gradient.py +0 -0
  204. {starplot-0.21.0 → starplot-0.21.1}/examples/horizon_double_cluster.py +0 -0
  205. {starplot-0.21.0 → starplot-0.21.1}/examples/horizon_gradient.py +0 -0
  206. {starplot-0.21.0 → starplot-0.21.1}/examples/map_big.py +0 -0
  207. {starplot-0.21.0 → starplot-0.21.1}/examples/map_big_dipper.py +0 -0
  208. {starplot-0.21.0 → starplot-0.21.1}/examples/map_canis_major.py +0 -0
  209. {starplot-0.21.0 → starplot-0.21.1}/examples/map_carina.py +0 -0
  210. {starplot-0.21.0 → starplot-0.21.1}/examples/map_cas.py +0 -0
  211. {starplot-0.21.0 → starplot-0.21.1}/examples/map_equidistant.py +0 -0
  212. {starplot-0.21.0 → starplot-0.21.1}/examples/map_galaxy.py +0 -0
  213. {starplot-0.21.0 → starplot-0.21.1}/examples/map_orion.py +0 -0
  214. {starplot-0.21.0 → starplot-0.21.1}/examples/map_orthographic.py +0 -0
  215. {starplot-0.21.0 → starplot-0.21.1}/examples/map_sagittarius.py +0 -0
  216. {starplot-0.21.0 → starplot-0.21.1}/examples/map_virgo_cluster.py +0 -0
  217. {starplot-0.21.0 → starplot-0.21.1}/examples/optic_iss_transit.py +0 -0
  218. {starplot-0.21.0 → starplot-0.21.1}/examples/optic_m45.py +0 -0
  219. {starplot-0.21.0 → starplot-0.21.1}/examples/optic_orion_nebula.py +0 -0
  220. {starplot-0.21.0 → starplot-0.21.1}/examples/optic_solar_eclipse.py +0 -0
  221. {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_basic.py +0 -0
  222. {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_detail.py +0 -0
  223. {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_french.py +0 -0
  224. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/__init__.py +0 -0
  225. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/data/.keep +0 -0
  226. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/flaky.py +0 -0
  227. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/galaxy_checks.py +0 -0
  228. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/hashio.py +0 -0
  229. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/hashlock.yml +0 -0
  230. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/horizon_checks.py +0 -0
  231. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/map_checks.py +0 -0
  232. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/optic_checks.py +0 -0
  233. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/template.html +0 -0
  234. {starplot-0.21.0 → starplot-0.21.1}/hash_checks/zenith_checks.py +0 -0
  235. {starplot-0.21.0 → starplot-0.21.1}/pyproject.toml +0 -0
  236. {starplot-0.21.0 → starplot-0.21.1}/scripts/download_test_fonts.py +0 -0
  237. {starplot-0.21.0 → starplot-0.21.1}/scripts/list_fonts.py +0 -0
  238. {starplot-0.21.0 → starplot-0.21.1}/scripts/marimo.py +0 -0
  239. {starplot-0.21.0 → starplot-0.21.1}/scripts/svg.py +0 -0
  240. {starplot-0.21.0 → starplot-0.21.1}/scripts/voronoi.py +0 -0
  241. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/callables.py +0 -0
  242. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/cli.py +0 -0
  243. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/config.py +0 -0
  244. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/constants.py +0 -0
  245. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/coordinates.py +0 -0
  246. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/__init__.py +0 -0
  247. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/catalogs.py +0 -0
  248. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/constellations.py +0 -0
  249. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/db.py +0 -0
  250. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/dsos.py +0 -0
  251. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/ecliptic.py +0 -0
  252. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/constellation_names.parquet +0 -0
  253. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/dso_names.parquet +0 -0
  254. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/readme.md +0 -0
  255. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/star_designations.parquet +0 -0
  256. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/stars.py +0 -0
  257. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/translations.py +0 -0
  258. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/utils.py +0 -0
  259. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/geometry.py +0 -0
  260. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/mixins.py +0 -0
  261. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/__init__.py +0 -0
  262. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/base.py +0 -0
  263. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/comet.py +0 -0
  264. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/constellation.py +0 -0
  265. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/dso.py +0 -0
  266. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/milky_way.py +0 -0
  267. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/moon.py +0 -0
  268. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/objects.py +0 -0
  269. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/observer.py +0 -0
  270. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/optics.py +0 -0
  271. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/planet.py +0 -0
  272. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/satellite.py +0 -0
  273. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/star.py +0 -0
  274. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/sun.py +0 -0
  275. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/__init__.py +0 -0
  276. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/base.py +0 -0
  277. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/galaxy.py +0 -0
  278. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/horizon.py +0 -0
  279. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/map.py +0 -0
  280. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/optic.py +0 -0
  281. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/zenith.py +0 -0
  282. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/__init__.py +0 -0
  283. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/arrow.py +0 -0
  284. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/constellations.py +0 -0
  285. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/dsos.py +0 -0
  286. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/gridlines.py +0 -0
  287. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/legend.py +0 -0
  288. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/milkyway.py +0 -0
  289. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/stars.py +0 -0
  290. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/text.py +0 -0
  291. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/profile.py +0 -0
  292. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/projections.py +0 -0
  293. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/__init__.py +0 -0
  294. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/base.py +0 -0
  295. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/constants.py +0 -0
  296. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/elements.py +0 -0
  297. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/antique.yml +0 -0
  298. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_dark.yml +0 -0
  299. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_gold.yml +0 -0
  300. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_light.yml +0 -0
  301. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_medium.yml +0 -0
  302. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_night.yml +0 -0
  303. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/cb_wong.yml +0 -0
  304. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/gradient_presets.yml +0 -0
  305. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/grayscale.yml +0 -0
  306. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/grayscale_dark.yml +0 -0
  307. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/horizon.yml +0 -0
  308. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/map.yml +0 -0
  309. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/nord.yml +0 -0
  310. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/optic.yml +0 -0
  311. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/publication.yml +0 -0
  312. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/starplot.yml +0 -0
  313. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/extensions.py +0 -0
  314. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/gradients.py +0 -0
  315. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/helpers.py +0 -0
  316. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/plot.py +0 -0
  317. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/types.py +0 -0
  318. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/__init__.py +0 -0
  319. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/elements.py +0 -0
  320. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/fonts.py +0 -0
  321. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/layout.py +0 -0
  322. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/png.py +0 -0
  323. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/symbols.py +0 -0
  324. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/utils.py +0 -0
  325. {starplot-0.21.0 → starplot-0.21.1}/src/starplot/warnings.py +0 -0
  326. {starplot-0.21.0 → starplot-0.21.1}/tests/__init__.py +0 -0
  327. {starplot-0.21.0 → starplot-0.21.1}/tests/conftest.py +0 -0
  328. {starplot-0.21.0 → starplot-0.21.1}/tests/data/__init__.py +0 -0
  329. {starplot-0.21.0 → starplot-0.21.1}/tests/data/comets.txt +0 -0
  330. {starplot-0.21.0 → starplot-0.21.1}/tests/data/test_utils.py +0 -0
  331. {starplot-0.21.0 → starplot-0.21.1}/tests/models/__init__.py +0 -0
  332. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_comets.py +0 -0
  333. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_constellation.py +0 -0
  334. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_dso.py +0 -0
  335. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_observer.py +0 -0
  336. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_optics.py +0 -0
  337. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_satellite.py +0 -0
  338. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_solar_system.py +0 -0
  339. {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_star.py +0 -0
  340. {starplot-0.21.0 → starplot-0.21.1}/tests/plots/__init__.py +0 -0
  341. {starplot-0.21.0 → starplot-0.21.1}/tests/plots/test_galaxy.py +0 -0
  342. {starplot-0.21.0 → starplot-0.21.1}/tests/plots/test_horizon.py +0 -0
  343. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/__init__.py +0 -0
  344. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_elements.py +0 -0
  345. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_fonts.py +0 -0
  346. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_layout.py +0 -0
  347. {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_symbols.py +0 -0
  348. {starplot-0.21.0 → starplot-0.21.1}/tests/test_catalogs.py +0 -0
  349. {starplot-0.21.0 → starplot-0.21.1}/tests/test_cli.py +0 -0
  350. {starplot-0.21.0 → starplot-0.21.1}/tests/test_data.py +0 -0
  351. {starplot-0.21.0 → starplot-0.21.1}/tests/test_geometry.py +0 -0
  352. {starplot-0.21.0 → starplot-0.21.1}/tests/test_languages.py +0 -0
  353. {starplot-0.21.0 → starplot-0.21.1}/tests/test_map.py +0 -0
  354. {starplot-0.21.0 → starplot-0.21.1}/tests/test_optic.py +0 -0
  355. {starplot-0.21.0 → starplot-0.21.1}/tests/test_settings.py +0 -0
  356. {starplot-0.21.0 → starplot-0.21.1}/tests/test_styles.py +0 -0
  357. {starplot-0.21.0 → starplot-0.21.1}/tests/test_utils.py +0 -0
  358. {starplot-0.21.0 → starplot-0.21.1}/tests/utils.py +0 -0
  359. {starplot-0.21.0 → starplot-0.21.1}/tutorial/build.py +0 -0
  360. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_02.py +0 -0
  361. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_03.py +0 -0
  362. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_04.py +0 -0
  363. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_05.py +0 -0
  364. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_06.py +0 -0
  365. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_07.py +0 -0
  366. {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_08.py +0 -0
  367. {starplot-0.21.0 → starplot-0.21.1}/zensical.toml +0 -0
@@ -20,5 +20,5 @@ keywords:
20
20
  - graphs
21
21
  - plotting
22
22
  license: MIT
23
- version: 0.21.0
23
+ version: 0.21.1
24
24
  date-released: '2026-09-27'
@@ -88,7 +88,7 @@ build-star-designations:
88
88
  uv run $(DOTENV) data/scripts/star_designations.py
89
89
 
90
90
  version:
91
- uv run $(DOTENV) python -c 'import starplot as sp; print(sp.__version__)'
91
+ @uv run $(DOTENV) python -c 'import starplot as sp; print(sp.__version__)'
92
92
 
93
93
  setup:
94
94
  uv run $(DOTENV) starplot setup
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: starplot
3
- Version: 0.21.0
3
+ Version: 0.21.1
4
4
  Summary: Star charts and maps of the sky
5
5
  Keywords: astronomy,stars,charts,maps,constellations,sky,plotting
6
6
  Author-email: Steve Berardi <steve@starplot.dev>
@@ -111,11 +111,6 @@ p.export("starchart.svg")
111
111
  [https://starplot.dev](https://starplot.dev)
112
112
 
113
113
 
114
- ## Demo
115
- For a demo of Starplot's zenith charts, check out:
116
-
117
- [Sky Atlas - Star Chart Creator](https://skyatlas.app/star-charts/)
118
-
119
114
  ## Getting Help / Updates
120
115
 
121
116
  - Chat with other starplotters on our [Discord server](https://discord.gg/WewJJjshFu)
@@ -71,11 +71,6 @@ p.export("starchart.svg")
71
71
  [https://starplot.dev](https://starplot.dev)
72
72
 
73
73
 
74
- ## Demo
75
- For a demo of Starplot's zenith charts, check out:
76
-
77
- [Sky Atlas - Star Chart Creator](https://skyatlas.app/star-charts/)
78
-
79
74
  ## Getting Help / Updates
80
75
 
81
76
  - Chat with other starplotters on our [Discord server](https://discord.gg/WewJJjshFu)
@@ -8,6 +8,7 @@
8
8
  - Refactors styling framework with more consistent naming
9
9
  - Removed fonts from PyPI package, to reduce our filesize
10
10
  - Adds support for Python 3.14
11
+ - [**v0.21.1**] Fixes a couple bugs with a few azimuthal projections
11
12
 
12
13
  ---
13
14
 
@@ -17,7 +17,7 @@ p = MapPlot(
17
17
  scale=0.36,
18
18
  )
19
19
  p.stars(
20
- where=[_.magnitude < 11],
20
+ where=[_.magnitude < 12],
21
21
  where_labels=False,
22
22
  opacity_fn=lambda s: 0.9 if s.magnitude < 9 else 0.6,
23
23
  catalog=BIG_SKY,
@@ -2,7 +2,7 @@
2
2
 
3
3
  """Star charts and maps of the sky"""
4
4
 
5
- __version__ = "0.21.0"
5
+ __version__ = "0.21.1"
6
6
 
7
7
  import contextlib
8
8
 
@@ -16,7 +16,10 @@ from starplot import geometry as _geometry
16
16
  from starplot.config import settings
17
17
  from starplot.projections import (
18
18
  CoordinateReferenceSystem,
19
+ Equidistant,
20
+ LambertAzEqArea,
19
21
  ProjectionBase,
22
+ Stereographic,
20
23
  latlon_bounds_to_projection,
21
24
  )
22
25
  from starplot.styles import (
@@ -150,6 +153,53 @@ class Canvas:
150
153
  and abs(self.bounds[1] - self.bounds[3]) >= 179
151
154
  )
152
155
 
156
+ def _extent_contains_projection_singularity(self) -> bool:
157
+ """
158
+ Returns True if the extent contains the antipode of an azimuthal
159
+ projection's center, where the projection is either undefined
160
+ (stereographic) or stretched into a ring around the whole disc
161
+ (equidistant, Lambert equal-area).
162
+ """
163
+ if not isinstance(
164
+ self.projection, (Stereographic, Equidistant, LambertAzEqArea)
165
+ ):
166
+ return False
167
+
168
+ ra_min, dec_min, ra_max, dec_max = self.bounds
169
+ antipode_ra = (self.projection.center_ra + 180) % 360
170
+ antipode_dec = -self.projection.center_dec
171
+
172
+ if not dec_min <= antipode_dec <= dec_max:
173
+ return False
174
+
175
+ ra_span = ra_max - ra_min
176
+ return ra_span >= 360 or (antipode_ra - ra_min) % 360 <= ra_span
177
+
178
+ def _radec_bounds_from_projected(self) -> tuple[float, float, float, float]:
179
+ """
180
+ Converts the projected bounds back to RA/DEC bounds, making sure they include
181
+ any celestial pole that's inside the projected bounds.
182
+ """
183
+ ra_min, dec_min, ra_max, dec_max = self.tx.transform_bounds(
184
+ *self.projected_bounds, direction="INVERSE"
185
+ )
186
+
187
+ # transform_bounds only samples the edges of the projected box, so it can miss a
188
+ # pole that's inside the box (e.g. the south pole in an equatorial Stereographic
189
+ # plot), which leaves things like meridian gridlines stopping short of that pole
190
+ for pole_dec in (90, -90):
191
+ px, py = self.tx.transform(0, pole_dec)
192
+ if not (np.isfinite(px) and np.isfinite(py)):
193
+ continue
194
+ if self.minx <= px <= self.maxx and self.miny <= py <= self.maxy:
195
+ ra_min, ra_max = -180.0, 180.0
196
+ if pole_dec > 0:
197
+ dec_max = 90.0
198
+ else:
199
+ dec_min = -90.0
200
+
201
+ return ra_min, dec_min, ra_max, dec_max
202
+
153
203
  def _init_bounds(self):
154
204
  """
155
205
  Calculates true bounds from user-bounds, which can change slightly as a result of the map projection used.
@@ -163,9 +213,7 @@ class Canvas:
163
213
  *self.clip_path.bounds, densify_pts=1_000
164
214
  )
165
215
  self.projected_bounds = self.minx, self.miny, self.maxx, self.maxy
166
- self.bounds = self.tx.transform_bounds(
167
- *self.projected_bounds, direction="INVERSE"
168
- )
216
+ self.bounds = self._radec_bounds_from_projected()
169
217
  elif self._is_global():
170
218
  self.minx, self.miny, self.maxx, self.maxy = self.projection.global_bounds
171
219
  self.projected_bounds = self.minx, self.miny, self.maxx, self.maxy
@@ -184,10 +232,22 @@ class Canvas:
184
232
  curved=self.projection.curved,
185
233
  transformer=self.tx,
186
234
  )
235
+
236
+ if self._extent_contains_projection_singularity():
237
+ cx, cy = self.tx.transform(
238
+ self.projection.center_ra, self.projection.center_dec
239
+ )
240
+ radius = max(
241
+ abs(self.minx - cx),
242
+ abs(self.maxx - cx),
243
+ abs(self.miny - cy),
244
+ abs(self.maxy - cy),
245
+ )
246
+ self.minx, self.maxx = cx - radius, cx + radius
247
+ self.miny, self.maxy = cy - radius, cy + radius
248
+
187
249
  self.projected_bounds = self.minx, self.miny, self.maxx, self.maxy
188
- self.bounds = self.tx.transform_bounds(
189
- *self.projected_bounds, direction="INVERSE"
190
- )
250
+ self.bounds = self._radec_bounds_from_projected()
191
251
 
192
252
  self._refresh_figure_dimensions()
193
253
 
@@ -239,9 +299,7 @@ class Canvas:
239
299
  self.maxy = lerp(maxy, miny, ay0)
240
300
 
241
301
  self.projected_bounds = self.minx, self.miny, self.maxx, self.maxy
242
- self.bounds = self.tx.transform_bounds(
243
- *self.projected_bounds, direction="INVERSE"
244
- )
302
+ self.bounds = self._radec_bounds_from_projected()
245
303
 
246
304
  self._refresh_figure_dimensions()
247
305
 
@@ -14,6 +14,8 @@ from starplot.projections import (
14
14
  Equidistant,
15
15
  Orthographic,
16
16
  PlateCarree,
17
+ Stereographic,
18
+ StereoNorth,
17
19
  )
18
20
  from starplot.styles import (
19
21
  GradientStyle,
@@ -666,6 +668,45 @@ class TestInitBounds:
666
668
  assert canvas.minx != canvas.maxx
667
669
  assert math.isfinite(canvas.minx) and math.isfinite(canvas.maxx)
668
670
 
671
+ def test_bounds_include_pole_inside_clip_path(self):
672
+ # GIVEN an equatorial Stereographic canvas whose circular clip path
673
+ # (radius 110 degrees) contains both celestial poles
674
+ clip_path = _geometry.circle(center=(180, 0), diameter_degrees=220, num_pts=200)
675
+
676
+ # WHEN it initializes its bounds
677
+ canvas = _canvas(Stereographic(), bounds=[0, -90, 360, 90], clip_path=clip_path)
678
+
679
+ # THEN the RA/DEC bounds reach both poles
680
+ assert canvas.bounds[1] == -90
681
+ assert canvas.bounds[3] == 90
682
+
683
+ def test_extent_containing_stereographic_antipode_is_centered(self):
684
+ # GIVEN a Stereographic projection centered at dec 40, and an extent
685
+ # that contains its antipode (RA 280, dec -40)
686
+ projection = Stereographic(center_ra=100, center_dec=40)
687
+
688
+ # WHEN constructing the canvas
689
+ canvas = _canvas(projection, bounds=[0, -60, 360, 90])
690
+
691
+ # THEN the projection's center lands in the middle of the plot, and a
692
+ # point 100 degrees from center is still inside the plot
693
+ assert canvas._extent_contains_projection_singularity()
694
+ assert canvas._to_axes(100, 40) == pytest.approx((0.5, 0.5), abs=1e-6)
695
+ x, y = canvas._to_axes(100 + 180, 50)
696
+ assert 0 <= x <= 1 and 0 <= y <= 1
697
+
698
+ def test_extent_away_from_center_is_not_recentered(self):
699
+ # GIVEN a StereoNorth projection (centered on the north pole) with an
700
+ # extent that doesn't include the pole or its antipode
701
+ canvas = _canvas(StereoNorth(), bounds=[161.25, 47, 213, 65])
702
+
703
+ # WHEN it initializes its bounds
704
+ # THEN the bounds are not re-centered on the pole, so the pole stays
705
+ # outside the plot instead of being padded into view
706
+ assert not canvas._extent_contains_projection_singularity()
707
+ _, y = canvas._to_axes(0, 90)
708
+ assert not (0 <= y <= 1)
709
+
669
710
 
670
711
  class TestRefreshFigureDimensions:
671
712
  def test_wide_bounds_fill_width_and_derive_height_from_aspect_ratio(self):
@@ -1,177 +0,0 @@
1
- import numpy as np
2
- import matplotlib.path as mpath
3
- import matplotlib.patches as mpatches
4
- import cartopy.crs as ccrs
5
- from astropy.coordinates import SkyCoord
6
-
7
- from starplot import MapPlot, LambertAzEqArea, _
8
- from starplot.styles import PlotStyle, extensions
9
-
10
- group_blue = {
11
- "M81": {"RA": 148.888, "DEC": 69.065, "distance": 3.70},
12
- "M82": {"RA": 148.971, "DEC": 69.679, "distance": 3.61},
13
- "NGC3077": {"RA": 150.829, "DEC": 68.734, "distance": 3.85},
14
- "NGC2403": {"RA": 114.213, "DEC": 65.602, "distance": 3.19},
15
- "NGC4236": {"RA": 184.175, "DEC": 69.462, "distance": 4.41},
16
- "NGC4244": {"RA": 184.372, "DEC": 37.807, "distance": 4.31},
17
- "NGC4449": {"RA": 187.046, "DEC": 44.093, "distance": 4.27},
18
- }
19
- gal_ra = np.array([g["RA"] for g in group_blue.values()])
20
- gal_dec = np.array([g["DEC"] for g in group_blue.values()])
21
- gal_names = list(group_blue.keys())
22
-
23
- group_silver = {
24
- "NGC4214": {"RA": 183.912, "DEC": 36.327, "distance": 2.94},
25
- "HolmII": {"RA": 124.767, "DEC": 70.714, "distance": 3.39},
26
- "NGC4395": {"RA": 186.458, "DEC": 33.5461, "distance": 4.61},
27
- "M94": {"RA": 192.723, "DEC": 41.1194, "distance": 4.66},
28
- "NGC2366": {"RA": 112.228, "DEC": 69.2053, "distance": 3.19},
29
- "DDO82": {"RA": 157.646, "DEC": 70.6194, "distance": 4.00},
30
- "DDO168": {"RA": 198.619, "DEC": 45.9194, "distance": 4.33},
31
- "DO165": {"RA": 196.612, "DEC": 67.7042, "distance": 4.57},
32
- "IC3687": {"RA": 190.563, "DEC": 38.5019, "distance": 4.57},
33
- "HolmI": {"RA": 145.135, "DEC": 71.1864, "distance": 3.84},
34
- }
35
- other_gal_ra = np.array([g["RA"] for g in group_silver.values()])
36
- other_gal_dec = np.array([g["DEC"] for g in group_silver.values()])
37
- other_gal_names = list(group_silver.keys())
38
-
39
-
40
- def get_hurricane():
41
- u = np.array(
42
- [
43
- [2.444, 7.553],
44
- [0.513, 7.046],
45
- [-1.243, 5.433],
46
- [-2.353, 2.975],
47
- [-2.578, 0.092],
48
- [-2.075, -1.795],
49
- [-0.336, -2.870],
50
- [2.609, -2.016],
51
- ]
52
- )
53
- u[:, 0] -= 0.098
54
- codes = [1] + [2] * (len(u) - 2) + [2]
55
- u = np.append(u, -u[::-1], axis=0)
56
- codes += codes
57
- # Scale to angular size
58
- scale = 1.15 / np.max(np.abs(u))
59
- return mpath.Path(scale * u, codes, closed=False)
60
-
61
-
62
- hurricane = get_hurricane()
63
-
64
- center_coord = SkyCoord(ra=160, dec=58, unit="deg")
65
- center_ra = center_coord.ra.deg
66
- center_dec = center_coord.dec.deg
67
-
68
- style = PlotStyle().extend(
69
- extensions.BLUE_LIGHT,
70
- extensions.MAP,
71
- )
72
- p = MapPlot(
73
- projection=LambertAzEqArea(center_ra=center_ra, center_dec=center_dec),
74
- ra_min=120,
75
- ra_max=200,
76
- dec_min=33,
77
- dec_max=78,
78
- style=style,
79
- resolution=4000,
80
- autoscale=True,
81
- )
82
-
83
- p.stars(
84
- where=[_.magnitude < 8],
85
- bayer_labels=True,
86
- where_labels=[_.magnitude < 1.75],
87
- opacity_fn=lambda star: max(0.01, 1.0 - 0.1 * star.magnitude),
88
- )
89
-
90
- for ra, dec, name in zip(gal_ra, gal_dec, gal_names):
91
- # Build hurricane polygon in sky coordinates (degrees)
92
- ra_offsets = hurricane.vertices[:, 0] / np.cos(
93
- np.radians(dec)
94
- ) # Adjust angular size for declination
95
- dec_offsets = hurricane.vertices[:, 1]
96
- hurricane_lon = ra + ra_offsets
97
- hurricane_lat = dec + dec_offsets
98
- # Convert RA to the longitude convention starplot/cartopy use (RA increases eastward)
99
- hurricane_lon_cartopy = np.mod(360.0 - hurricane_lon, 360.0)
100
- # Transform each vertex into the map projection
101
- projected_vertices = np.array(
102
- [
103
- p.ax.projection.transform_point(lon, lat, ccrs.PlateCarree())
104
- for lon, lat in zip(hurricane_lon_cartopy, hurricane_lat)
105
- ]
106
- )
107
-
108
- patch = mpatches.PathPatch(
109
- mpath.Path(projected_vertices, hurricane.codes),
110
- facecolor="lightblue",
111
- edgecolor="navy",
112
- linewidth=5.0,
113
- zorder=30,
114
- )
115
- p.ax.add_patch(patch)
116
- p.marker(
117
- ra=ra,
118
- dec=dec,
119
- style={
120
- "marker": {
121
- "symbol": "circle",
122
- "size": 10,
123
- "fill": "darkblue",
124
- "stroke": "navy",
125
- "stroke_width": 3.0,
126
- }
127
- },
128
- )
129
- p.text(
130
- text=name,
131
- ra=ra,
132
- dec=dec,
133
- style={
134
- "fill": "navy",
135
- "font_size": 28,
136
- "font_weight": 700,
137
- "offset_x": 35,
138
- "offset_y": 35,
139
- },
140
- )
141
-
142
- for ra, dec, name in zip(other_gal_ra, other_gal_dec, other_gal_names):
143
- p.marker(
144
- ra=ra,
145
- dec=dec,
146
- style={
147
- "marker": {
148
- "symbol": "ellipse",
149
- "size": 30,
150
- "fill": "orange",
151
- "stroke": "black",
152
- "stroke_width": 2.0,
153
- }
154
- },
155
- )
156
- p.text(
157
- text=name,
158
- ra=ra,
159
- dec=dec,
160
- style={
161
- "fill": "black",
162
- "font_size": 28,
163
- "offset_x": 15.0,
164
- "offset_y": 40.0,
165
- },
166
- )
167
-
168
- p.gridlines()
169
- p.constellations(style__stroke="#78d78e", style__opacity=0.25)
170
- p.constellation_borders(style__stroke="#035019", style__opacity=0.25)
171
- p.constellation_labels(style__font_size=28, style__fill="#035019")
172
- p.milky_way()
173
- p.ecliptic()
174
- p.celestial_equator()
175
- p.ax.tick_params(axis="both", labelsize=28)
176
-
177
- p.export("galaxy_custom_marker.png", padding=0.3, transparent=True)
@@ -1,39 +0,0 @@
1
- from datetime import datetime
2
- from zoneinfo import ZoneInfo
3
-
4
- from starplot import HorizonPlot, Observer, _
5
- from starplot.styles import PlotStyle, extensions
6
-
7
- style = PlotStyle().extend(
8
- extensions.BLUE_MEDIUM,
9
- extensions.HORIZON,
10
- )
11
-
12
- dt = datetime(2024, 8, 30, 21, 0, 0, 0, tzinfo=ZoneInfo("US/Pacific"))
13
-
14
- observer = Observer(
15
- dt=dt,
16
- lat=36.606111, # Lone Pine, California
17
- lon=-118.079444,
18
- )
19
-
20
- p = HorizonPlot(
21
- altitude=(0, 60),
22
- azimuth=(135, 225),
23
- observer=observer,
24
- style=style,
25
- resolution=4000,
26
- scale=0.9,
27
- )
28
-
29
- p.constellations()
30
- p.milky_way()
31
-
32
- p.stars(where=[_.magnitude < 5], where_labels=[_.magnitude < 2])
33
- p.messier(where=[_.magnitude < 11], where_true_size=[False])
34
-
35
- p.constellation_labels()
36
- p.horizon(labels={180: "SOUTH"})
37
- p.gridlines()
38
-
39
- p.export("horizon_sgr.png")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes