Plotting

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)
_images/datalevels_01.png

Discrete levels

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

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

vmin, vmax

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

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

Out-of-bounds data

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

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

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)
_images/datalevels_05.png

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)
_images/datalevels_06.png

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]: plt.show()
_images/datalevels_07.png

Maps

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)
_images/map_central_europe.png

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('histalp_avg_1961-1990.nc'))

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

In [28]: emap.visualize()
_images/map_histalp.png

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')
_images/topo_shading_simple.png

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.')
_images/topo_shading_color.png