Question

If I define a set of (geo)axes with a given height and width how can I make sure that the plot will fill these axes?

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

ax = plt.axes([0.3, 0.1, 0.4, 0.8], projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_global()
plt.show()

This produces a plot with a sensible aspect ratio for the map, but I wanted it to fill the axes instead, resulting in a plot taller than it is wide. This is just an example, but there are real-world scenarios where doing this is important.

Edit

Just to calrify, I actually want the result to be distorted, so in my example I genuinely want a map with global extent that is taller than it is wide. Using ax.set_aspect('auto') appears to work for PlateCarree and NorthPolarStereographic projections, but perhaps does not work for all (OSGB for example).

Was it helpful?

Solution

Good question. I've had this on my radar for quite some months now (https://github.com/SciTools/cartopy/issues/9).

I recently learnt about matplotlib's ax.set_adjustable method (here in fact). Using this allows you to tell an axes which has a fixed (data) aspect ratio to fill the space that it can by changing the data limits.

For example:

import matplotlib.pyplot as plt


ax = plt.axes([0.25, 0.05, 0.5, 0.9])
ax.set_aspect(1)

ax.plot(range(10))
ax.set_adjustable('datalim')

plt.show()

Produces a non-square plot (with equal length scales in the x and y dimensions).

It seems to me that this can be applied to cartopy maps too:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs


ax = plt.axes([0.25, 0.05, 0.5, 0.9], projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_adjustable('datalim')

ax.set_ylim([-90, 90])

plt.show()

I wonder if this suits your needs here?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top