EOmaps Versions Save

A library to create interactive maps of geographical datasets

v8.1.1

1 month ago

A quick bugfix release to address issues with disappearing colorbars on multiple layers.

EOmaps v8.1.1

πŸ”¨ Fixes

  • ❗ Fix colorbars on different layers only show after additional draw
  • Handle numpy linalg errors resulting from singular colorbar axes

EOmaps v8.1

A minor release that brings a new plot-shape!

Make sure to also checkout the release-notes for EOmaps v8.0!

🌳 New

New hexbin shape

There is a new shape to visualize your data as hexagonal-bin plots!

m.set_shape.hexbin(size=(20, 40), aggregator="mean")

πŸ”¨ Fixes

  • ❗ fix using multiple sizes with m.set_shape.scatter_points(size=...)
  • Fix scroll events should be captured in Jupyter Notebooks if the LayoutEditor is active
  • Fix placement of InsetMaps indicator-lines if multiple boundary intersections are found
  • Fix clipping issues if m.get_extent() is used with a crs other than the plot-crs
  • Fix using m.add_gridlines with uneven number of explicit lon/lat values
  • Unify treatment of ellipses and geod_circle shapes
  • Fix using kwargs to style the boundary of the peek_layer callback area
  • Fix using "hist_size=None" when adding colorbars
  • Fix hiding histogram axes with hist_size=0
  • Fix identification of layers that contain only dynamic artists
  • Fix issues with scalebars outside the axes clip boundary
  • Allow passing an explicit norm to m.plot_map if no classification is used
  • Allow using bbox=None with annotations to to hide the bounding-box
  • Identification of the directions for m.add_gridlines(where="tblr") has been improved

v8.1

1 month ago

A minor release that brings a new plot-shape!

Make sure to also checkout the release-notes for EOmaps v8.0!

🌳 New

New hexbin shape

There is a new shape to visualize your data as hexagonal-bin plots!

m.set_shape.hexbin(size=(20, 40), aggregator="mean")

πŸ”¨ Fixes

  • ❗ fix using multiple sizes with m.set_shape.scatter_points(size=...)
  • Fix scroll events should be captured in Jupyter Notebooks if the LayoutEditor is active
  • Fix placement of InsetMaps indicator-lines if multiple boundary intersections are found
  • Fix clipping issues if m.get_extent() is used with a crs other than the plot-crs
  • Fix using m.add_gridlines with uneven number of explicit lon/lat values
  • Unify treatment of ellipses and geod_circle shapes
  • Fix using kwargs to style the boundary of the peek_layer callback area
  • Fix using "hist_size=None" when adding colorbars
  • Fix hiding histogram axes with hist_size=0
  • Fix identification of layers that contain only dynamic artists
  • Fix issues with scalebars outside the axes clip boundary
  • Allow passing an explicit norm to m.plot_map if no classification is used
  • Allow using bbox=None with annotations to to hide the bounding-box
  • Identification of the directions for m.add_gridlines(where="tblr") has been improved

v8.0.2

2 months ago

EOmaps v8.0.2

  • fix issues with missing companion-widget source files
  • fix issues with missing dask-expr dependency for datashader

EOmaps v8.0

A new major release that brings a lot of important updates and improvements for EOmaps!

