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.
- {starplot-0.21.0 → starplot-0.21.1}/CITATION.cff +1 -1
- {starplot-0.21.0 → starplot-0.21.1}/Makefile +1 -1
- {starplot-0.21.0 → starplot-0.21.1}/PKG-INFO +1 -6
- {starplot-0.21.0 → starplot-0.21.1}/README.md +0 -5
- {starplot-0.21.0 → starplot-0.21.1}/docs/changelog.md +1 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_milky_way_stars.py +1 -1
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/__init__.py +1 -1
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/canvas.py +67 -9
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_canvas.py +41 -0
- starplot-0.21.0/examples/galaxy_custom_marker.py +0 -177
- starplot-0.21.0/examples/horizon_sgr.py +0 -39
- {starplot-0.21.0 → starplot-0.21.1}/.dockerignore +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/FUNDING.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/archives.yaml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/docs.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/release.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.github/workflows/test.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/.gitignore +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/CLAUDE.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/CODE_OF_CONDUCT.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/CONTRIBUTING.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/Dockerfile +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/LICENSE +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/constellation_borders.json +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/constellations.json +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/milkyway.json +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/star_designations.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/en-us/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/es/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fa/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/fr/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/it/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/lt/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/nl/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-cn/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/constellation_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/dso_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/other_terms.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/raw/translations/zh-tw/star_names.csv +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/constellation_names.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/data_settings.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/db.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/dso_names.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/star_designations.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/data/scripts/translations.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/about.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/coming-soon.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/css/extra.css +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/custom/main.html +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data/building.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data/constellations.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data/dsos.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data/index.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data/stars.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/data-sources.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-double-cluster.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-gradient.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/horizon-sgr.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-big-dipper.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-big.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-canis-major.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-carina-nebula.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-cassiopeia.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-custom-marker.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-galaxy.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-milky-way-stars.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-orion.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-orthographic.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-sagittarius.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/map-virgo-cluster.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-iss-transit.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-m45.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-orion.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/optic-solar-eclipse.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-basic.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-detail.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples/star-chart-french.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/examples.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/celestial-globe.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/cover-front-sm-360.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/discord.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/examples/.keep +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/favicon.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/figure_layout.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-2400px.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/banner.vectornator +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo.vectornator +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo-original/logo2.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo2.vectornator +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/logo500.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono-2400px.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono.png +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/mono.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/star.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/starplot-header.svg +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/images/tutorial/.keep +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/index.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/installation.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/license.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/migration-guides/0.16.0.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/migration-guides/0.21.0.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/comet.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/constellation.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/dso.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/index.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/moon.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/object-list.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/observer.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/optics.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/planet.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/satellite.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/star.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/models/sun.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/constellations.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/dsos.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/object-names/stars.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-callables.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-collisions.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-galaxyplot.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-horizonplot.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-localization.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-mapplot.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-ongc.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-opticplot.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-positions.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-projections.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-selecting-objects.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-settings.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/reference-zenithplot.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/robots.txt +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/data.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/gradients.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/markers.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projection_list.html +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projection_list.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/projections.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/style_explorer.html +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/scripts/style_explorer.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/showcase.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/snippets/_newsletter.html +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/color.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/explorer.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/extensions.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/gradients.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/index.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/layout.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/markers.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/styling/reference.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/01.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/02.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/03.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/04.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/05.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/06.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/07.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/08.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/09.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/docs/tutorial/index.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/constellation.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/examples.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/galaxy.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/gradient.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/horizon_double_cluster.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/horizon_gradient.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_big.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_big_dipper.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_canis_major.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_carina.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_cas.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_equidistant.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_galaxy.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_orion.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_orthographic.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_sagittarius.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/map_virgo_cluster.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/optic_iss_transit.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/optic_m45.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/optic_orion_nebula.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/optic_solar_eclipse.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_basic.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_detail.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/examples/star_chart_french.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/data/.keep +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/flaky.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/galaxy_checks.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/hashio.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/hashlock.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/horizon_checks.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/map_checks.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/optic_checks.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/template.html +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/hash_checks/zenith_checks.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/pyproject.toml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/scripts/download_test_fonts.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/scripts/list_fonts.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/scripts/marimo.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/scripts/svg.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/scripts/voronoi.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/callables.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/cli.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/config.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/constants.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/coordinates.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/catalogs.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/constellations.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/db.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/dsos.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/ecliptic.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/constellation_names.parquet +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/dso_names.parquet +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/readme.md +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/library/star_designations.parquet +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/stars.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/translations.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/data/utils.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/geometry.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/mixins.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/base.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/comet.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/constellation.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/dso.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/milky_way.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/moon.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/objects.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/observer.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/optics.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/planet.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/satellite.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/star.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/models/sun.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/base.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/galaxy.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/horizon.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/map.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/optic.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plots/zenith.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/arrow.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/constellations.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/dsos.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/gridlines.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/legend.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/milkyway.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/stars.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/plotters/text.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/profile.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/projections.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/base.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/constants.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/elements.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/antique.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_dark.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_gold.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_light.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_medium.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/blue_night.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/cb_wong.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/gradient_presets.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/grayscale.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/grayscale_dark.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/horizon.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/map.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/nord.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/optic.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/publication.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/ext/starplot.yml +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/extensions.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/gradients.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/helpers.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/plot.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/styles/types.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/elements.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/fonts.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/layout.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/png.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/svg/symbols.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/utils.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/src/starplot/warnings.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/conftest.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/data/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/data/comets.txt +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/data/test_utils.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_comets.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_constellation.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_dso.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_observer.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_optics.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_satellite.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_solar_system.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/models/test_star.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/plots/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/plots/test_galaxy.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/plots/test_horizon.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/__init__.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_elements.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_fonts.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_layout.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/svg/test_symbols.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_catalogs.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_cli.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_data.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_geometry.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_languages.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_map.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_optic.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_settings.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_styles.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/test_utils.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tests/utils.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/build.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_02.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_03.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_04.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_05.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_06.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_07.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/tutorial/tutorial_08.py +0 -0
- {starplot-0.21.0 → starplot-0.21.1}/zensical.toml +0 -0
|
@@ -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.
|
|
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)
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|