Recent Releases of eomaps
eomaps - EOmaps v8.3.3
A minor bugfix release with 2 small new features
๐จ Fixes
- fix
m.add_wms.get_servicenot working forwmtsservices - fix companion-widget hidden on first keypress
- fix companion-widget not closed if parent figure is closed
- fix broken WebMap urls for Austrian webmaps
๐ณ New
- There is a new option for
m.set_frame()to use country-borders as map frame.python m = Maps() m.set_frame(countries=["Austria", "Italy"], facecolor="k") codespellhas been added to the pre-commit hooks to detect common typos ( thanks to @nathanjmcdougall )
- Python
Published by raphaelquast 9 months ago
eomaps - EOmaps v8.3.2
A minor bugfix release that addresses some pending issues.
๐จ Fixes
- โfix
m.set_shape.contour()ifmatplotlib >=3.10is used - fix
AttributeError: 'Figure' object has no attribute '_mpl_orig_savefig' - fix readthedocs builds (e.g. add "sphinx configuration key")
๐ณ New
- You can now provide the crs also as a string, e.g:
m = Maps(crs="EPSG:4326")
- Python
Published by raphaelquast about 1 year ago
eomaps - EOmaps v8.3.1
๐จ Fixes
- fix minor dependency issues reported on conda-forge
EOmaps v8.3
A new minor release that brings a few features and a much improved documentation!
๐ณ New
- There is a new method
ScaleBar.set_rotationto set the rotation-angle of a scalebar. -
m.set_frame(gdf=...)can now be used to set arbitrary map-boundaries based ongeopandas.GeoDataFrames
(multipolygon support requires upcoming cartopy v0.24 release) - There is a new contextmanager
Maps.delay_drawthat can be used to delay intermediate draw-events and speed up the creation of complex figures.
๐ Documentation updates and new theme
๐ Big thanks to @Fanchengyan for his efforts to improve the documentation!
- Docs now use the
PyData Sphinx Theme - New improved example gallery based on
myst_sphinx_galleryready to be filled with a lot of examples!
๐จ Fixes
- Fix issues with "inherit_position=False" for colorbars
- Make sure cached layers are re-drawn if a colorbar changes the axes-size
- Fix treatment of assigned "search_radius" for
pickcallbacks if 1D brute-force search is used - Update GitHub actions and documentation dependencies
- Python
Published by raphaelquast over 1 year ago
eomaps - EOmaps v8.3
A new minor release that brings a few features and a much improved documentation!
๐ณ New
- There is a new method
ScaleBar.set_rotationto set the rotation-angle of a scalebar. -
m.set_frame(gdf=...)can now be used to set arbitrary map-boundaries based ongeopandas.GeoDataFrames
(multipolygon support requires upcoming cartopy v0.24 release) - There is a new contextmanager
Maps.delay_drawthat can be used to delay intermediate draw-events and speed up the creation of complex figures.
๐ Documentation updates and new theme
๐ Big thanks to @Fanchengyan for his efforts to improve the documentation!
- Docs now use the
PyData Sphinx Theme - New improved example gallery based on
myst_sphinx_galleryready to be filled with a lot of examples!
๐จ Fixes
- Fix issues with "inherit_position=False" for colorbars
- Make sure cached layers are re-drawn if a colorbar changes the axes-size
- Fix treatment of assigned "search_radius" for
pickcallbacks if 1D brute-force search is used - Update GitHub actions and documentation dependencies
- Python
Published by raphaelquast over 1 year ago
eomaps - EOmaps v8.2.1
A first series of bugfixes for v8.2
๐จ Fixes
- โFix identification of default shape based on dataset size
- โFix issues with unmanaged artists on inset-maps
- Explicitly check if norm is provided as string before setting data limits
- Provide more descriptive (info) error message if data cannot be plotted
- Avoid using classification bins as labels if a large number of bins is used (>30)
- Make sure to resample colormaps in case more bins than colors are used
- Avoid shape radius estimation if no data is set
- Avoid unnecessary draw-triggers for datasets if the "all" layer is visible
- Remove warning for widgets if backends other than "ipympl" are used
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.2
A new minor release with some fixes, many improvements to the internals and a few new features!
๐ณ New
- You can now use
m.add_colorbar(layer=..)to override the layer at which the colorbar is plotted - There is a new method
m.set_shade_dpi(...)to override the dpi used by shade-shapes. (Useful to fix data aggregation resolution for high-dpi exports or to adjust resolution to better suit data density)
๐ฆ๏ธ Changes
- Grid-snapping of the
LayoutEditornow snaps to all edges of the axes (Useful in case the axis-size is not a multiple of the grid-spacing)- If multiple axes are moved, the first selected object acts as anchor
- โ The default matplotlib keymap
p : "toggle pan/zoom tool"is now active again
๐ฉ๏ธ Internals (no effects on the public API)
- Unit-tests now use image-comparison to ensure stable image export results
- โ The
Mapsclass has been refactored (MapsandMapsBase) to make the code more accessible and easier to handle.
๐จ Fixes
- fix handling of axes on combined layers in the LayoutEditor
- allow custom scatter_points marker shapes for "mark" callback
- fix issues with identification of grid-label position with projections that create non-intersecting grid-lines
- always print basic exception info on issue during layer-change action
- make sure to trigger a figure-update after adding a scalebar
- address pyproj warnings for pyproj>=3.5
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.1.1
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!
python
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
InsetMapsindicator-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_gridlineswith uneven number of explicit lon/lat values - Unify treatment of
ellipsesandgeod_circleshapes - Fix using kwargs to style the boundary of the
peek_layercallback 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_mapif no classification is used - Allow using
bbox=Nonewith annotations to to hide the bounding-box - Identification of the directions for
m.add_gridlines(where="tblr")has been improved
- Python
Published by raphaelquast almost 2 years ago
eomaps - 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!
python
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
InsetMapsindicator-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_gridlineswith uneven number of explicit lon/lat values - Unify treatment of
ellipsesandgeod_circleshapes - Fix using kwargs to style the boundary of the
peek_layercallback 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_mapif no classification is used - Allow using
bbox=Nonewith annotations to to hide the bounding-box - Identification of the directions for
m.add_gridlines(where="tblr")has been improved
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.0.2
EOmaps v8.0.2
- fix issues with missing companion-widget source files
- fix issues with missing
dask-exprdependency fordatashader
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 eomapsnow only installs the bare minimum requirements to runEOmaps. โTo install EOmaps with all optional dependencies, usepip 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 acceptsxarray.Datasetsas 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.
python m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
- You can use it to toggle showing a layer on top of the currently visible layer.
- The
switch_layerkeypress-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
LayoutEditornow accepts-1as 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.tomlfile (instead ofsetup.py) - โ Supported python version is now
>=3.8 - EOmaps now uses qtpy to support multiple Qt versions for the ๐งฐ Companion Widget!
_version.pyhas been removed. The version is now specified in the[project]category of thepyproject.tomlfile.- Actions now use
micromambato setup (and cache) test environments - Colorbar kwargs
show_outlineandylabelhave been renamed tooutlineandhist_label
The following (previously deprecated) methods are now removed: -
m.set_data_specs$\Rightarrow$ usem.set_datainstead -m.add_wms.DLR_basemaps...$\Rightarrow$ usem.add_wms.DLR.basemap...instead -m_inset.indicate_inset_extent$\Rightarrow$ usem_inset.add_extent_indicatorinstead
๐ 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
numpybinary incompatibility warning ifnetCDF4is 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 "dynamicshadeindicator" 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_rastershape - 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_arrayissues 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
rastershape with 1D datasets - Make sure data encoding fill-value is properly applied
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.0.1
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 eomapsnow only installs the bare minimum requirements to runEOmaps. โTo install EOmaps with all optional dependencies, usepip 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 acceptsxarray.Datasetsas 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.
python m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
- You can use it to toggle showing a layer on top of the currently visible layer.
- The
switch_layerkeypress-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
LayoutEditornow accepts-1as 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.tomlfile (instead ofsetup.py) - โ Supported python version is now
>=3.8 - EOmaps now uses qtpy to support multiple Qt versions for the ๐งฐ Companion Widget!
_version.pyhas been removed. The version is now specified in the[project]category of thepyproject.tomlfile.- Actions now use
micromambato setup (and cache) test environments - Colorbar kwargs
show_outlineandylabelhave been renamed tooutlineandhist_label
The following (previously deprecated) methods are now removed: -
m.set_data_specs$\Rightarrow$ usem.set_datainstead -m.add_wms.DLR_basemaps...$\Rightarrow$ usem.add_wms.DLR.basemap...instead -m_inset.indicate_inset_extent$\Rightarrow$ usem_inset.add_extent_indicatorinstead
๐ 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
numpybinary incompatibility warning ifnetCDF4is 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 "dynamicshadeindicator" 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_rastershape - 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_arrayissues 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
rastershape with 1D datasets - Make sure data encoding fill-value is properly applied
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.0rc2
A third release-candidate for EOmaps v8.
For a full list of upcoming changes, fixes and improvements, see #205
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.0rc1
A second release-candidate for EOmaps v8.
For a full list of upcoming changes, fixes and improvements, see #205
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v8.0rc0
A first release-candidate for EOmaps v8.
For a full list of upcoming changes, fixes and improvements, see #205
- Python
Published by raphaelquast almost 2 years ago
eomaps - EOmaps v7.3.3
Another round of bug-fixes for v7.3.
๐ณ New
MapsGridobjects now have dedicated.show()and.snapshot()methods
๐จ Fixes
- โ fix restoring visible layer in interactive backends after using
m.savefig() - โ fix issues with InsetMaps in
ipymplbackend - 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 (outofrange_vals="masked")
- Python
Published by raphaelquast about 2 years ago
eomaps - EOmaps v7.3.2
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:
python 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:
python 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
ipymplbackend is now hidden by default. To revert back to the old behavior (and enable the header), use:python %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
- Python
Published by raphaelquast about 2 years ago
eomaps - EOmaps v7.3.1
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:
python
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
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.3
A new minor release that brings a lot of fixes and some nice new functionalities!
๐ณ New
- There is a new convenience method to quickly update the properties of the frame of a map:
- set boundary line properties and use rounded corners for map boundaries
- set background patch color
python
m = Maps()
m.set_frame(rounded=0.5, edgecolor="r", linewidth=2, facecolor="0.5")
m.add_annotation()andm.add_marker()now support the"update"kwarg to override update triggers (useful to avoid unnecessary updates if multiple dynamic annotations/markers are added in a callback)m.add_gdf()now supports the "permanent" kwarg to control if artists are updated on each event or added as background-artists- The ๐ Contribution guide contains a new chapter on how to build the docs!
๐ฆ๏ธ Changes
- โ Using
m.show()no longer activates the layer associated with the calling Maps object. (usem.show_layer(m.layer)to show the layer of a selected Maps object!) - Activating the
AnnotationEditornow clears all currently visible temporary artists and disables all callbacks
๐จ Fixes
- โfix zooming datasets with individual shape sizes for each datapoints
- โfix using the save-button in the normal matplotlib toolbar to save a figure
- โfix custom axis background patch color is only visible on figure export
- โfix grid-labels are not properly updated on pan/zoom events
- fix identification of layers that only exist on
InsetMaps - fix annotation editor clears annotation text on companion-widget init
- fix all-nan slice warnings on vmin/vmax estimation if no data-values are provided
- fix single geod_circle radius parsed to 1D array in setter
- fix using
m.add_gdf(permanent=False)to add dynamically updated geometries - fix annotation editor issues if annotation is not attached to the figure
- fix
m.get_extent()should not return coordinates outside the crs bounds - fix closing companion-widgets of child-maps on figure close
- fix clearing snapshot cells with
m.show() - fix
m.util.layer_selector()should remain responsive during toolbar actions - fix using
m.cb.<method>.set_execute_during_toolbar_action()on child Maps objects - improve handling of errors during snapshot creation
- remove
rtreeand add default python version to development env file - fix restoring axes backgrounds in gui after savefig
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.2.1
A first bugfix release for v7.2 that also brings some nice performance improvements!
Make sure to also check the release-notes for EOmaps v7.2!
๐จ Fixes
- โ Fix issues with aggregated datasets outside the currently visible extent
- โ Fix displacement of grid-labels on figure export with dpi other than the native dpi
- โ Fix dataset export issues with
"agg"backend on some of the plot-shapes - general performance updates for background-fetching and caching
- avoid activating the companion widget when webagg backend is active
๐ณ New
- New method for raster-data aggregation:
"mode"(e.g. most common value) - The behavior of callbacks during toolbar actions can now be set via
m.cb.<method>.set_execute_during_toolbar_action() - New
.remove()method for grid-lalbels
๐ฆ๏ธ Changes
- To avoid issues with
"webagg"derived backends, custom"move"callbacks no longer trigger automatic updates of the plot.- โ Explicitly call
m.BM.update()in custom move-callbacks to trigger an update!
- โ Explicitly call
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.2
A mew minor release that brings a lot of improvements for raster-data visualization!
๐ณ New
Major improvements for raster-data visualization!
The raster-shape (e.g. m.set_shape.raster) now has data-aggregation capabilities!
This means that the
rastershape can now be used also for arbitrarily sized datasets (as long as they fit in memory) (so far tested with datasets up to 2 billion datapoints)
In short, this means:
- Datasets larger than maxsize will be aggregated prior to plotting to avoid slow load-times for extremely large datasets
- Aggregation can be turned off using maxsize=None (e.g. to get the behavior prior to v7.2)
- By default, only datasets larger than 5 million datapoints will be aggregated prior to plotting
For more details, check the docs for the raster-shape!
๐จ Fixes
- โ avoid activating matplotlibs interactive mode by default
- fix identification of data-limits and colormap for GeoTiffs
๐ฆ๏ธ Changes
rasteris now used as default plot shape also for very large datasets
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.1.2
A second minor bugfix release for v7.1.2
Make sure to check the release-notes for EOmaps v7.1 as well!
๐จ Fixes
- fix import error when adding
wmslayers - only log unique picker names for multi-geometry GeoDataFrames
- allow using
scatter_pointsas marker-shape - fix setting permanent-kwarg for markers
- fix search-radius should default to
m.cb.pick._search_radius - return created annotation object in
m.add_annotation() - fix docstrings for get/set extent
- avoid reprojection of gdf if init or cartopy crs can be identified
- add more descriptive repr for Maps objects
- make sure to only re-evaluate scalebar scale on extent changes
contributing.mdfile added
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.1.1
A first bugfix release for EOmaps v7.1
Make sure to check the release-notes for EOmaps v7.1 as well!
๐จ Fixes
- โfix delay on figure close due to unnecessary background re-fetch during cleanup
- โfix OSM nominatim query url (e.g.
m.set_extent_to_location) - fix mask_radius for voronoi and delaunay should return a list not a generator
- address matplotlib deprecation of
f.canvas.key_release_event - fix treatment of layers starting with a single underscore in utility sliders and selectors
- fix singular matrix issues when using colorbars in the layout editor
- fix adjusting colorbars that inherit the position in the layout editor
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.1
A new minor release that introduces contour plots and brings some nice updates for the companion widget!
Make sure to check the release-notes for EOmaps v7.0 for an overview of all new features that arrived with v7.x
๐ณ New
Contour plots!
There is a new plot-shape:
m.set_shape.contour()- it can be used to draw contour-plots (filled shapes or lines) of regular (2D) or irregular (1D) datasets!
- use
colorbar.indicate_contours()to indicate the contour-levels on an existing colorbar
Checkout the new Contour Plot Example in the docs for more details!
Companion widget updates
- The drop-down menu for WebMaps is now easier to navigate and has properly grouped entries
- The "Add Feature" widget now has individual buttons for each category and properly grouped entries
Map Feature Infos
The Editor tab of the companion widget now offers a new button for each artist that opens a popup with additional information on the feature (if available)
- General infos (Licensing, References etc.)
- Source code to reproduce the feature
Checkout the corresponding section in the docs for more details: Additional information on Features and WebMaps
โ ๏ธ Deprecations
- The following arguments of
m.new_layer()are depreciated and will be removed in upcoming releases:copy_data_specs$\rightarrow$inherit_datacopy_classify_specs$\rightarrow$inherit_classificationcopy_shape$\rightarrow$inherit_shape
To create a new layer (or map) that uses the same data and classification as the Maps-object m, you can now use:
python
m2 = m.new_layer(inherit_data=True, inherit_classification=True)
m2 = m.new_map(ax=222, inherit_data=True, inherit_classification=True)
- Using the WebMap service name
DLR_basemapsis deprecated- services are now integrated in the parent category
DLR(usem.add_wms.DLR.basemap...to access basemap features)
- services are now integrated in the parent category
๐จ Fixes
- โ fix compatibility with
python < 3.9 - run unittests on
python 3.8as well - remove no longer needed
mambarequirementnumpy < 1.24 - fix toggling of the AnnotationEditor for multiple maps in one figure
- fix setting plot-extent for GeoDataFrames with
m.add_gdf(dataframe, set_extent=True) - fix classification issues for encoded masked datasets
- fix resetting of linestyles on layout editor exit
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v7.0
A new major release that brings a lot of important updates for EOmaps!
- Export figures as vektor graphics (and export to clipboard with ctrl+c)
- Extensive re-work of the companion-widget (new design and new features)
- Basic command line interface
- Improved documentation (incl. a Contribution Guide and an API Reference)
- Improved Jupyter Notebook support
- Editable annotations
- Logging
Interested in contributing to EOmaps? Checkout the new Contribution Guide on how to get started!
๐ณ New
๐บ Export figures as vector graphics
Export routines have been re-worked! Now its possible to export figures as vector graphics (svg, pdf, eps) in addition to rasterized images (png, jpeg, tiff, ...)!
- use m.savefig(rasterize_data=False) to control if datasets are exported as vectors or not
- by default datasets are rasterized even on vector export to avoid creating very large files
Checkout the corresponding section in the docs for more details.
๐ฆ Directly export figures to the clipboard (ctrl + c)!
This is really useful to quickly copy-paste the current state of a figure at runtime to other programs (e.g. paste figures in documents or in an image-editing software for post-processing)
The export can be customized (file-type, dpi, etc.)
- simply adjust the most important parameters in the Companion Widget
(currently set values are used for clipboard export)
- or use m.set_clipboard_kwargs(...) to programmatically set clipboard-export parameters
๐งฐ Companion Widget updates
The companion widget has been extensively re-worked:
- New design with a nice and clean look and greatly improved usability
- New features:
- Human readable names for artists in the editor
- Assign transparencies to individual layers
- Currently set export parameters are now used as parameters for export to clipboard
(e.g. whenever ctrl + c is pressed)
- set arrow/patch/text/colors for annotations (and a button to make existing annotations editable)