A big thanks goes to @banesullivan, @yeelauren and @jhkennedy who provided many useful suggestions and comments to improve EOmaps in the PyOpenSci review (https://github.com/pyOpenSci/software-submission/issues/138)!

Β§ New License!

The EOmaps source code is now licensed under a BSD 3 Clause License to make it easier for users and contributors to improve and extend the codebase and to use EOmaps to build awesome tools for geo-data analysis!

Make sure to have a look at the licensing-note in the FAQ of the docs for some more details!

Interested in contributing to EOmaps? Checkout the updated Contribution Guide!

⚠️ Major changes to pip install

Dependency management for EOmaps has been improved to split between required and optional dependencies.

❗pip install eomaps now only installs the bare minimum requirements to run EOmaps. ❗To install EOmaps with all optional dependencies, use pip install eomaps[all].

Make sure to have a look at the updated installation instructions in the docs for more details on how to selectively install optional dependencies!

🌳 New

  • m.set_data(...) now directly accepts xarray.Datasets as input (see docs on how to assign datasets)
  • There is a new pre-defined keypress callback: overlay_layer
    • You can use it to toggle showing a layer on top of the currently visible layer.
      m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
      
  • The switch_layer keypress-callback now also accepts lists of layer-names (or lists of tuples (name, transparency))
  • m.cb.pick.share_events() now supports the additional kwarg "ensure_same_id"
    • If True, all maps that share the pick-event will use the same ID to identify the relevant datapoint
    • If False, all maps that share the pick-event identify the closest datapoint based on the (reprojected) click position.
  • The LayoutEditor now accepts -1 as width/height value for axes (to auto-adjust the value)

πŸ•ΉοΈ Jupyter Widgets

There is now a collection of pre-configured Jupyter Widgets that can be used as control elements in Jupyter Notebooks!

Make sure to checkout the corresponding πŸ•ΉοΈ EOmaps Jupyter Widgets section in the docs!

🌦️ Changes

  • ❗ Installation config is now provided as a pyproject.toml file (instead of setup.py)
  • ❗ Supported python version is now >=3.8
  • EOmaps now uses qtpy to support multiple Qt versions for the 🧰 Companion Widget!
  • _version.py has been removed. The version is now specified in the [project] category of the pyproject.toml file.
  • Actions now use micromamba to setup (and cache) test environments
  • Colorbar kwargs show_outline and ylabel have been renamed to outline and hist_label

The following (previously deprecated) methods are now removed:

  • m.set_data_specs $\Rightarrow$ use m.set_data instead
  • m.add_wms.DLR_basemaps... $\Rightarrow$ use m.add_wms.DLR.basemap... instead
  • m_inset.indicate_inset_extent $\Rightarrow$ use m_inset.add_extent_indicator instead

πŸ“– Documentation updates

Make sure to checkout the fully updated API docs!

  • Documentation environment was updated to most recent build dependencies
  • Only minimal requirements to import eomaps are now installed for docs-build
  • Info on how to configure VSCode/VSCodium for EOmaps has been added to the docs
  • In general, the docs now (gradually switch to) use MySt and Jupyter Notebooks (parsed with myst_nb) to improve formatting, examples etc.

πŸ”¨ Fixes

  • Make sure the widget is compatible with both Qt5 and Qt6
  • Fix forcing colorbar-position inheritance
  • Fix treatment of colorbar histogram style kwargs (e.g. edgecolor, facecolor, etc.)
  • Address numpy binary incompatibility warning if netCDF4 is imported after numpy
  • Fix inheriting colorbar positions from other colorbars
  • Address unittest issue with contour-shape labels
  • Avoid blocking the terminal in unittests for jupyter notebooks
  • Fix missing docstring for DLR webmap service
  • Fix issues for move-callbacks shared between multiple Maps
  • Fix visibility of datasets when using "dynamic_shade_indicator" colorbars
  • Fix assignment of vmin/vmax for "count" based shade-aggregation
  • Fix treatment of masked values in evaluation of vmin/vmax for encoded datasets
  • Fix issues with help-text popups of the CompanionWidget LayerTabBar
  • Improvements for colorbar implementation
  • Unify treatment of layer-name parsing
  • Try to push current view to toolbar nav-stack after layout-restore
  • Fix issues with help-popups of the LayerTabBar of the companion-widget
  • Fix issues with figure-exports after m.apply_layout(...)
  • Fix treatment of reprojected 1D datasets with shade_raster shape
  • Fix parsing maxsize argument in companion widget for raster-shape
  • Fix treatment of infinite values in weighted colorbar histograms
  • Allow passing transform-kwarg to m.add_text(...)
  • Fix truncating companion-widget title if too long
  • Make sure companion-widget dataset-dropdown is elided
  • Avoid memory-leaks caused by artist-references in pick-containers
  • Fix numpy.ma.masked_array issues with datashader/numba when using "shade_points"
  • Fix handling pick-events that do not have an "idx" property
  • Fix raster-aggregation if block-size cannot be evaluated (e.g. None)
  • Fix handling of pick-events that do not have an "idx" property
  • Make sure keypress-events are triggered irrespective of the toolbar mode
  • Make sure LayoutEditor x0, y0 values are always set as specified
  • Fix issues with string-type dpi values passed to savefig
  • Avoid pandas dependency when attempting to use raster shape with 1D datasets
  • Make sure data encoding fill-value is properly applied

v8.0.1

2 months ago

A new major release that brings a lot of important updates and improvements for EOmaps!

A big thanks goes to @banesullivan, @yeelauren and @jhkennedy who provided many useful suggestions and comments to improve EOmaps in the PyOpenSci review (https://github.com/pyOpenSci/software-submission/issues/138)!

Β§ New License!

The EOmaps source code is now licensed under a BSD 3 Clause License to make it easier for users and contributors to improve and extend the codebase and to use EOmaps to build awesome tools for geo-data analysis!

Make sure to have a look at the licensing-note in the FAQ of the docs for some more details!

Interested in contributing to EOmaps? Checkout the updated Contribution Guide!

⚠️ Major changes to pip install

Dependency management for EOmaps has been improved to split between required and optional dependencies.

❗pip install eomaps now only installs the bare minimum requirements to run EOmaps. ❗To install EOmaps with all optional dependencies, use pip install eomaps[all].

Make sure to have a look at the updated installation instructions in the docs for more details on how to selectively install optional dependencies!

🌳 New

  • m.set_data(...) now directly accepts xarray.Datasets as input (see docs on how to assign datasets)
  • There is a new pre-defined keypress callback: overlay_layer
    • You can use it to toggle showing a layer on top of the currently visible layer.
      m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
      
  • The switch_layer keypress-callback now also accepts lists of layer-names (or lists of tuples (name, transparency))
  • m.cb.pick.share_events() now supports the additional kwarg "ensure_same_id"
    • If True, all maps that share the pick-event will use the same ID to identify the relevant datapoint
    • If False, all maps that share the pick-event identify the closest datapoint based on the (reprojected) click position.
  • The LayoutEditor now accepts -1 as width/height value for axes (to auto-adjust the value)

πŸ•ΉοΈ Jupyter Widgets

There is now a collection of pre-configured Jupyter Widgets that can be used as control elements in Jupyter Notebooks!

Make sure to checkout the corresponding πŸ•ΉοΈ EOmaps Jupyter Widgets section in the docs!

🌦️ Changes

  • ❗ Installation config is now provided as a pyproject.toml file (instead of setup.py)
  • ❗ Supported python version is now >=3.8
  • EOmaps now uses qtpy to support multiple Qt versions for the 🧰 Companion Widget!
  • _version.py has been removed. The version is now specified in the [project] category of the pyproject.toml file.
  • Actions now use micromamba to setup (and cache) test environments
  • Colorbar kwargs show_outline and ylabel have been renamed to outline and hist_label

The following (previously deprecated) methods are now removed:

  • m.set_data_specs $\Rightarrow$ use m.set_data instead
  • m.add_wms.DLR_basemaps... $\Rightarrow$ use m.add_wms.DLR.basemap... instead
  • m_inset.indicate_inset_extent $\Rightarrow$ use m_inset.add_extent_indicator instead

πŸ“– Documentation updates

Make sure to checkout the fully updated API docs!

  • Documentation environment was updated to most recent build dependencies
  • Only minimal requirements to import eomaps are now installed for docs-build
  • Info on how to configure VSCode/VSCodium for EOmaps has been added to the docs
  • In general, the docs now (gradually switch to) use MySt and Jupyter Notebooks (parsed with myst_nb) to improve formatting, examples etc.

πŸ”¨ Fixes

  • Make sure the widget is compatible with both Qt5 and Qt6
  • Fix forcing colorbar-position inheritance
  • Fix treatment of colorbar histogram style kwargs (e.g. edgecolor, facecolor, etc.)
  • Address numpy binary incompatibility warning if netCDF4 is imported after numpy
  • Fix inheriting colorbar positions from other colorbars
  • Address unittest issue with contour-shape labels
  • Avoid blocking the terminal in unittests for jupyter notebooks
  • Fix missing docstring for DLR webmap service
  • Fix issues for move-callbacks shared between multiple Maps
  • Fix visibility of datasets when using "dynamic_shade_indicator" colorbars
  • Fix assignment of vmin/vmax for "count" based shade-aggregation
  • Fix treatment of masked values in evaluation of vmin/vmax for encoded datasets
  • Fix issues with help-text popups of the CompanionWidget LayerTabBar
  • Improvements for colorbar implementation
  • Unify treatment of layer-name parsing
  • Try to push current view to toolbar nav-stack after layout-restore
  • Fix issues with help-popups of the LayerTabBar of the companion-widget
  • Fix issues with figure-exports after m.apply_layout(...)
  • Fix treatment of reprojected 1D datasets with shade_raster shape
  • Fix parsing maxsize argument in companion widget for raster-shape
  • Fix treatment of infinite values in weighted colorbar histograms
  • Allow passing transform-kwarg to m.add_text(...)
  • Fix truncating companion-widget title if too long
  • Make sure companion-widget dataset-dropdown is elided
  • Avoid memory-leaks caused by artist-references in pick-containers
  • Fix numpy.ma.masked_array issues with datashader/numba when using "shade_points"
  • Fix handling pick-events that do not have an "idx" property
  • Fix raster-aggregation if block-size cannot be evaluated (e.g. None)
  • Fix handling of pick-events that do not have an "idx" property
  • Make sure keypress-events are triggered irrespective of the toolbar mode
  • Make sure LayoutEditor x0, y0 values are always set as specified
  • Fix issues with string-type dpi values passed to savefig
  • Avoid pandas dependency when attempting to use raster shape with 1D datasets
  • Make sure data encoding fill-value is properly applied

v8.0rc2

2 months ago

A third release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

v8.0rc1

2 months ago

A second release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

v8.0rc0

2 months ago

A first release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

v7.3.3

4 months ago

Another round of bug-fixes for v7.3.

🌳 New

  • MapsGrid objects now have dedicated .show() and .snapshot() methods

πŸ”¨ Fixes

  • ❗ fix restoring visible layer in interactive backends after using m.savefig()
  • ❗ fix issues with InsetMaps in ipympl backend
  • fix re-drawing spines with m.set_frame() if corners are not rounded
  • fix colorbar should use figure directly instead of relying on plt.gcf
  • fix re-fetching backgrounds if colorbars change axes sizes
  • fix parsing "maxsize" argument for raster-shape in companion-widget
  • fix treatment of weighted colorbar histograms with (out_of_range_vals="masked")

v7.3.2

5 months ago

A second bugfix release for v7.3 that brings some important fixes for Jupyter Notebooks, custom WebMap services and RGB/RGBA composite plots.

🌳 New

  • Style kwargs are now supported when adding multiple preset-features in one go, for example:
    m = Maps()
    m.add_feature.preset("coastline", "ocean", "land", alpha=0.5)
    
  • You can now specify additional wms properties when using custom WebMap services, for example:
    my_wms = m.add_wms.get_service("service-url", service_type="wms", version=1.3.0)
    

🌦️ Changes

  • The figure-header added by the Jupyter-notebook ipympl backend is now hidden by default. To revert back to the old behavior (and enable the header), use:
    %matplotlib widget
    m = Maps()
    m.f.canvas.header_visible = True
    

πŸ”¨ fixes

  • ❗ fix issues with RGB/RGBA composite plots
  • ❗ fix UserDefined Classification issue: max-bin replaced by data-max
  • ❗ fix using transparent snapshots in IPython/Jupyter Notebooks
  • fix duplicated figures shown in jupyter notebooks inline backend
  • fix re-fetching backgrounds and spines with m.set_frame()
  • fix using m.set_frame() in jupyter notebook inline backend
  • improve syntax for disabling draw or update in the BlitManager
  • improve handling of issues with "tight_bbox" redraws
  • avoid logging during draw on higher levels
  • avoid turning off interactive mode with the jupyter notebook inline backend
  • allow passing kwargs to custom WebMap services

v7.3.1

5 months ago

A first series of bugfixes for v7.3.

🌦️ changes

  • InsetMap indicator lines are now only drawn between the boundaries of the InsetMap and its extent.

    You can add markers at the connection points with:

    m_inset.add_indicator_line(m, marker="o", markersize=10)
    

πŸ”¨ Fixes

  • fix re-drawing backgrounds on add/remove gridlines and gridlabels
  • fix re-drawing backgrounds on m.set_frame
  • fix triggering on_layer callbacks defined on InsetMaps
  • fix custom text positioning with m.add_title
  • fix handling of multiple inset-indicator lines
  • fix passing InsetMap boundary colors as RGBA tuples