Color handling with DataLevels

DataLevels is the base class for handling colors. It is there to ensure that there will never be a mismatch between data and assigned colors.

In [1]: from salem import DataLevels

In [2]: a = [-1., 0., 1.1, 1.9, 9.]

In [3]: dl = DataLevels(a)

In [4]: dl.visualize(orientation='horizontal', add_values=True)

Discrete levels

In [5]: dl.set_plot_params(nlevels=11)

In [6]: dl.visualize(orientation='horizontal', add_values=True)

vmin, vmax

In [7]: dl.set_plot_params(nlevels=9, vmax=3)

In [8]: dl.visualize(orientation='horizontal', add_values=True)

Out-of-bounds data

In [9]: dl.set_plot_params(levels=[0, 1, 2, 3])

In [10]: dl.visualize(orientation='horizontal', add_values=True)

Note that if the bounds are not exceeded, the colorbar extensions are gone:

In [11]: dl.set_data([0., 0.2, 0.4, 0.6, 0.8])

In [12]: dl.visualize(orientation='horizontal', add_values=True)

This might be undesirable, so you can set a keyword to force out-of-bounds levels:

In [13]: dl.set_plot_params(levels=[0, 1, 2, 3], extend='both')

In [14]: dl.visualize(orientation='horizontal', add_values=True)

Using DataLevels with matplotlib

Here with the example of a scatterplot:
In [15]: x, y = np.random.randn(1000), np.random.randn(1000)

In [16]: z = x**2 + y**2

In [17]: dl = DataLevels(z, cmap='RdYlBu_r', levels=np.arange(6))

In [18]: fig, ax = plt.subplots(1, figsize=(6, 4))

In [19]: ax.scatter(x, y, color=dl.to_rgb(), s=64);

In [20]: cbar = dl.append_colorbar(ax, "right")  # DataLevel draws the colorbar

In [21]:


Map is a sublass of DataLevels, but adds the georeferencing aspects to the plot. A Map is initalised with a Grid:

In [22]: from salem import mercator_grid, Map, get_demo_file, open_xr_dataset

In [23]: grid = mercator_grid(center_ll=(10.76, 46.79), extent=(9e5, 4e5))

In [24]: emap = Map(grid)

In [25]: emap.visualize(addcbar=False)

The map image has it’s own pixel resolution (set with the keywords nx or ny), and the cartographic information is simply overlayed on it. When asked to plot data, the map will automatically transform it to the map projection:

In [26]: ds = open_xr_dataset(get_demo_file(''))

In [27]: emap.set_data(ds.prcp)

In [28]: emap.visualize()

Add topographical shading to a map

You can add topographical shading to a map with DEM files:

In [29]: grid = mercator_grid(center_ll=(10.76, 46.79), extent=(18000, 14000))

In [30]: smap = Map(grid, countries=False)

In [31]: smap.set_topography(get_demo_file('hef_srtm.tif'));

In [32]: smap.visualize(addcbar=False, title='Topographical shading')

Note that you can also use the topography data to make a colourful plot:

In [33]: z = smap.set_topography(get_demo_file('hef_srtm.tif'))

In [34]: smap.set_data(z)

In [35]: smap.set_cmap('topo')

In [36]: smap.visualize(title='Topography', cbar_title='m a.s.l.')