Checkout the corresponding section in the docs for more details.
๐ Zoomable InsetMaps
InsetMaps can now be zoomed (and indicator patches are updated accordingly)
Editable Annotations
The AnnotationEditor allows you to interactively place (or edit existing) annotations!
- Set text, colors, patch and arrow designs
- Drag textbox and anchor position
โ Command Line Interface
EOmaps can now be used directly from the terminal via the eomaps command!
The following options can be provided:
- --help get some help
- --crs <crs identifier> set the crs of the map
- --location <location>set the map extent to the queried location
---file open a file for plotting
---ne add basic features to the map
---wms
For example: `eomaps --crs 4326 --ne coastline --ne ocean --location europe
Checkout the corresponding section in the docs for more details.
Updates for Jupyter Notebooks
It is now possible to use the companion widget in jupyter notebooks!
To support using the widget, use the ipympl backend together with the %gui qt command!
```python
%matplotlib widget
%gui qt
from eomaps import Maps m = Maps() m.add_feature.preset("coastline", "ocean") ```
Logging
Proper logging has finally been implemented!
To set the log-level (and customize log message formatting), use:
```python from eomaps import Maps, setloglevel setloglevel("info")
m = Maps(3857) m.setdata([1, 2, 3], [1, 2, 3], [1, 2, 3], crs=4326) m.plotmap() ```
๐ Documentation updates
The documentation has been extensively updated to make it cleaner and easier to navigate. - Improved document structure and proper cross-referencing throughout the docs - Many updates on individual chapters - New chapter ๐ Contribution Guide
additional new features worth mentioning:
- There is a new way to add multiple preset features to a map in one go:
python m = Maps() m.add_feature.preset("coastline", "ocean", "land") - New (shorter) syntax for delayed actions that initialize a new layer: ```python def func(m): m.add_feature.preset.coastline()
m = Maps()
m.onlayeractivation(func, layer="mylayer")
``
- It is now possible to select if callbacks are executed on all layers or only on the visible layer (seem.cb.)
- There is a new convenience methodm.addtitle(...)to add a title to a map
- The new class-methodMaps.config(...)` can be used to set global config variables
(backend specific configs, default shortcuts etc.)
โ ๏ธ Depreciations
m.set_data_specs(...)is deprecated and will be removed in the next minor version. Usem.set_data(...)instead!m_inset.indicate_inset_extentis deprecated, Usem_inset.add_extent_indicatorinstead!
A lot of code re-factoring has been done to better follow PEP8 naming conventions.
Most of the changes concern internal class and function definitions and should not affect public API.For more details see From EOmaps v6.x to v7.x:
๐จ Fixes
- properly cross-reference functions in docs
- fix companion-widget init for maps in already initialized figures
- better caching for transformers and crs objects
- unify handling of default PyQt5 keypress callbacks
- avoid recursions caused by dynamically updated grids on savefig
- fix performance issue with
m.get_extent - fix colorbar causing singular matrix errors with hist_size=1
- only warn for vmin/vmax=None if data is not inherited
- fix clearing peek-layer callback markers on savefig
- make sure "all" layer callbacks are executed after normal layers
- fix performance issues with the LayoutEditor
- allow activating the LayoutEditor if toolbar actions are active
- fix InsetMaps._parent override on init
- fix clearing temp artists on Maps-cleanup
- fix search radius crs when using geod_circles
- fix dataset-Maps object identification for semi-transparent layers
- fix treatment of figure background patches
- fix issues with jupyter notebook
inlinebackend - fix issues with LayoutEditor and jupyter notebook
ipymplbackend - avoid using black dots in the LayoutEditor to support dark themes
- fix cleanup of datamanager callbacks on consecutive calls to plotmap
- fix activating current layer on control+click on tab-widget
- cache combined layers only if necessary
- avoid unnecessary draws in shape-drawer
- avoid duplicated snapshots on update with inline backend
- fix using the companion widgets with backends other than PyQt5
- fix shade canvas size updates on figure resize events
- Python
Published by raphaelquast over 2 years ago
eomaps - EOmaps v6.5
A new release that finally adds a long-standing feature request to EOmaps: GridLabels!
๐ณ new
๐ Grid Labels
It is now possible to add labels to grids in arbitrary projections! Make sure to checkout the new section in the docs Adding Labels to the Grid as well as the new ๐ Gridlines and Grid Labels example!
python
m = Maps(...)
...
g = m.add_gridlines(...)
g.add_labels(...)

๐ฌ New features for InsetMaps
m_inset.add_indicator_line(...): Add a line that connects the inset-map with the inset-extent on another map.- The edge-color of the inset-map can now be specified directly via the
boundarykwarg (e.g.boundary="red")
...other new features
- Picked compass objects are now indicated with a red boundary
- ColorBar objects have a new convenience-method
cb.set_labels(...)to set the colorbar & histogram labels (and the style) - the ๐ Documentation has been re-structured and updated

๐ฆ๏ธ changes
- Fill values in integer encoded datasets are now excluded when evaluating data-bounds (vmin/vmax)
m.from_file,m.read_fileandm.new_layer_from_filenow support the additional kwargfill_values="mask"/"keep"(to avoid costly and memory-intensive initialization of masked-arrays for extremely large datasets)- the
print_to_consolecallback now returns tuples by default
๐จ fixes
- fix cartopy crs identification from pyproj-crs
- fix updating compass objects on init and scroll events
- fix colorbars should only inherit positions if orientation is the same
- fix colorbar minor ticks for vertical colorbars
- fix clipping of colorbar bins provided as lists
- make sure NE preset features handle mpl-synonyms (ec, fc, lw ...)
- fix orientation of inset-map boundary vertices
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.4.1
A minor bugfix release to ensure immediate draws of new background artists
๐จ fixes
- fix setting vmin/vmax for encoded data
- fix add/remove bg_artists should immediately trigger a draw
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.4
A minor release that brings some nice performance improvements and a lot of bugfixes.
๐ Improvements for the scalebar!
The ScaleBar implementation has been re-worked in terms of performance and usability.
- For details, check the section in the docs! ๐ Scalebars
๐จ Fixes
- fix adding colorbars with
hist_size=None - fix treatment of inset-maps in peek-layer callbacks
- improve scalebar performance
- make sure scalebars are not positioned out of bounds
- cache transformer and crs objects to speed up initialization
- make sure spines are properly updated on refetch-bg actions
- make Maps-axes animated to avoid unnecessary draws of AxesImage objects
- speed up initialization of Maps objects
- fix performance issues with the companion-widget with many map-layers
- fix updating dynamic colorbars on layer change
- only print a warning on pick-dataset override if pick-callbacks are assigned
- fix inheriting classifications from maps using shade-shapes
- properly support
layerkwarg form.text - make sure dynamic artists maintain plot order at same zorder
- fix inset-map indicator shapes should be permanent artists
- fix using uniform colors for delaunay_triangulations
- fix identification of intermediate shape-points if data=None
- unify treatment of vmin/vmax for all shapes
- fix issues with inherited classifications and vmin/vmax
โ ๏ธ Depreciations
- The ScaleBar segment-length (
scale) and number of segments (n) are now explicitly passed as arguments on initialization:m.add_scalebar(scale=..., n=...)(Old syntax is still functional but will raise an error in future versions!)
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.3
A new minor release with a lot of important fixes.
๐ฆ๏ธ changes
- Dynamic artists now properly respect the order of multi-layers
- Vertical stacking of artists is determined first by the layer-order and then by the intrinsic zorders within the layer
- Executing callbacks now clears temporary artists only for the currently visible layer
- The obsolete method
m.util.remove(...)has been removed.- call
.remove()on the selector/slider instances directly to remove them!
- call
๐ณ New
m.util.layer_slider()andm.util.layer_selector()now support using "combined layer tuples" when specifying layer-names that should be included in the widget (e.g.layers=["layer1", ("layer1", "layer2")])m.get_extent(): get the extent of the map (a wrapper form.ax.get_extent())
๐จ Fixes
- โ Fix maintaining order of vertical stacking for background artists at the same zorder
- โ Fix vertical stacking order of dynamic artists on multi-layers
- โ Fix issues using
m.set_shape.raster()with irregularly spaced datasets - โ Fix automatic evaluation of intermediate points used for plot-shapes based on visible data size
- Fix issues with background patches for dynamic artists on ordinary (managed) axes
- Use unittests to check basic functionality of code-snippets in docs
- Mention
m.set_extent()in the docs - Update
docutils,sphinxandsphinx_rtd_themeversions - Only attempt to close netcdfs in
m.read_file.NetCDFif opening was successful - Fix triggering data_manager updates for dynamic collections
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.2.1
Primarily a bugfix release that also introduces new WebMap services!
๐ณ New
- There is a new option to directly export figures with a "tight bbox" in the companion-widget.

๐บ๏ธ new WebMap services
- OpenStreetMap
- Humanitarian (e.g. HOT) style (https://wiki.openstreetmap.org/wiki/HOT_style)
- OpenSeaMap (https://wiki.openstreetmap.org/wiki/OpenSeaMap)
- GMRT (Global Multi-Resolution Topography (GMRT) Synthesis, https://gmrt.org/)
- GLAD (Global Land Analysis and Discovery Team, https://glad.umd.edu/)
- GOOGLE (Google Maps layers, https://google.com) #### ๐ EOmaps is going outta space! (โ NOTE: since these WebMaps are provided in an earth-based WebMercator projection, units of scalebars, geod-circles etc. will be wrong since they represent earth-based units)
- OpenPlanets - Mars and Moon WebMaps! (https://www.openplanetary.org)

๐ฆ๏ธ Changes
ESRI_ArcGISWebMap services are now fetched asxyzservices
๐จ Fixes
- fix exporting figures with tight bboxes if
dpi=figure_dpi - fix data-manager issues if radius cannot be evaluated
- fix using custom globes with scalebars and gridlines
- make sure webmaps are added transparent in the companion-widget
- fix identification of picked values if
"shade_raster"is used with 2D coordinates
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.2
A minor release that brings new WebMap services and addresses handling of non-EOmaps artists.
๐ณ New
Improved handling of artists added with matplotlib/cartopy methods
Handling of artists added with methods NOT provided by EOmaps (e.g. using matplotlib or cartopy methods directly) has been improved:
- All artists that are created with non-
EOmapsmethods are now drawn on the "base" layer by default. - To put artists on dedicated layers, you need to explicitly add them to the blit-manager (
m.BM):- for "dynamic" artists that have to be updated on every event on the map:
m.BM.add_artist(artist, layer=...) - for "background" artists that only need to be re-drawn on pan/zoom/resize:
m.BM.add_bg_artist(artist, layer=...)
- for "dynamic" artists that have to be updated on every event on the map:
``python
from eomaps import Maps
m = Maps(layer="base")
m.add_feature.preset.coastline() # EOmaps method... the layer ofm` is used for the artist
a matplotlib method is used... this artist will show up on the "base" layer
m.ax.plot([10, 20, 30], [5, 78, 25], c="r", lw=3)
to put arbitrary artists on dedicated layers, add them to the blit-manager:
l, = m.ax.plot([10, 20, 30], [5, 78, 25], lw=2, c="b") m.BM.addbgartist(l, layer="my_line") ```
๐บ New OpenStreetMap WebMap services added!
- OpenRiverboatMap
- CyclOSM
- OEPNVpublictransport
- OSM_WhereGroup
- OSM_WaymarkedTrails
- OSM_OpenRailwayMap
- OSM_CartoDB basemaps
๐จ Fixes
- fix drawing artists that were not added via EOmaps functions (e.g. using matplotlib/cartopy functionalitites)
- fix using
m.savefig()withbbox_inches="tight"
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.1.3
A quick-fix release to fix adding multiple markers via lists of data IDs
๐จ Fixes
- fix adding multiple markers/annotations by ID
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.1.2
A second bugfix release for v6.1
๐ณ New
InsetMapsnow add a white background patch by default.
(usem.new_inset_map(background_color=None)to get a transparent inset-map
๐จ Fixes
- fix
crsargument ofm.set_extent() - fix re-population of layer-tabs in the widget if new layers are created with the widget
- fix assignment of initial shape "n" on new layer creation
- fix treatment of the "all" layer on
InsetMaps - fix issues with flushing events on fast updates in the companion widget
- fix
GridLinesshould inherit the default layer from the calling maps object - fix treatment of background patches for "unmanaged" axes
- fix removing background-artists from dedicated inset-map layers
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.1.1
A quick bugfix release that addresses some issues in Jupyter Notebooks
๐จ fixes
- fix creating snapshots (e.g. for jupyter notebooks etc.) with arbitrary combinations of layers
- fix spines not properly updated when adding colorbars with
%matplotlib inline
EOmaps v6.1
A minor release that fixes remaining issues with v6.0.x and adds functionalities for grid-lines!
๐ณ New
- The
LayoutEditornow supports undo/redo of recent events viacontrol + zandcontrol + y - There is a new method
m.new_map()to simplify adding new maps to existing figures InsetMapsnow have a new methodm.get_inset_position()to get the current position and size- There is a new function
m.add_gridlines()that can be used to addGridLinesto the map!- Have a look at the new section in the docs for more details: โฆ Gridlines

- Have a look at the new section in the docs for more details: โฆ Gridlines
๐จ Fixes
- fix
ReferenceErrorsif the parent-map variable is overridden while the figure is still open - fix performance issues caused by unnecessary updates in the companion widget
- avoid triggering "onlayerchange" actions if the layer is already active
- make sure the selected "pick-map" does not automatically reset in the companion-widget
- only attempt to close an opened file if opening was actually successful
- add support for the "frameon" kwarg when creating new Maps-objects
- fix "pick-only" datasets should not attempt to plot a collection
- fix misplaced axes-frames when adding colorbars on already opened plots
- fix re-positioning of already created
InsetMaps - fix handling of matplotlib-inline backends
- raise an error if geod_circles are used without providing a radius
- fix altering colorbar/histogram scaling with + and - keys
- fix issues when trying to fetch wms submenus for non-accessible servers
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.1
A minor release that fixes remaining issues with v6.0.x and adds functionalities for grid-lines!
๐ณ New
- The
LayoutEditornow supports undo/redo of recent events viacontrol + zandcontrol + y - There is a new method
m.new_map()to simplify adding new maps to existing figures InsetMapsnow have a new methodm.get_inset_position()to get the current position and size- There is a new function
m.add_gridlines()that can be used to addGridLinesto the map!- Have a look at the new section in the docs for more details: โฆ Gridlines

- Have a look at the new section in the docs for more details: โฆ Gridlines
๐จ Fixes
- fix
ReferenceErrorsif the parent-map variable is overridden while the figure is still open - fix performance issues caused by unnecessary updates in the companion widget
- avoid triggering "onlayerchange" actions if the layer is already active
- make sure the selected "pick-map" does not automatically reset in the companion-widget
- only attempt to close an opened file if opening was actually successful
- add support for the "frameon" kwarg when creating new Maps-objects
- fix "pick-only" datasets should not attempt to plot a collection
- fix misplaced axes-frames when adding colorbars on already opened plots
- fix re-positioning of already created
InsetMaps - fix handling of matplotlib-inline backends
- raise an error if geod_circles are used without providing a radius
- fix altering colorbar/histogram scaling with + and - keys
- fix issues when trying to fetch wms submenus for non-accessible servers
- Python
Published by raphaelquast almost 3 years ago
eomaps - EOmaps v6.0.3
A third series of minor bug fixes for EOmaps v6.0
โ Make sure to check the release-notes for EOmaps v6.0 (There are possibly breaking changes with respect to EOmaps v5.x)
๐จ Fixes
- fix shape "n" should not use auto-value if it has been explicitly set
- implement temporary fix for srs identification of wms that require reprojection
- fix issues with the clip-shape for WebMap layers on fast pan/zoom-events
- fix layer assignment for temporary artists
- allow overriding layer assignment for temporary artists
- fix keypress modifiers for peek-layer callbacks cause glitches
- fix updating layer editor tabs in companion widget when adding features and webmaps
- make sure a proper layer is activated on layer-deletion in the widget
- clear new-layer input after layer creation
- port WebMap patches to cartopy and drop them for cartopy>=0.21.2
- fix warn-message when using the default shape with large datasets
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v6.0.2
Another series of bugfixes for EOmaps v6.0
โ Make sure to check the release-notes for EOmaps v6.0 โ
There are possibly breaking changes with respect to EOmaps v5.x An overview of the most important changes is provided here: โ From EOmaps v5.x to v6.x
๐ณ New
- Using
m.new_layer_from_file.GeoTIFForMaps.from_file.GeoTIFFnow attempts to parse color-assignments provided in the file if no explicit colormap was provided.
๐จ fixes
- fix performance issues for large RGB / RGBA composites
- fix removing deleted layer tabs in the companion widget
- fix identification of picked values when using "shade_raster"
- fix treatment of explicit colors (e.g. for rgb composits etc.)
- make sure to use
"base"as the default layer for file-layers - fix codecov integration (e.g. use app)
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v6.0.1
A first series of bugfixes for EOmaps v6.0
โ Make sure to check the release-notes for EOmaps v6.0 โ
There are possibly breaking changes with respect to EOmaps v5.x (... and a lot of old syntax from v3.x, v4.x and v5.x has been removed) - An overview of the most important changes is provided here: โ From EOmaps v5.x to v6.x
๐ณ New
m.add_colorbar(extend=...)now has an explicit kwarg to override the extension-arrow behavior- It is now possible to use
m.redraw("layer1", "layer2")to trigger a re-draw of specific layers
๐จ Fixes
- fix infinite recursions with
Compassobjects on zoom events - fix updating
Scalebarbackground patches on move - fix recursions in
m.on_layer_activation()callbacks - fix inherited
Colorbaraxis positions if extension arrows are present - fix performance issues with the companion-widget for large number of layers
- fix sizing of companion-widget layer-tabs
- make sure a draw-event is triggered if limits are set on data-plot
- make sure adding a
Colorbartriggers associated layer-re-draws - fix axis limits when updating layers for existing
Sliderwidgets - fix performance issues with
ColorbarandCompassobjects - make sure to update if artist props are changed with the companion-widget
- avoid unnecessary re-draws of unaffected already cached backgrounds
- fix dynamic artist identification on transparent layer-overlays
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v6.0
A new major-release that comes with a lot of updates, performance improvements and some very nice new features!
โ There are possibly breaking changes with respect to EOmaps v5.x โ (... and a lot of old syntax from v3.x, v4.x and v5.x has been removed) - An overview of the most important changes is provided here: โ From EOmaps v5.x to v6.x
๐ณ New
๐ด Performance improvements!
EOmaps v6.0 represents a major change in the internals for layer and data management.
โฐ Data Management
๐ Data is now dynamically pre-selected based on the visible extent prior to plotting, which provides a huge speed-up for: - Zoom/pan on plots of very large datasets - Initial startup of plots that show only a subset of the assigned datasets
If you don't need to see the whole extent of the data, make sure to set the desired extent before calling
m.plot_map()via -m.set.extent()-m.set_extent_to_location()
โง Composing layers
๐ The interface to combine, stack or overlay layers has been greatly improved in terms of speed and usability.
- To overlay the layer "B" on top of the layer "A", simply use m.show_layer("A", "B")
- To overlay a layer with a global transparency, provide a tuple of (<layer-name>, <transparency>)
e.g.: m.show_layer("A", ("B", 0.5)) will overlay the layer "B" with 50% transparency
- Associated ๐งฐ Companion Widget updates
- The order at which layers are selected in the layer-dropdown now determines the stacking order of the layers
- To change the stacking order, simply re-arrange the (movable) layer-tabs in the Compare and Edit views!).

๐ฒ new functionalities
m.set_extent(): set the map extentm.inherit_classification: use the classification of a given Maps object (useful to avoid costly classifications for zoomed-in plots that show only a fraction of the data)m.inherit_data(): share the data between Maps objectsm.text()add plain textpeek-layercallbacks now support"round"peek-shapes in addition to rectangles!m.cb.click.attach.peek_layer(shape="round")- checkout the new button in the "Peek Layer" section of the ๐งฐ Companion Widget
- Control the behavior of WebMap services if the size of the axes or figure is changing
m.refetch_wms_on_size_change(): toggle global behavior for WebMap services- use
m.savefig(refetch_wms=False)to avoid re-fetching WebMaps if you save figures at different dpi!
๐จ Fixes
- fix
val_colorfor forwarded pick callbacks - estimate shape radius for x- and y- direction separately when using 2D datasets
- fix transparency for cached background layers
- handle possible exceptions in companion-widget drawer tab
- make sure companion-widget dropdown does not close on layer-changes
- fix attaching pick callbacks prior to plotting datasets
- fix triggering re-draws of layers if artists are added to the "all" layer
- fix treatment of animated axes in layout editor
- fix cancelling save-file dialog
- fix compass behavior on figure size changes
- fix compass position and size on figure dpi changes
- fix handling of spines
- make sure inset-maps are always drawn above other maps
- avoid re-drawing the background when drawing shapes
- use
annotation_clip=Truefor annotations by default - adjust default zorders of shapes and webmaps
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v5.4
A minor release with some awesome new features!
๐ฆ๏ธ changes
- โ
m.plot_map(pick_distance=...)is depreciated, usem.cb.pick.set_props(search_radius=...)instead โ
๐ณ New
๐ฒ Improvements for PICK callbacks
The internals for pick-callbacks have been re-worked to improve performance and incorporate some new features.
- you can now use m.cb.pick.set_props(...) to set the picking behavior for each Maps-object
๐ฑ Pick N nearest neighbors
- Starting with EOmaps v5.4 it is possible to pick N nearest neighbors instead of a single point!
- Checkout the docs for more details: ๐ญPicking N nearest neighbours
python m = Maps() m.set_data([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]) m.plot_map() m.cb.pick.set_props(n=3, pick_relative_to_closest=True, consecutive_pick=False) m.cb.pick.attach.mark(fc="none", ec="r")
๐ฒ Improvements for shapes
๐ฑ There is a new plot-shape: m.set_shape.scatter_points
- basically the same as using
plt.scatter()but supercharged so that EOmaps functionalities work as expected - use it to draw datapoints with dimensions defined in (figure-points)ยฒ (rather than actual physical dimensions)
python m = Maps() m.add_feature.preset.coastline() m.set_data([1, 2, 3], [-45, 20, 52], [-10, 20, 30]) m.set_shape.scatter_points(size=[200, 50, 500], marker="*") m.plot_map(cmap="tab10")
๐ฑ The shape-radius can now be defined for each datapoint individually!
- The
radiusargument of the shapesellipses,rectanglesandgeod_circlesnow properly broadcasts multiple values (e.g. you can assign an individual radius for each datapoint)python m = Maps() m.add_feature.preset.coastline() m.set_data([1, 2, 3], [-45, 20, 52], [-10, 20, 30]) m.set_shape.ellipses(radius=[1, 2, 3], radius_crs=4326) m.plot_map()
๐จ fixes
- fix parsing
n=Noneas shape-argument in the companion-widget - allow using the companion-widget with matplotlibs
"QtAgg"backend - fix performance issues with
m.get_crs - fix using
m.BM.blit_artistif the renderer is not yet cached - make evaluation of scalebar background patch size more robust
- ensure that scalebar is correctly updated if properties change
- switch to mambaforge to avoid installation-issues in github-actions
- lazily initialize pick-search tree only if a pick callback is attached
(provides a nice speedup for large datasets if no pick callbacks are assigned) - allow passing None to
m._decode_values - fix picking GeoDataFrames if no value-column was assigned (e.g. when using
m.add_gdf(column=None)) - remove obsolete dependencies and unused requirements.txt from the docs
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v5.3
A minor release with a lot of bugfixes and some nice improvements
โ Changes
Classifications of NaturalEarth features into scale-categories have been depreciated to simplify the interface.
(the old syntax is still functional but will be removed in future releases)
- m.add_feature.cultural_10m.urban_areas() $\rightarrow$ m.add_feature.cultural.urban_areas(scale=10)
- m.add_feature.physical_50m.coastline() $\rightarrow$ m.add_feature.physical.coastline(scale=50)
- m.add_feature.physical_110m.coastline() $\rightarrow$ m.add_feature.physical.coastline(scale=110)
๐ณ New
- using
m.plot_map(vmin=..., vmax=...)now respects the encoding of the data (if applicable) (e.g. values are provided as actual data values and internally converted to respect the data-encoding) - โ๏ธ drawing-capabilities have been re-worked to get rid of performance issues.
- ๐งญ The compass (or North-arrow) implementation has been re-worked
- The last known valid angle is used if compass is placed at a position where the angle could not be determined
- Use
c.set_ignore_invalid_angles(True)to ignore warnings if angle could not be determined - It is now possible to add a compass to a specific layer with
m.add_compass(layer=...) - If you pick the compass with the mouse, it can be resized by simultaneously turning the mouse-wheel
- The interface for ๐ต NaturalEarth features has been improved and simplified
- Features are now only grouped by category and the scale is provided as argument
m.add_feature.physical_10m.coastline$\rightarrow$m.add_feature.physcial.coastline(scale=10) - If the provided scale is not available, the next available scale is used!
- By default, all features determine the appropriate scale automatically and are added via cartopy's feature-interface.
- To get a
geopandas.GeoDataFramecontaining all geometries and metadata of a feature, usem.add_feature.physcial.coastline.get_gdf(scale=10)
- Features are now only grouped by category and the scale is provided as argument
Maps-objects can now be used as context-managers to free memory when the object is no longer needed. (particularly useful to render video-frames etc.)
python
# Maps-objects can be used as context-managers to free memory after usage
with Maps(...) as m:
...
# this also works for new layers on existing maps!
m = Maps()
with m.new_layer("my_layer") as m2:
...
## minor (non-breaking) changes
- annotations now use the picked color as edgecolor by default. (use m.cb.click.attach.annotate(bbox=dict(ec="k")) to get the initial behaviour, e.g. a black edgecolor)
- if a picker is used with m.add_gdf, the picked value is obtained from the column assigned via column=... by default. You can override this by using val_key=...
๐จ Fixes
- Fix dragging the companion-widget on Linux
- Avoid re-drawing on savefig if dpi settings did not change
- Improve cleanup methods
- Fix activating the Layout-manager if no artists are present
- Fix finishing draw-events if multiple drawers are present
- Fix performance issues with the drawer
- Avoid updating the figure on move-events without move callbacks
- Don't use defaultdicts for callback-containers
- Fix setting vmin and vmax with encoded data
- Fix caching of wms-layers in the companion-widget
- Avoid using defaultdicts
- Indicate if the compass rotation-angle is invalid
- Fix "cartopy" based GeoDataFrame reprojections
- Fix clearing outdated cached layers
- Avoid setting map-extent when adding markers
- Fix setting the clip-path for WebMap services on non-rectangular axes
- Use preset-styles in Companion-widget when adding preset-features
- fix lazy import of mapclassify
- fix re-positioning of webmap legends
- fix fetching values from geo-data-frames
- Python
Published by raphaelquast about 3 years ago
eomaps - EOmaps v5.2.1
A quick bugfix release for v5.2 to address issues with the companion-widget.
โ Make sure to check the updates for EOmaps v5.2 as well โ
๐ณ New
AustriaWebMap services are now accessible via the companion-widget
๐จ Fixes
- fix populating WebMap layer sub-menus in the companion-widget
- use a file-cache for WebMap layer names
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v5.2
A new minor releases with a lot of bugfixes and some awesome usability upgrades.
๐ณ New
Some internals of EOmaps have been re-structured to make it easier to add Maps-objects to existing matplotlib-figures!
Check the docs for more details: ๐ฑ Adding Maps to existing figures
python
f = plt.figure()
ax = f.add_subplot(211)
m = Maps(f=f, ax=212)
๐ฆ๏ธ Changes
๐ง General
When using
m.savefig(dpi=...)with the plot-shapes"shade_points"or"shade_raster"the shading-pipeline is now automatically adjusted to reflect the dpi of the saved figure (e.g. exporting higher dpi figures will also result in more detailed shading of the data).The ๐งฐ Companion-Widget has some new functionalities! (e.g. basic click/pick callbacks)
๐ง Syntax
Maps(gs_ax=...)has been re-named toMaps(ax=...)- โ Usage of the
m.figure.<...>accessor is depreciated!- Objects are now directly accessible via
m.f,m.ax,m.collandm.colorbar.ax_cbm.colorbar.ax_cb_plot
- Objects are now directly accessible via
๐ง Updates for keypress callbacks
keypresscallbacks are now triggered irrespective of the mouse-position (as long as the figure is active)- It is now also possible to create callbacks that trigger on any key by using
key=None. (the actually used key is passed to the callback via thekeykwarg)
๐ง Updates for layer sliders
- There's a new function
slider.set_layers()to updates the layers targeted by an existing slider - The slider-label now shows the currently visible layer-name in red if the active layer is not targeted by the slider
๐ง Updates for logos
- It is now possible to fix the logo-position relative to the map with
m.add_logo(fix_position=True)(the default is False so that logos can be re-positioned with the layout-editor!) - Checkout the new ๐ฝ logos section in the docs for more details!
๐จ Fixes
- fix issues when adding Maps-objects to existing figures
- fix issues when setting the map-extent to the data-extent
- speed up opening datasets with the companion widget (avoid scaling to retrieve info)
- allow adding MapsGrid objects to existing figures
- make "switch_layer" keypress callbacks accept only strings as layer-names
- update github actions to address depreciation warnings
- fix registering of transparent colormaps
- fix issues with boundary-pixels for "raster" shape
- fix using layer-names that contain double-underscores
- make sure the figure is closed if Maps is used as context-manager
- fix handling of long layer-names in companion-widget
- assign n for shapes based on dataset-size (if not specified explicitly)
- remove cached background layers of deleted layers
- adjust shading pipeline on figure resize
- adjust shading pipeline on m.savefig if dpi is changed
- fix re-fetching of xyz webmap services if axis size changed
- fix issues when adding new webmap layers via the companion widget
- avoid keeping companion-widget "always-on-top"
- fix logos reset position at next draw event
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v5.1
A first minor release for EOmaps v5.x with a lot of bugfixes, some improvements for speed and memory-management and new functionalities for the colorbar!
Make sure to check the new features introduced in EOmaps v5.0 as well!
๐ณ New
- new WebMap service:
m.add_wms.DLR_basemaps - improved speed and memory-management for very large datasets
๐ Updates for the colorbar
New convenience function m.colorbar.set_bin_labels() to simplify labeling individual bins of the colorbar with custom names.
Check the ๐ documentation for more details!
- ... ordinary colorbar (for classified data):

- ... the colorbar after using
m.colorbar.set_bin_labels()to set custom labels at the center of the specified bins

๐จ Fixes
- allow using (equal-length) 1D datasets for
m.set_shape.raster - fix close button callback for companion-widget popups
- fix utility widgets for multiple maps in one figure
- fix layer assignment for WebMap legends
- fix providing custom colorbar ticks for classified data
- fix issues with colorbar tick formatter
- avoid memory-intense index-creations for very large datasets
- avoid re-shaping for very large 2D datasets with 1D coordinates
- add some basic unittests for plotting from files
- fix colormap usage for classified datasets
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v5.0
A new major release that brings a lot of very nice features and updates ๐ฅณ
โ (possibly) breaking changes to v4.x โ
New layer-name convention:
All layer-names are now parsed as
string! (any non-string object passed as layer-name will be converted to string and a warning is shown)The
"|"character is used as a separator for multi-layers (see new โง Multi Layers feature below) (a layer-name such as"first|second"now represents the combined artists for the layers"first"and"second")
Changes for the colorbar
The implementation of the colorbar has been re-worked and several changes have been introduced:
- Colorbars are now accessible via
m.colorbar- Some arguments of
m.add_colorbar(...)have changed! Check the docstring for details! - The individual colorbar-axes are accessible via
m.colorbar.ax_cbandm.colorbar.ax_cb_plot - To set the size of the colorbar, use
m.colorbar.set_position(...) - To remove a colorbar, use
m.colorbar.remove()
- Some arguments of
๐ณ New
๐งฐ Companion widget
Starting with v5.0, EOmaps provides an awesome companion-widget to speed up data-comparisons and analysis.
NOTE: Using the widget is only possible if you use matplotlibs
"PyQt5"backend!
- To open the widget, simply press
won the keyboard while the mouse-pointer is hoovering the map. - The
?button on the top left can be used to activate showing help-tooltips if you hoover over the controls explain their functionalities.

๐ Checkout the corresponding section in the docs for more details! ๐งฐ Companion Widget
โ๏ธ Draw shapes on the map
There is a new functionality to draw simple (geo-coded) shapes on the map!

๐ Checkout the corresponding section in the docs for more details! โ๏ธ Draw shapes on the map
โง Multi Layers
It is now possible to create "multi-layers" which inherit their artists from existing layers.
The layer-name hereby consists of existing layer-names separated by "|".
To show the layers "first" and "second" at the same time, use:
python
m.show_layer("first|second")
- If you view a multi-layer, ALL artists from the constituting layers will be shown!
- E.g.:
"first|second|third"will show all artists of the layers"first","second"and"third"
- E.g.:
- The "vertical stacking order" for plotting is still exclusively determined by the
zorderproperty of the artists!- (artists at the same zorder are ordered with respect to the creation-time)
- It is possible (however rarely useful) to create a
Mapsobject representing multi-layers- Its artists will then only be shown if all constituting layers are visible
๐ Checkout the corresponding section in the docs for more details! ๐ Basics/Layers
๐๏ธ Updates for the Layout Editor
- Select (and edit) multiple axes by holding
shiftwhile clicking on the axes - Scaling the axes-size (with the scroll-wheel or the
+/-buttons) now preserves the center of the axis - If you hold down
controlwhile a colorbar is selected, the scroll wheel (or the+/-buttons) will adjust the relative size between the colorbar and the histogram - If you hold down
h(orv) the scroll-wheel adjusts only the horizontal (or vertical) size of the axes
๐ Checkout the corresponding section in the docs for more details! ๐๏ธ Layout Editor
๐บ๏ธ Set map-extent via OpenStreetMap Nominatim query
- There is now a method to set the extent of the map via a OSM query.
python m = Maps() m.set_extent_to_location("Austria") m.add_wms.OpenStreetMap.add_layer.default()## ๐ท Snapshots for JupyterNotebooks - The new
m.shapshot()functionality allows you to plot static snapshots of a map in Jupyter Notebooks (or in the IPython console) irrespective of the used backend.
๐ Updates for peek-layer callbacks:
- It is now possible to use transparency when peeking on a layer!
m.cb.click.attach.peek_layer(layer="some layer", alpha=.5) - There's a new option
how="full"to overlay another layer on the whole axis - The size of the square used for peeking (e.g.
how=0.5) is now always with respect to the smallest axis-dimension
... additional new features ...
- Equi7Grid projections can now be accessed via explicit names (e.g.:
Equi7_EU,Equi7_AF...) - Any colormap created by EOmaps during runtime is now always registered as a matplotlib colormap
- It is now possible to add logos to specific layers by using:
m.add_logo(layer=...) - ๐ฐ๏ธ New WebMap services
m.add_wms.OpenStreetMap.OSM_wmsm.add_wms.OpenStreetMap.OSM_landuse
Dynamic artists are now layer-sensitive!
- annotations and markers can now be added to specific layers:
m.add_annotation(layer=...)andm.add_marker(layer=...) - To add dynamic artists on specific layers, simply use
m.BM.add_artist(<artist>, layer=...)(to make the artist visible on all layers, simply uselayer="all")
๐ฆ๏ธ (non-breaking) Changes
- obsolete arguments
radiusandradius_crshave been removed fromm.set_shape.raster() - the default radius for
m.set_shape.geod_circleshas been set to 1km
๐จ Fixes
- fix default style kwarg for wms layers
- remove obsolete shape arguments
- fix custom args for feature presets
- fix onlayer_change actions
- fix fetching wmts services
- fix passing kwargs to wms and wmts services added to the active layer
- fix updating background layers on add/remove of artists
- fix handling of encoded NetCDF data
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.4.3
Just a hotfix release
๐จ fixes
- fix
ImportErrorforTriMeshwhen usingmatpltolib >= 3.6
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.4.2
Another bugfix release.
๐ณ New
- Make sure to also have a look at the new features added in EOmaps v4.4!
- There is now an option to draw a an "outline" on top of the colorbar-histogram with:
m.add_colorbar(show_outline=True)(for a black outline with linewidth 1)m.add_colorbar(show_outline=dict(color="b", linewidth=2))(for a custom outline)

๐จ Fixes
- fix using
m.cb.pickcallbacks with datasets assigned to the"all"layer - raise error if undefined objects are passed to NetCDF and GeoTIFF readers
- fix using the LayoutEditor to move colorbars with "arrow-keys"
- fix default styles must be provided as list for wms and wmts services!
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.4.1
A quick bugfix release
๐จ Fixes
- fix providing kwargs to WebMap services (time, styles etc.)
EOmaps v4.4
A release that introduces 2 new functionalities: m.add_line, m.cb.move and the ability to use keypress-modifiers for callbacks!
๐ณ New
๐ฒ A new method to quickly draw paths on a map!
- โญ
m.add_line(): connect points via geodesic (or straight) lines!- specify number of intermediate points per line-segment
- (alternatively) specify distance between intermediate points for each line-segment
- checkout the new ๐ฒ example and the corresponding section in the ๐ documentation!
- specify number of intermediate points per line-segment

๐ธ New features for callbacks!
๐พ Keypress-modifiers
It is now possible to assign multiple callbacks to the same mouse-button and use keyboard-shortcuts to switch between the assigned callbacks! (e.g. the callback will only be executed if the corresponding button is pressed on the keyboard)
- ๐ simply provide the modifier of choice with the
modifier=...argument!- e.g.:
m.cb.click.attach.annotate(modifier="a"): this callback will only be executed if the"a"key is pressed
- e.g.:
๐ You can make modifiers "sticky" (e.g. to keep them activated after the button is released) by using:
m.cb.click.set_sticky_modifiers("a", "b", "c")- "sticky modifiers" are assigned separately for
click,pickandmovecallbacks - to release a "sticky modifier" press
ctrl + <modifier key>orescape
checkout the corresponding section in the ๐ documentation!
โญ move callbacks
There's now an explicit container to attach callbacks that are executed on mouse movement if NO button is clicked
- NOTE: use
m.cb.click.attach...to execute callbacks on mouse-movement if a button is clicked!- and set
on_motion=Falseto avoid executing the click-callback on mouse-movements
- and set
python
m = Maps()
m.add_feature.preset.coastline()
m.cb.move.attach.annotate()
m.cb.move.attach.mark(modifier=1, radius=2, radius_crs=4326, fc="none", ec="r")
๐ฆ๏ธ Changes
โ
m.cb.click.attach.mark()now usespermanent=Falseby default๐๏ธ NaturalEarth features have been updated
click for a list of new features
```python { 10m_cultural: {'admin_0_countries_iso', 'parks_and_protected_lands', 'admin_0_countries_tlc'} 10m_physical: {'bathymetry_G_4000', 'graticules_20', 'bathymetry_K_200', 'bathymetry_E_6000', 'graticules_1', 'bathymetry_A_10000', 'bathymetry_F_5000', 'bathymetry_C_8000', 'bathymetry_B_9000', 'bathymetry_L_0', 'bathymetry_H_3000', 'bathymetry_I_2000', 'wgs84_bounding_box', 'bathymetry_J_1000', 'graticules_5', 'bathymetry_D_7000', 'graticules_30', 'graticules_10', 'graticules_15'} 110m_physical: {'graticules_15', 'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10'} 50m_physical: {'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10', 'graticules_15'} } ```
๐จ Fixes
- fix sharing boundary and inset-marker properties for inset-maps
- fix issues with invalid clipping shapes
- fix issues with geometries that cannot be exploded
- make sure temporary artists are cleared prior to executing callbacks
- fix issues with dynamically updated legends and temporary artists
- fix error when trying to update colorbar-arrows without a colorbar
- avoid re-fetching WebMap tiles if extent remains the same
- fix unnecessary re-draws of artists after overlay-actions
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.4
A release that introduces 2 new functionalities: m.add_line, m.cb.move and the ability to use keypress-modifiers for callbacks!
๐ณ New
๐ฒ A new method to quickly draw paths on a map!
- โญ
m.add_line(): connect points via geodesic (or straight) lines!- specify number of intermediate points per line-segment
- (alternatively) specify distance between intermediate points for each line-segment
- checkout the new ๐ฒ example and the corresponding section in the ๐ documentation!
- specify number of intermediate points per line-segment

๐ธ New features for callbacks!
๐พ Keypress-modifiers
It is now possible to assign multiple callbacks to the same mouse-button and use keyboard-shortcuts to switch between the assigned callbacks! (e.g. the callback will only be executed if the corresponding button is pressed on the keyboard)
- ๐ simply provide the modifier of choice with the
modifier=...argument!- e.g.:
m.cb.click.attach.annotate(modifier="a"): this callback will only be executed if the"a"key is pressed
- e.g.:
๐ You can make modifiers "sticky" (e.g. to keep them activated after the button is released) by using:
m.cb.click.set_sticky_modifiers("a", "b", "c")- "sticky modifiers" are assigned separately for
click,pickandmovecallbacks - to release a "sticky modifier" press
ctrl + <modifier key>orescape
checkout the corresponding section in the ๐ documentation!
โญ move callbacks
There's now an explicit container to attach callbacks that are executed on mouse movement if NO button is clicked
- NOTE: use
m.cb.click.attach...to execute callbacks on mouse-movement if a button is clicked!- and set
on_motion=Falseto avoid executing the click-callback on mouse-movements
- and set
python
m = Maps()
m.add_feature.preset.coastline()
m.cb.move.attach.annotate()
m.cb.move.attach.mark(modifier=1, radius=2, radius_crs=4326, fc="none", ec="r")
๐ฆ๏ธ Changes
โ
m.cb.click.attach.mark()now usespermanent=Falseby default๐๏ธ NaturalEarth features have been updated
click for a list of new features
```python { 10m_cultural: {'admin_0_countries_iso', 'parks_and_protected_lands', 'admin_0_countries_tlc'} 10m_physical: {'bathymetry_G_4000', 'graticules_20', 'bathymetry_K_200', 'bathymetry_E_6000', 'graticules_1', 'bathymetry_A_10000', 'bathymetry_F_5000', 'bathymetry_C_8000', 'bathymetry_B_9000', 'bathymetry_L_0', 'bathymetry_H_3000', 'bathymetry_I_2000', 'wgs84_bounding_box', 'bathymetry_J_1000', 'graticules_5', 'bathymetry_D_7000', 'graticules_30', 'graticules_10', 'graticules_15'} 110m_physical: {'graticules_15', 'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10'} 50m_physical: {'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10', 'graticules_15'} } ```
๐จ Fixes
- fix sharing boundary and inset-marker properties for inset-maps
- fix issues with invalid clipping shapes
- fix issues with geometries that cannot be exploded
- make sure temporary artists are cleared prior to executing callbacks
- fix issues with dynamically updated legends and temporary artists
- fix error when trying to update colorbar-arrows without a colorbar
- avoid re-fetching WebMap tiles if extent remains the same
- fix unnecessary re-draws of artists after overlay-actions
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.3
A new release that brings some nice updates and an awesome new Layout-Editor!
๐ฆ๏ธ Changes
- ๐ utility-widgets now auto-update themselves if new layers are added to the map!
- to show only a subset of the available layers, use
m.util.layer_selector(layers=["layer1", ...])
- to show only a subset of the available layers, use
- ๐ coastlines are no longer added by default when creating new layers from files (e.g. NetCDF, GeoTIFF etc.)
- (use
coastlines=Trueor explicitly callm.add_feature.preset.coastline()to add coastlines!)
- (use
- ๐
m.add_gdfnow allows using apathto a file that can be read withgeopandas.read_fileinstead of providing thegeopandas.GeoDataFramedirectly - โ keyword-arguments for
m.new_inset_maphave changed!edgecolorandlinewidthare depreciated and will be removed in next major versions!- to set the properties of the boundary-polygon, use
m.new_inset_map(boundary=dict(fc="r", lw=1)instead
- โ
m.cb.dynamichas been removed ## ๐ณ New
โญ New accessor for classification schemes
The new classification-schemes accessor ๐ m.set_classify provides autocompletion and proper docstrings!
(you can use it just as you would use m.set_classify_specs)
Just select the scheme you want to use and call it with the relevant parameters: ```python m = Maps() m.setdata(...) m.setclassify.Quantiles(k=5) m.plot_map(...)
alternative (old) way to set the classification:
m.setclassifyspecs(scheme="Quantiles", k=5)
```
โญ There's a new ๐๏ธ Layout Editor to quickly re-arrange the subplots of a figure!

The Layout Editor can be used to quickly re-arrange the position of all axes in the figure.
(works for maps, colorbars, inset-maps, ordinary matplotlib plots etc.)
- You can save and re-apply a layout with:
- ๐m.get_layout(): get the current layout (or dump the layout as a json-file)
- ๐m.apply_layout(): apply a given layout (or load and apply the layout from a json-file)
- ๐m.edit_layout(filepath=...): enter LayoutEditor and (optionally) save layout as a json-file on exit
To quickly enter/exit Layout Editor, simply use the assigned keyboard-shortcuts:
- press ALT + L to enter the LayoutEditor mode
- press ALT + L again or escape to exit the LayoutEditor
Have a look at the new section in the ๐ documentation for more details!
๐จ Fixes
- fix recognizing the parent layer when initializing utility-widgets from the parent Maps object
- fix layer-selectors should indicate no active layer if the active layer is not part of the widget
- updates for inset-maps
- add fix for reprojection issues with certain projections
- fix reprojection sometimes masks certain shapes
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.2.3
A minor bugfix release.
๐ณ new
there is now an option to completely disable extension arrows when adding a colorbar (e.g. with
m.add_colorbar(add_extend_arrows=False))it is now possible to set the "layer" of an inset-map on initialization (e.g.
m.new_inset_map(layer="adsf")(by default, the"all"layer is used for inset-maps!)
๐จ fixes
- fix using alpha-transparency with wms and wmts services (e.g.
m.add_wms.<service>.add_layer.<layer>(alpha=0.5)) - fix colors of histogram-bins if the bins extend over more than one colorbar-split
- fix position of colorbar extension-arrows after using
m.subplots_adjust - fix appearance of "vertical" colorbar extension arrows
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.2.2
A minor bugfix release.
๐ณ new
- To address issues when plotting 2D raster-data with unsorted coordinates, there is now an option
to force sorting the data by coordinates prior to plotting with
m.plot_map(assume_sorted=False)- only works if coordinates are provided as 1D arrays and the data is provided as a 2D array
- sorting is only relevant for
rasterandshade_rastershapes (other shapes don't require sorting) - by default no sorting is performed! ## ๐ฆ๏ธ changes
- The pick-radius used to identify clicked pixels can now be set in 2 ways
m.plot_map(pick_distance=...):- if a number is provided, it is used as a multiplier for the dataset-radius
e.g.
pick-radius = pick_distance * radius_in_plot_crs) - if a string is provided, it is directly used as the pick-radius in units of the plotcrs e.g. `pick-radius = float(pickdistance)` ## ๐จ fixes
- if a number is provided, it is used as a multiplier for the dataset-radius
e.g.
- โ fix using "pick" callbacks with
m.set_shape.raster()and 2D input-coordinates - make radius-estimation more robust (fallback to nearest-neighbor if 2D estimation fails)
- fallback to
np.inffor pick_distance if radius estimation fails - fix delaunay_triangulation does not need to estimate the radius if masked=False
- fix issues with registering pandas
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.2.1
A bugfix release that greatly reduces import time!
๐ฆ๏ธ changes
- ๐ greatly reduced "plain" import-time
- "heavy" modules such as 'datashader', 'xarray' etc. are now lazily imported only when needed
- this reduces runtime of
from eomaps import Mapsin a fresh terminal from ~5sec to ~1sec
- ๐
m.add_marker(...)now supports the "layer" kwarg - ๐
m.show()now automatically callsplt.show()to actually draw the figure if matplotlib is in non-interactive mode
๐จ fixes
- legends for WebMap services are now updated based on the visible layer
m.add_markernow only draws newly added markers (instead of updating all dynamic artists)- avoid using
pkg_resourcesto identify package-version (use explicit_version.pyinstead)
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.2
๐ณ New
- โญ there's a new function
m.fetch_layers()- ...to fetch (and cache) all layers of a map so that switching layers (with buttons & sliders) is fast
- a associated callback
m.cb.keypress.attach.fetch_layers()is also available
- โญ there's a new pre-defined WebMap service for the "Copernicus Atmosphere Monitoring Service"
- accessible via
m.add_wms.CAMS(see ECMWF CAMS for details )
- accessible via
- ๐ docs on WebMap services have been updated with examples on how to
- use custom service-urls
- pass arguments (time, style etc.) to the service
๐ฆ๏ธ Changes
- ๐
m.set_shape.raster()can now be used with 1Dpandas.DataFramesas well! (DataFrames will be re-structured internally based on unique values of the coordinate-columns) - ๐
.add_legend()for WebMap services can now properly recognizes the used map-stylem.add_wms.<SERVICE>.....add_layer.<LAYER>.add_legend()
๐จ Fixes
- โ fix pixel centers shifted by half pixel-size with
m.set_shape.raster() - speedup
m.set_shape.raster()(remove unnecessary calculations) - fix identification of picked ID if
pandas.Seriesobjects are used as coordinates - allow setting shade-aggregator via strings (e.g. "mean", "min", "max" etc.) for
m.shade_points - fix colorbar kwargs assertions should intercept before axes are created
- add fix for QuadMesh performance issues for older matplotlib versions (e.g. < v3.5.2)
- fix issues with updating WebMaps when using
m.util.layer_slider() - fix re-using WebMap objects with different kwargs
- fix fetching WebMap legends for different styles
- Python
Published by raphaelquast over 3 years ago
eomaps - EOmaps v4.1.1
A bugfix release that brings some nice updates for the colorbar.
๐ updates for the colorbar
- โญ Colorbars now have proper extension-arrows to indicate values outside the colorbar-range
- โญ
m.add_colorbar()supports some new arguments to further customize the colorbar:histogram_size: set the relative height of the histogram in relation to the height of the colorbar (use 0 for a plain colorbar and 999 for a plain histogram)-
extend_frac: set the relative size of the extension-arrows add_extend_arrows: toggle drawing extension-arrows (by default arrows are only drawn if there are values outside the [vmin,vmax] range)
๐ฆ๏ธ changes
- setting vmin/vmax no longer clips data-values (e.g. callbacks now always retrieve actual data-values independent of vmin/vmax)
๐จ fixes
- fix setting zorder for WebMap layers
- make sure the default zorder for
m.plot_map()is 1 for all shapes - fix test-action issues (use mamba + updated version of conda-incubator)
- fix adding static annotations by dataset-ID with
m.add_annotation() - fix some issues with draggable axes
- fix sorting of callback-execution order
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v4.1
A minor release that brings an awesome new feature and some bugfixes.
๐ฌ New feature: Inset-maps!
- Quickly create zoomed-in views on selected regions of a map with
m.new_inset_map()
Checkout the docs for more details: ๐ฌ Inset-maps - zoom-in on interesting areas

๐จ fixes
- allow using a scalar radius for calculating ellipse and rectangle points
- make sure the blit-manager always uses the correct figure object
- make histogram plot background visible (but set boundary color to none)
- fix wrong error-catching for layer-slider
- fix issues with colored histograms for discrete colormaps
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v4.0
A new major release that brings some nice new features, a lot of updates and some outstanding api-changes.
๐ฉ changes
โ There are breaking changes to EOmaps v3.x โ ๐ For a quick-guide on how to port existing scripts to v4.x see: โ๏ธ port script from v3.x to v4.x
[or click on the text below for details!]
๐ธ m.plot_specs and m.set_plot_specs(...) have been removed
- **"vmin", "vmax"** and **"cmap"** are now set when calling `m.plot_map(...)`
- **"density", "tick_precision", "histbins"** and **"label"** are now set when calling `m.add_colorbar(...)`
- **"cpos"** and **"cpos_radius"** are now set with `m.set_data_specs(...)`
๐ธ voroni_diagram is now correctly called voronoi_diagram
This just fixes the typo in the name.
```python
# --- OLD ---
m.set_shape.voroni_diagram()
# --- NEW ---
m.set_shape.voronoi_diagram()
```
๐ธ The data-specs xcoord and ycoord have been renamed to x and y
This change is optional and will only raise a depreciation warning for now...
The old naming-convention will however be removed in future releases so it's highly recommended to use the new (shorter and more intuitive๐) `x` and `y` variable names.
```python
# --- OLD ---
m.set_data(data=..., xcoord=..., ycoord=..., ...)
m.data_specs.xcoord
# --- NEW ---
m.set_data(data=..., x=..., y=..., ...)
m.data_specs.x
```
๐ธ Custom callback functions now have a slightly different call-signature
> This removes the contra-intuitive "binding" of functions to the `Maps`-objects and ensures that class-methods can be used as callbacks without unwanted side-effects. - The first argument is no longer identified automatically as the `Maps`-object! (if you need access to the underlying `Maps`-object, simply pass it as an argument!) ```python m = Maps() def cb(m, **kwargs): pos = kwargs["pos"] print("the Maps-object:", m) print("the click-position is", pos) m.cb.click.attach(cb, m=m) ```๐พ [click to show] how to get back the old behaviour
To get back the old behavior you have to "bind" the callback functions to the Maps-object, e.g: ```python m = Maps() def cb(self, **kwargs): ... m.cb.click.attach(cb.__get__(m)) ``` or simply pass the Maps-object as kwarg, e.g.: ```python m = Maps() def cb(self, **kwargs): ... m.cb.click.attach(cb self=m) ```๐ณ NEW
- โญ The Sentinel-2 cloudless WebMap service can now be used via
m.add_wms.s2_cloudless ๐ It is now possible to set "coordinate-only" datasets!
- This is particularly useful if you want to manually assign colors
python m.set_data(None, [1,2,3], [1,2,3]) m.plot_map(fc=["r", "g", "b"])### ๐ there's a new plot shape!m.set_shape.rasterA fast way to plot 2D datasets.[click to show] ๐ธ details
- This is particularly useful if you want to manually assign colors
it's quite similar to
plt.imshow(e.g. a QuadMesh is used to speed up plotting of 2D datasets)the differences to
shade_rasterare:- the whole dataset is always plotted (so for very very large datasets
shade_rasteris much faster!) - it supports manual color specifications (
shade_rasterdoes not)
- the whole dataset is always plotted (so for very very large datasets
the differences between
rectanglesandrasterare:rasterdoes not take the curvature of the edges into accountrasterdetermines the pixel-size based on neighboring pixels,rectanglesallows arbitrary pixel-dimensions
๐ there have been some major improvements for manual color specifications!
Checkout the ๐ Customizing the plot section of the docs for details!
Colors can now be set manually with all shapes (except shade shapes) using
m.plot_map(fc=[...]) (or facecolor= or color=)!
[click to show] ๐ธ Possible ways to specify colors.
- a single value (RGB/RGBA tuple, a matplotlib color-name or a hex-color) - a tuple of 3/4 arrays in the same shape as the coordinates (identified as RGB/RGBA values) - a list/array of RGB tuples, e.g. `[(1, 0, 0.25), (0.3, 0.4, 0.5), ....]` - a list/array of RGBA tuples, e.g.: `[(1, 0, 0.25, 0.15), (0.3, 0.4, 0.5, 0.25), ....]` - a list/array of matplotlib named-colors, e.g. `["r", "olive", "darkblue", ...]` - a list/array of hex-colors, e.g.: `['#ff0040', '#4c6680', ...]` For example: ```python m = Maps() m.set_data(None, [1,2,3,4,5], [1,2,3,4,5]) # use named colors m.plot_map(ec="k", fc=["r", "olive", "darkblue", "orange", "indigo"]) # or RGB tuples m.plot_map(color=[(1, 0, 0), (.4, .5, .6), (.2, .7, .2), (.45, .12, .98), (.94, .45, .56)]) # or a single color for all datapoints m.plot_map(facecolor="g", edgecolor="r") # or use 3 individual arrays that should be identified as RGB values m.plot_map(fc=([0.1,0.2,0.3,0.4,0.5], [0.1,0.2,0.3,0.4,0.5], [0.1,0.2,0.3,0.4,0.5]) ```โ๏ธ minor (non-breaking) changes
- the default
radius_crsfor themarkcallback is now determined based on theradius_crsassigned in the plot-shape ... this definition allows usingm.cb.pick.attach.mark(buffer=3)directly without having to worry about the crs (previouslyin, e.g. the input-crs was used by default) - the background patch of the compass is now by default set to
None
๐จ fixes
- fix issues with manual color specifications for various plot-shapes
(e.g. when providing explicit color-arrays via
m.plot_map(color=[...])) - fix issues with shapes close to crs-bounds
- support estimation of different x- and y- radius for 2D datasets
- warn if datapoints are masked or if datapoints are outside the CRS-bounds
- cache shape transformers (so they are not re-initialized all the time)
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.5
๐ updates
โญ EOmaps now properly handles encoded datasets!
- This saves a lot of memory and provides a huge speedup when plotting integer-encoded datasets!
- If you plot GeoTIFFs or NetCDFs with the functions
Maps.read_data,Maps.from_fileorm.new_layer_from_file, the data is now kept in the encoded dtype and conversions are only performed "on demand" (e.g. when adding colorbars or in pick-callbacks)- (if you really want to immediately convert all data-values, use
mask_and_scale=True)
- (if you really want to immediately convert all data-values, use
- The encoding information can be get/set via
m.data_specs.encodingorm.set_data_specs(encoding=...)
```python m = Maps() m.setdata(data=[1,2,3], xcoord=[1,2,3], ycoord=[1,2,3], encoding=dict(scalefactor=0.01, add_offset=1))
the "decoding" of the values is evaluated via "addoffset" + "scalefactor" * x
e.g.: in this case the actual data-values are : [1.01, 1.02, 1.03]
```
๐ณ New
โญ The colorbar can now be used as a dynamic shade indicator with
m.add_colorbar(dynamic_shade_indicator=True)- it is dynamically updated based on the distribution of shaded pixels in the current field of view.
(only possible with
m.set_shape.shade_raster()orm.set_shape.shade_points())

- it is dynamically updated based on the distribution of shaded pixels in the current field of view.
(only possible with
โญ There is now a way to use
pickcallbacks on datasets without plotting the data first.- To make a "pick-only" dataset, use
m.set_data(...)to assign the dataset and then callm.make_dataset_pickable()to initialize all required information to make the dataset pickable. - This is useful if you want to indicate certain informations "on click" without plotting the data
- To make a "pick-only" dataset, use
โ๏ธ changes
- The default plot-shape is now determined based on the size of the assigned dataset.
- <500k datapoints:
m.set_shape.ellipses() - >500k datapoints:
m.set_shape.shade_raster()
- <500k datapoints:
Maps.from_fileandm.new_layer_from_filenow no longer attempt multiple shapes for plotting in case the first attempt fails (the default shape is used if no explicit shape-name is provided)
๐จ fixes
- Fix typo in
m.add_colorbar - Fix some typos in the docs
- Fix unnecessary dtype conversions in "shaderaster" and "shadepoints"
- Avoid dtype conversions when reading NetCDFs and GeoTIFFs
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.4.1
[hotfix release to fix issues with multiple maps in one figure]
... EOmaps v3.4
A release that brings a lot of updates on speed and memory management and some very nice (but possibly breaking) changes compared previous versions of EOmaps.
โ IMPORTANT CHANGES โ
โญ Starting with EOmaps v3.4 all callbacks and colorbars are layer-specific !
This means that callbacks only trigger if the layer of the associated Maps object is visible!
(...and colorbars are only visible if the associated layer is visible)
- To trigger callbacks or add features & datasets independent of the visible layer, use
m.all.cb. ...
(or attach them to aMapsobject on the"all"layer) Note:
pickcallbacks now always react to the visible collection! (except for the ones on the"all"layer)```python m = Maps(layer=0) m.cb.click.attach.annotate() # this callback is ONLY executed if the layer 0 is visible
m1 = m.new_layer(layer=1) m1.cb.click.attach.mark() # this callback is ONLY executed if the layer 1 is visible
m.all.cb.click.attach.annotate() # this callback is executed independent of the visible layer! ```
๐ removed arguments
- the obsolete
"orientation"argument has been removed fromMaps(...)(it set the colorbar-orientation which is now specified viam.add_colorbar(orientation=...)---
๐ณ NEW
- โญ
m.show()can be used to make the associated layer visible. (a shortcut form.show_layer(m.layer) - โญ
m.BM.on_layer(...)can be used to trigger functions if the visible layer changes. - ๐ WebMap layers are now lazily evaluated and only added to the map if the corresponding layer is actually visible.
- ๐ [experimental feature] memory-mapping can now be used to avoid using up a lot of ram for very large datasets
- Intermediate datasets are stored as memory-mapped files in a temp-folder on disk to release memory
- By default memory-mapping is disabled! (to activate it, use:
m.plot_map(memmap=False))
๐ฆ๏ธ changes
- Adding data from files (e.g.
m.from_fileorm.new_layer_from_file) now always uses"shade_raster"as the default plot-shape (since EOmaps v3.3.2, raster-shading works perfectly fine with re-projected rasters as well) - If a file with >2M data-points is plotted, only "shade" shapes are attempted by default to avoid overloading memory.
- only one colorbar is allowed for
Mapsobjects (use multiple objects for multiple colorbars)
๐จ fixes
- Fix several issues with memory-leaks and garbage-collection of objects
- Fix autoscalefraction not recognized when using
preset="bw"in `m.addscalebar` - Maps objects are now properly garbage-collected
- Fix auto-scaling of scalebars for very small scales
Maps.from_filenow properly handlespathlib.Pathobjects- Fix utility widget start-layer should be the currently visible layer
- Fix pick-events should only identify points on visible layers
- Fix
m.add_colorbar(log=True)for horizontal colorbars - Fix colorbar limit autoscaling
- Fix logo size changes on zoom
- Remove obsolete
layerkwarg fromm.add_logo - Fix incorrect color-normalization for
shade_rasterorshade_pointsifvmin/vmaxoutside the data-range are used (thanks to @maxhollmann)
๐ฅ hotfix EOmaps v3.4.1
- fix issues with delayed WebMap services on multiple maps in one figure
- fix issues with
m.allfor multiple maps in one figure
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.4
A release that brings a lot of updates on speed and memory management and some very nice (but possibly breaking) changes compared previous versions of EOmaps.
โ IMPORTANT CHANGES โ
โญ Starting with EOmaps v3.4 all callbacks and colorbars are layer-specific !
This means that callbacks only trigger if the layer of the associated Maps object is visible!
(...and colorbars are only visible if the associated layer is visible)
- To trigger callbacks or add features & datasets independent of the visible layer, use
m.all.cb. ...
(or attach them to aMapsobject on the"all"layer) Note:
pickcallbacks now always react to the visible collection! (except for the ones on the"all"layer)```python m = Maps(layer=0) m.cb.click.attach.annotate() # this callback is ONLY executed if the layer 0 is visible
m1 = m.new_layer(layer=1) m1.cb.click.attach.mark() # this callback is ONLY executed if the layer 1 is visible
m.all.cb.click.attach.annotate() # this callback is executed independent of the visible layer! ```
๐ removed arguments
- the obsolete
"orientation"argument has been removed fromMaps(...)(it set the colorbar-orientation which is now specified viam.add_colorbar(orientation=...)---
๐ณ NEW
- โญ
m.show()can be used to make the associated layer visible. (a shortcut form.show_layer(m.layer) - โญ
m.BM.on_layer(...)can be used to trigger functions if the visible layer changes. - ๐ WebMap layers are now lazily evaluated and only added to the map if the corresponding layer is actually visible.
- ๐ [experimental feature] memory-mapping can now be used to avoid using up a lot of ram for very large datasets
- Intermediate datasets are stored as memory-mapped files in a temp-folder on disk to release memory
- By default memory-mapping is disabled! (to activate it, use:
m.plot_map(memmap=False))
๐ฆ๏ธ changes
- Adding data from files (e.g.
m.from_fileorm.new_layer_from_file) now always uses"shade_raster"as the default plot-shape (since EOmaps v3.3.2, raster-shading works perfectly fine with re-projected rasters as well) - If a file with >2M data-points is plotted, only "shade" shapes are attempted by default to avoid overloading memory.
- only one colorbar is allowed for
Mapsobjects (use multiple objects for multiple colorbars)
๐จ fixes
- Fix several issues with memory-leaks and garbage-collection of objects
- Fix autoscalefraction not recognized when using
preset="bw"in `m.addscalebar` - Maps objects are now properly garbage-collected
- Fix auto-scaling of scalebars for very small scales
Maps.from_filenow properly handlespathlib.Pathobjects- Fix utility widget start-layer should be the currently visible layer
- Fix pick-events should only identify points on visible layers
- Fix
m.add_colorbar(log=True)for horizontal colorbars - Fix colorbar limit autoscaling
- Fix logo size changes on zoom
- Remove obsolete
layerkwarg fromm.add_logo - Fix incorrect color-normalization for
shade_rasterorshade_pointsifvmin/vmaxoutside the data-range are used (thanks to @maxhollmann)
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.3.2
A minor bugfix release that brings some nice updates for raster-shading!
๐ณ NEW
- โญ Raster-shading with
m.set_shape.shade_raster()can now finally be used with re-projected datasets as well!- The previous limitation
plot_crs == data_crsis now gone for good ๐ฅณ
- The previous limitation
๐จ fixes
- fix issues for
m.util.layer_sliderwhen switching between xyz-WebMap layers if axis-extent changed - fix glitches of dynamic artists during pan/zoom
- fix image parsing in github-pages jekyll parser
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.3.1
A minor bugfix release (that also brings some miscellaneous convenience functions)
๐ณ NEW
(โญ: new feature, ๐: new functionality for existing feature)
- โญ there's a new function m.subplots_adjust() for Maps and MapsGrid objects to quickly set the margins of the plots as well as the horizontal and vertical spacing between subplots:
python
m = Maps()
m.subplots_adjust(left=0.2, right=0.8, top=0.9, bottom=0.1)
python
mg = MapsGrid()
mg.subplots_adjust(left=0.2, right=0.8, top=0.9, bottom=0.1, hspace=0.05, wspace=0.15)
(these are just shortcuts for m.figure.gridspec.update() + m.redraw())
- ๐ m.add_colorbar now has an additional kwarg log=True/False to make the y-axis of the histogram logarithmic.
- ๐ m.add_scalebar now provides style-presets via preset="<preset-name>"
- at the moment there's only 1 preset... more to come in future releases!
- "bw": a simple black-and-white style without a background
๐จ fixes
- fix
m.savefigwith different dpi-settings requres a re-draw - fix
m.plot_mapwithdynamic=Truedoes not require a update - incorporated some updates to ensure that layers are only re-drawn if necessary
- make sure cached backgrounds are always re-drawn if new artists are added
- fix annotation in example 9 (still used old syntax)
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.3
A release with some nice new features and a lot of usability updates and fixes. โ note that there is a breaking change compared to <v3.2 (only affecting the ambiguous "layer" kwarg of dynamic artists (see ๐ฆ๏ธ changes below for details) )
๐ณ NEW
(โญ: new feature, ๐: new functionalities for existing features)
- โญ There's a new pre-defined WebMap service: m.add_wms.GEBCO that provides nice underwater topography (https://www.gebco.net/)
- โญ Theres a new function m.redraw() that can be used to force a re-draw of the entire figure
- โญ shortcuts for mg.redraw and mg.util have been added to MapsGrid
- ๐ m.add_wms. ... <layer>.set_extent_to_bbox() now supports a new kwarg shrink which can be used to set the extent to a "shrinked" bbox (useful to avoid request-errors for tiles outside the bbox)
- ๐ m.add_colorbar can now be used to add individual colorbars for different plot-layers
(the colorbars will always reflect the currently displayed layer)
- ๐the peek_layer callback can now be used to either view one (or more) layers or to overlay one (or more) layers on top of the current background layer.
- ๐ some major improvements have been implemented for fetching WebTiles from xyz-TileServer links.
- m.add_wms.get_service now supports using custom wms, wmts, restAPI or xyz services
๐ฆ๏ธ changes
- the ambiguous (and misleading)
layerkwarg has finally been removed from dynamic artists. (note this "layer" was NOT referring to the actual plot-layer but to the stacking of dynamic artists!)layernow always refers to the background layer name and not to the stack-order of dynamic artists!- โ the plot-order of multiple artists on the same layer is now determined by matplotlib's
zorderproperty.- โ old:
m.cb.click.attach.mark(layer=5)โก๏ธ new:m.cb.click.attach.mark(zorder=5) - โ old:
m.cb.click.attach.annotate(layer=5)โก๏ธ new:m.cb.click.attach.annotate(zorder=5) - โ old:
m.BM.add_artist(art, layer=5)โก๏ธ new:m.BM.add_artist(art)+art.set_zorder(5)
- โ old:
- all examples have been updated accordingly
๐จ fixes
- fix _onrelease() missing 1 required positional argument
- fix issues with
nbaggandipymplbackends (e.g. jupyter notebooks) - fix
plt.showshould only be called if we're in an interactive backend! - fix some issues with the scalebar and colorbar
- re-work of
draggable_axes - fix maxzoom for stamen_watercolor layer
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.2
A release with some nice new features and a lot of fixes & improvements. ... Note: many parts of the ๐ documentation have been updated with small code-examples and images!
๐ณ New
- โญ
m.add_annotationandm.add_markernow support adding multiple objects in one go! - โญ raster-shading with datashader now supports 2D arrays for values and coordinates (e.g. curvilinear QuadMeshes)
- โญ there's a new function
m.show_layer(name)that provides a shortcut for switching the currently displayed layer - โญ layer-names can now be arbitrary strings! (e.g.
Maps(layer=...)orm.plot_map(layer=...))- โ The layer-name
"all", has a special meaning: all features on this layer will be visible in ALL other layers!
- โ The layer-name
โญ ๐ฆ Utility widgets !
EOmaps now has a slot for utility widgets that provides some nice tools to simplify common tasks.
- Utilities are accessible via m.util.<...>
At the moment, there are 2 utilities that simplify switching between layers:
- โญ m.util.layer_selector() : get a "legend-like" object with buttons that can be used to switch between layers
- โญ m.util.layer_slider() : get a slider that can be used to switch between layers
Checkout the ๐ฆ Utility widgets section in the docs and the updated example: ๐ฐ WebMap services and layer-switching
โญ๐ Updates for the scalebar
The scalebar has been re-worked for a much improved "out-of-the-box" usability.
- By default, the scalebar is now automatically re-scaled on pan/zoom events based on the current extent of the map.
- the new autoscale_fraction argument can be used to set the relative size of the (autoscaled) scalebar
- the new auto_position argument can be used to set the position targeted for automatic re-positioning on pan/zoom events.
- The background patch is now automatically scaled to enclose the labels.
- When dragging the scalebar with the mouse, it is now immediately released if you release the mouse-button.
python
m.add_scalebar() # get a scalebar that autoscales itself on pan/zoom events
m.add_scaleblar(scale=10000) # get a scalebar with a fixed segment-separation of 10km
๐ฆ๏ธ changes
- some changes to
m.new_layer:- It now supports the additional
layerkwarg - โ By default ONLY the "plot-shape" is now copied to the new layer.
- this avoids side-effects from unintentional copying of plot-specs (
vminvmaxetc.) - you can still copy plot-specs by using
m.new_layer(copy_plot_specs=True)
- It now supports the additional
Maps.from_fileandMaps.read_fileandm.new_layer_from_filenow support using already opened NetCDF and GeoTIFF files
โ๏ธ fixes
- fix treatment of colorbar orientation in
m.figure.set_colorbar_position - fix reprojection of wms-layers with a native crs specified as "EPSG:3857"
- fix sorting of layer-names
- avoid identification of pixel-ID if no pick-callback is attached
- fix label-axis should not respond to navigation events
- fix adding multiple markers in one go
- fallback to WSG84 boundary in
wms_layer.set_bbox_to_extent()
- Python
Published by raphaelquast almost 4 years ago
eomaps - EOmaps v3.1.4
a minor bugfix release that introduces a new (optional) kwarg for m.plot_map()
๐ณ New
- Checkout the new example! ๐งฎ Select 1D slices of 2D datasets (as suggested in #54)
- โญ There is a new (optional) kwarg
set_extentform.plot_map(set_extent=True)set_extent=True: set the plot-extent to the data extentset_extent=False: keep the plot-extent as it was before
๐จ fixes
- fix
m.new_layer()when parent layer usesshade_rasterorshade_points(fixes__call__() got an unexpected keyword argument 'glyph')- allow overriding the permanent kwarg in
m.add_annotationnm.add_annotation
- allow overriding the permanent kwarg in
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v3.1.3
... another bugfix release
๐ฆ๏ธ changes
- an AssertionError is now raised if data- and coordinate dimensions do not match (to avoid treating datasets with equal size but different shape as valid 1D inputs)
๐จ fixes
- fix re-projection of data provided with 1D coordinates and 2D data-values (e.g. raster-data)
- fix treatment of nan-values for datashader plots
- update docs for NaturalEarth features and GeoDataFrames
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v3.1.2
... some more quick fixes
๐จ fixes
- fix rotation angle of ellipses
- remove unnecessary print command
- fix treatment of plotspecs kwargs (vmin, vmax, cmap etc...) in Maps.fromfile
- fix defaultargs in add_gdf
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v3.1.1
A minor bugfix release
๐ฆ๏ธ changes
- ๐ major speedup and reduced memory consumption for very large datasets
- new way for indexing picked pixels (uses much less ram with similar performance)
- the
pick_distanceargument ofMaps()now specifies the search-rectangle for identifying picked pixels- a rectangle of
radius * pick_distancexradius * pick_distancearound the center of the clicked pixel is used
- a rectangle of
๐จ fixes
- fix deleting callbacks from within a callback
- fix automatic identification of Equi7Grid crs
- fix treatment of numerical wms-layer names
- fix intersection of gdf with crs domain
- fix Maps.read_file should be a classmethod
- fix deleting data_specs when figure is closed
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v3.1
๐ณ New
โญ New bindings for the awesome datashader library!
- Particularly useful to speed up plotting of extremely large datasets (>10M datapoints)
- Requires
datashaderto be installed (e.g.conda install -c conda-forge datashader) - To use "datashader" for rendering the map, set the
plot-shapeto:m.set_shape.shade_points(...): use datashader to "shade" the data with infinitesimal pointsm.set_shape.shade_raster(...): (only for rectangular datasets with datacrs=plotcrs) use datashader to "shade" the data as a dynamically updated QuadMesh
โญ It is now possible to add a Compass (or a North-Arrow) to the map!
- simply use
c = m.add_compass(...) - the compass is dynamically updated on zoom events and can be dragged around with the mouse!

โญ EOmaps now has some basic readers for common data-types (NetCDF, GeoTIFF, CSV)
- Requires
xarray,rioxarrayandpandas - Use
gdf = m.read_file.NetCDF(...)to read all relevant data - Use
m = Maps.from_file.NetCDF(...)to directly initialize aMaps-object from a file - Use
m2 = m.new_layer_from_file.NetCDF(...)to add a new layer to an existingMapsobject from a file
โญ Support for Equi7Grid projection
- EOmaps now provides a cartopy-compatible crs for Equi7Grid projections!
- Requires
equi7gridto be installed (e.g.pip install equi7grid)python from eomaps.projections import Equi7Grid_projection m = Maps(Equi7Grid_projection("EU")
โญ New clipping & re-projection methods for GeoDataFrames
m.add_gdf()andm.add_feature()now have 2 new arguments:reprojectandclip(useful to avoid re-projection issues):reprojectlets you select between geopandas (="gpd") and "cartopy" for re-projecting the geometriescliplets you select multiple ways for clipping the data prior to plotting- "crs", "crsbounds", "extent", "gdalSymmetricDifference", "gdalIntersection" and "gdalDifference"
๐ฆ๏ธ changes
- The pixel-radius is now estimated using a more robust method if no explicit radius is provided.
- it's based on the median of the nearest-neighbour distances for the first 100k datapoints
- the number of datapoints used to estimate the radius can be adjusted by setting
m.set_shape.radius_estimation_range
- The
titleargument ofm.set_plot_specsis now depreciated... usem.ax.set_title()instead!
โ๏ธ fixes
- fix
MapsGridcrs-specifications with pyproj andnumpy-dtypes - fix skipping re-projection if "in-crs" == "plot_crs"
- fix
MapsGridhas no attributepreferred_wms_service - fix 'radius' estimation for shapes that do not explicitly require a radius
- fix background-layers need to be re-fetched if the figure canvas is resized
- clear data from memory if the figure is closed
- fix masking of nan-values prior to plotting
m.add_colorbar()now supports setting the number of bins used to draw the histogram via thehistbinskwarg- make sure that zoom and close callbacks are only attached once to the figure
- fix delayed fetching of RestAPI services
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v3.0
EOmaps v3.0 comes with a lot of usability improvements and some nice new features!
โ NOTE: There are breaking changes compared to EOmaps v2.x
... if you used EOmaps before, make sure to take a quick look at the list below! (or check the examples in the doc which have been updated accordingly)
โ details on breaking changes with respect to EOmaps v2.x - [click to expand]
- Removed functions and properties: `m.add_overlay`, `m.add_coastlines`, `m.crs_list` - Changed arguments and/or behavior: `Maps`, `MapsGrid`, `m.copy`, `m.plot_map`, `m.add_gdf`, `m.add_colorbar` - New functions: `m.new_layer`, `m.add_feature`, `m.add_logo`, `m.cb.pick.highlight_geometry` - โ `m.add_overlay` and `m.add_coastlines` have been removed in favor of `m.add_feature` - โญ use `m.add_feature.๐ณ New
โญ the plot coordinate-system is now specified directly on initialization of Maps object
- โ NOTE: this replaces
m.set_plot_specs(crs=...)as well asm.plot_specs.crs=... - additional kwargs are passed to the initialization of the
matplotlibfigurepython m=Maps(crs=4326, figsize=(10,5))
โญ there's a new function m.new_layer() that simplifies adding new layers to a map
- it simply returns a new
Mapsobject that shares the figure and plot-axes.
โญ EOmaps now supports multiple ways for providing datasets!
- a single
pandas.DataFramecontaining both values and coordinates (the only option for EOmaps < v2.4.2) - individual
pandas.Seriesfor data-values and coordinates - individual 1D or 2D
numpy.arraysfor data-values and coordinates - individual 1D lists for data-values and coordinates
โญ The new m.add_feature container provides direct access to ALL NaturalEarth features!
- โ NOTE: this replaces
m.add_overlayandm.add_coastlines - autocompletion helps with identifying the relevant NaturalEarth features
- e.g.
m.add_feature.physical_10m.<...feature...>(...)orm.add_feature.cultural_50m.<...feature...>(...)
- e.g.
- with
geopandasinstalled, NaturalEarth features can be interactive too!
(adding static layers works also withoutgeopandas)
```python
access specific NaturalEarth layers:
m.addfeature.cultural50m.admin0countries(fc="red", ec="k", alpha=0.5)
there are some presets to quickly add commonly used features
m.add_feature.preset.ocean() # (coastline, land, countries)
make the layers interactive (requires geopandas)!
m.addfeature.cultural50m.admin0countries(fc="none", ec="k", pickername="countries") m.cb.pick["countries"].attach.highlightgeometry(fc="r") ```
โญ there's a new function m.add_logo that can be used to add images to the map
- particularly useful to add a smal logo in the corner of a plot
โญ a lot of improvements to m.add_gdf
- it is now possible to pick a geometry based on the closest
"centroids"or based on a"contains"query- with this, picking now also works for lines and points!
python # for picking lines and points m.add_gdf(gdf, picker_name="pickername", pick_method="centroids") m.cb.pick["pickername"].attach.<...> # for picking polygons m.add_gdf(gdf, picker_name="pickername2", pick_method="contains") m.cb.pick["pickername2"].attach.<...>
- with this, picking now also works for lines and points!
โญ there's a new pre-defined callback m.cb.pick[<name>].highlight_geometries
- this callback is exclusive to
geopandas.GeoDataFramesand allows highlighting a shape when you click on it!
โญ m.add_colorbar() can now be used to add colorbars to existing Maps!
- โ NOTE: this replaces the old
colorbar-argument ofm.plot_map()
โญ MapsGrid now supports additional functionalities
- use
MapsGrid(crs=...)to specify the crs (unique crs for each Maps-objects can be specified by passinglistsordicts) - there are a lot of new convenience-functions to execute actions on all
Mapsobjects on the grid:mgrid.add_feature,mgrid.add_wms,mgrid.add_colorbar,mgrid.set_shape,mgrid.add_logo
โญ the plot-axis can now be accessed directly via m.ax
โญ possible crs for plotting are now accessible via Maps.CRS and possible classifiers are accessible via Maps.CLASSIFIERS
๐ง fixes
- fix
m.cb.pick.plotcallback - fix forwarding of event attributes
- treatment of point- or line-like NaturalEarth features
- fix
layerkwarg form.add_gdf - a lot more unittests!
- allow positional arguments for
m.set_data(orm.set_data_specs)
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.4.1
A minor bugfix release
๐ง fixes
- fix nested copying of Maps objects with "connect=True"
- fix
EEA_DiscoMapWMS service - fix toolbar-action check if no toolbar exists
- fix
m.cb.dynamic.indicate_extent()does not show extent right away - ... update some warnings, remove obsolete functions and print-statements
โ๏ธ updates
- ... a lot of new unittests
- all examples from the doc are run during the unittests
- added tests for WebMap services
- added tests for interactive capabilities (scalebar, draggable axes, etc.)
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.4
๐ณ New
- there's a new example in the docs to show how to analyse an underlying database
๐ Data analysis widgets - interacting with a database
๐ป NEW functionalities for eomaps.MapsGrid !
- It is now possible to use
Mapsobjects alongside ordinary matplotlib axes withMapsGrid!- 2 additional kwargs (
m_initsandax_inits) provide full control over the initialization of the MapsGrid object.
- 2 additional kwargs (
For example:
python
from eomaps import MapsGrid
mgrid = MapsGrid(2, 2,
m_inits=dict(top_row=(0, slice(0, 2)),
bottom_left=(1, 0)),
ax_inits=dict(bottom_right=(1,1))
)
mgrid.m_top_row # A Maps object whose axis spans over the entire top-row of the grid
mgrid.m_bottom_left # A Maps object with an axis in the bottom left corner of the grid
mgrid.ax_bottom_right # An ordinary matplotlib axis in the bottom right corner of the grid
๐จ updates and fixes
- the creation of a colorbar-axes is now omitted in case
plot_mapis called without a dataset - some doc updates
- from now on, a warning to install
geopandasis only shown if a function that actually requires geopandas is called (e.g.add_overlayandadd_gdf) - it is now possible to partially re-create an already closed figure
- attached callbacks are automatically re-assigned to the newly created figure
- all properties that are not related to the figure object remain unchanged in case the figure is closed
- ... however, any plot-functions (
plot_map,add_marker,add_wmsetc. ) must be called again!
- fix sharing of click events
- disable arrows in colorbar (for now) to ensure that the limits are correct
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.3
๐๐๐ There's an awesome new (fully customizable) scalebar feature available!
Checkout the new example in the docs! >> Adding scalebars <<
- You can now add a scalebar to the map via m.add_scalebar()
- works on any cartopy projection!
- Use mouse & keyboard to adjust the scalebar directly inside the plot
- drag the scalebar with the mouse!
- rotate it with the + and - keys
- remove it by pressing the delete key
- change the frame-width with the arrow-keys
๐งFixes
- remove unnecessary print in
m.add_gdf - better testing for event-forwarding
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.2
some fixes and a new feature: pickable geopandas.GeoDataFrames >> checkout the new example !
๐ณ new
- It is now possible to use
geopandas.GeoDataFramesfor picking!- first, use
m.add_gdf(picker_name="MyPicker")to make the GeoDataFrame pickable - then you can attach callbacks via
m.cb.MyPicker...orm.cb.pick["MyPicker"]...
- first, use
- you can also assign custom pickers for arbitrary artists via
m.cb.add_picker - callback-artists can now easily be made "temporary" via
m.cb.[click/pick].add_temporary_artist()### ๐จ fixes - fix docstring issue with S1GBM wms service on python 3.10
- fix typo in MapsGrid when accessing individual objects via
mg[0,0]instead ofmg.m_0_0 - fix issues with shared callbacks for non-global projections
- always use the shape of the Maps object as default for markers (if possible)
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.1.1
just some minor bugfixes
๐จ fixes
- fix some issues with the crs-specification in
m.add_gdf() - automatically activate matplotlib's interactive mode using
plt.ion()and callplt.show()when a map is created - include wms dependencies in setup.py
- the default radius for
m.add_markerno longer requires a dataset - add support for using a custom picker (work-in-progress)
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.1
... there are a lot of documentation updates!
๐ณ new
- axes-specifications can now be passed to the initialization of a
MapsGridobject - there are new WebMap layers!
- OSM default style (https://openstreetmap.org)
- OSM german default style (https://openstreetmap.de)
- OpenTopoMap (https://opentopomap.org)
- OSM stamen toner (standard, lite, lines, labels, background, hybrid) (http://maps.stamen.com/#toner)
- OSM stamen terrain (standard, lines, labels, background) (http://maps.stamen.com/#terrain)
- OSM stamen watercolor (http://maps.stamen.com/#watercolor)
๐changes
- adding WebMap services now works exclusively via
m.add_wmsindependent of the service-type (m.add_wmtshas been removed)- for services that allow multiple access possibilities (e.g. WMS, WMTS, etc.), the preferred way of accessing the WebMap service can be set on the initialization of the Maps-object via
m = Maps(preferred_wms_service="wmts")
- for services that allow multiple access possibilities (e.g. WMS, WMTS, etc.), the preferred way of accessing the WebMap service can be set on the initialization of the Maps-object via
๐จ fixes
- positional arguments are now properly forwarded when callbacks are attached
(e.g.
m.cb.click.peek_layer(1)now works as expected) - generalized access to xyz-tile-server
- kwargs passed to
MapsGridare now forwarded toGridSpec
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.0.2
another minor bugfix release
๐ณ new
- There's a new example on how to use WebMap services in the doc!
๐จ fixes
- make sure WebMap services are put on the assigned default layer
- avoid initializing axes on S1GBM wms-collection initialization
- make sure to update S1GBM layer if "home" or "left/right" toolbar buttons are pressed
- Python
Published by raphaelquast about 4 years ago
eomaps - EOmaps v2.0.1
... just a minor bugfix release
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v2.0
This release represents a complete re-work compared to EOmaps v1.x.x !
๐ผ A documentation is now available on readthedocs! >>> check it out here
๐ณ new
๐ด WMS and WMTS capabilities
- โ requires optional dependency
owslib - WMTS (or WMS) layers can be added via:
m.add_wmts.<COLELCTION>.add_layer.<LAYER>(**kwargs)m.add_wmts.<COLELCTION>[<LAYER>](**kwargs)
- pre-defined layers include interfaces to
- ESA Copernicus & WorldCover layers
- Sentinel-1 Global Backscatter Model
- EEA Discomap layers
- NASA GIBS
- Austrian basemaps (basemap.at & Vienna)
- ... and more!
๐ต re-arrange plot-axes via drag & drop
- press
alt+dto activate / deactivate "axis-arrangement" mode- use the mouse to select the axis you want to change
- use "left/right/up/down" or the mouse to move the selected layer
- use "alt+left/right/up/down" to move the layer quicker
- use "ctrl+up/down" to show/hide colorbars & histograms
๐ฒ share callback-events between multiple Maps objects
- e.g.: click on one map to trigger a callback on multiple connected maps!
- to connect maps-objects, provide a "parent"-object on initialization
m = Maps(parent=m0) - forward callback-triggers from one Maps object to others via:
m.cb.click.forward_events(m1, m2, m3) - ... or join the callback-events "both-ways" via
m.cb.click.share_events(m1, m2, m3)
- to connect maps-objects, provide a "parent"-object on initialization
๐ฑ... and some more:
- there's a new
MapsGridobject to quickly initialize a grid of Maps-objectsm1, m2, m3, m4 = MapsGrid(2, 2) - join zoom-limits between multiple axes (with the same crs)
m.join_limits(m1, m2, m3)
๐ฆ changes
f,gs_axandorientationare now set on initialization of the Maps-object!
(they are no longer arguments ofm.plot_map())callbacks are now accessed differently
- instead of
m.cb.attach()andm.cb_click.attachthere's nowm.cb.click: trigger callbacks when clicking anywhere on the mapm.cb.pick: trigger callbacks when clicking on a point of the plotted datasetm.cb.keypress: trigger callbacks when pressing a keym.cb.dynamic: trigger callbacks on events (e.g. zoom)
- instead of
๐จ fixes
- make sure shapes are properly copied on
m.copy() - make sure
geod_circlesonly takes numbers as radius - sharing callbacks now works across coordinate-systems!
- multiple temporary markers & annotations are now supported
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v1.0.2
๐ณ new
m.set_shape.rectangles(radius, radius_crs, n)now supports an additionalnkeyword to calculate intermediate points on the edges (e.g. useful to draw "curved" projected rectangles) ### ๐ธ fixes- allow setting
nalso in the mark-callback
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v1.0.1
a minor bugfix release
๐ณ new
- a new method
m.indicate_masked_points()is added to indicate points that have been masked
๐ธ fixes
- fix repr-string of the callback-container
- fix adding markers if "geod_circles" have been plotted
- avoid transforming "out-of-bounds" for rectangles
- don't create markers with radius="pixel" if the shape does not set a radius
๐ checkout the README, the example-notebook and the docstrings for usage-details!
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v1.0
- major updates and breaking changes compared to EOmaps v0.x.x
๐ checkout the README, the example-notebook or the docstrings for usage-details!
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.7
new
there are 2 new plot-types:
"delauney_triangulation"
- ... e.g. plot a (continuous) triangulation-shading of irregularly distributed points
- it supports additional customization by adding a suffix to the "shape"-name:
_flat: plot actual polygons (with mean-values) instead of a mesh that interpolates values_masked: use the defined "radius" to mask any triangle for which the distance between the centroid and the vertices exceeds (2 * radius) (particularly useful for densely sampled data-points whose exterior is a a concave shape)_flat_masked: a combination of the above options
"Voroni"
- create a voroni-diagram
- similar as with the Delauney triangulation, any polygon whose defining data-point is farther than (2 * radius) away from any vertex of the Voroni-diagram is masked
fixes
- cache the background on first draw of the map so that callbacks can immediately trigger
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.6
new
- example notebook updated to show most of the implemented functionalities
- markers & annotations now support
permanent=True/False - there's now an option
m.set_plot_specs(histbins="bins")to use the bins calculated by the data-classification for the histogram! (...only possible if a classification is used!) - you can now specify "layers" for dynamic plot components (e.g. markers, annotations etc)
- option "radius_crs" added to
m.cb.markto specify the radius of the marker in an arbitrary crs #### new functions: m.cb.clear_annotations()andm.cb.clear_markers()to clear all annotations and markersm.figure.set_colorbar_position()to manually change the position of the colorbar & histogramm.add_overlay_legend()to quickly customize the legend for map-overlays ## fixes- "rectangle"-marker can now be properly "buffered"
- fix setting "vmin" and "vmax" in
plot_specs - major improvements on blitting implementation
- use explicit cleanup functions to clear markers & annotations separately
- set "double_click=False" as the default for callbacks
(to avoid the open issue that double-clicks are not recognized in
ipymplfor Jupyter-Notebooks ) - ensure histogram is always properly positioned on top of the colorbar
- fix rotation and size of markers
- allow multiple callbacks (with same button) for "marker" and "annotation"
- fix initialization of subgrids if a
GridSpecis passed tom.plot_map - always overwrite all
classify_specsto avoid mixing kwargs
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.5
fixes
- fix #16 (e.g. install issues with VERSION file)
- fix issues when coordinates are provided as integer-arrays and radius is estimated as float
- execute callbacks only if point is identified
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.4
fixes
- there were some issues when specifying
"radius_crs"in conjunction with"cpos"that are fixed now"radius_crs"can be one of"in","out"or any crs-specification recognized bypyproj"cpos"can be one of"c","ul","ur","ll","lr"
- fix typo in README:
xcoord="lon"andycoord="lat" - use explicit "VERSION" file to specify module-version in one place
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.3
new
trimesh_rectangleshas been added as a possible plot-shape (e.g.m.set_plot_specs(shape="trimesh_rectangles")(it uses a triangular mesh for plotting which is useful for contour-plots since pixel-boundaries are invisible)- option to copy the data with
m.copy(copy_data=True)has been added
fixes
- copy now performs a deep-copy of all properties
- make
geopandasan optional import (basic functions do not require geopandas) - add
pyepsgas dependency - use
xcoordandycoordas labels for annotations - cleanup callbacks if figure is closed
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.2
new
add_marker()function added to manually add markersadd_annotations()function added to manually add annotations- annotate can now be used on multiple buttons
- add
textargument tom.cb.annotateto manually specify the text - add
m.cb.clear_annotations()function to delete annotations - add
savefigfunction to save the image ### fixes - fix permanent annotations
- + more fixes + more unittests
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1.1
new
- allow multiple callbacks of the same function (using different mouse-button assignments)
- add option to make annotations permanent
m.cb.annotate(... , permanent=True) - add option to format annotation display via
m.cb.annotate(..., val_fmt=<callable>) - add
m.cb.markcallback (e.g. to overlay markers around selected points) - all callback-returns are now accessible via
m.cb... - add
m.cb.cb_list(e.g. a hardcoded list of available callback functions) ## fixes - better fetching of background for blitting (now also works with multiple callbacks)
- Python
Published by raphaelquast over 4 years ago
eomaps - EOmaps v0.1
This is a first (beta) release... use with care!
- Python
Published by raphaelquast over 4 years ago