Posicionamento correto da barra de cores em relação aos eixos geográficos (cartopia)

Usando o Cartopy, eu gostaria de ter controle total de onde minha barra de cores vai. Normalmente, faço isso obtendo a posição atual dos eixos como base e, em seguida, crio novos eixos para a barra de cores. Isso funciona bem para eixos padrão do matplotlib, mas não ao usar Cartopy e geo_axes, porque isso distorce os eixos.

Então, minha pergunta é: como obtenho a posição exata dos meus geo_axes?

Aqui está um exemplo de código baseado nos documentos do Cartopyhttp://scitools.org.uk/cartopy/docs/latest/matplotlib/advanced_plotting.html:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import os
from netCDF4 import Dataset as netcdf_dataset
from cartopy import config

def main():
    fname = os.path.join(config["repo_data_dir"],
                     'netcdf', 'HadISST1_SST_update.nc'
                     )

    dataset = netcdf_dataset(fname)

    sst = dataset.variables['sst'][0, :, :]
    lats = dataset.variables['lat'][:]
    lons = dataset.variables['lon'][:]

    #my preferred way of creating plots (even if it is only one plot)
    ef, ax = plt.subplots(1,1,figsize=(10,5),subplot_kw={'projection': ccrs.PlateCarree()})
    ef.subplots_adjust(hspace=0,wspace=0,top=0.925,left=0.1)

    #get size and extent of axes:
    axpos = ax.get_position()
    pos_x = axpos.x0+axpos.width + 0.01# + 0.25*axpos.width
    pos_y = axpos.y0
    cax_width = 0.04
    cax_height = axpos.height
    #create new axes where the colorbar should go.
    #it should be next to the original axes and have the same height!
    pos_cax = ef.add_axes([pos_x,pos_y,cax_width,cax_height])

    im = ax.contourf(lons, lats, sst, 60, transform=ccrs.PlateCarree())

    ax.coastlines()

    plt.colorbar(im, cax=pos_cax)

    ax.coastlines(resolution='110m')
    ax.gridlines()
    ax.set_extent([-20, 60, 33, 63])

    #when using this line the positioning of the colorbar is correct,
    #but the image gets distorted.
    #when omitting this line, the positioning of the colorbar is wrong,
    #but the image is well represented (not distorted).
    ax.set_aspect('auto', adjustable=None)

    plt.savefig('sst_aspect.png')
    plt.close()



if __name__ == '__main__': main()

Figura resultante, ao usar "set_aspect":

Figura resultante, ao omitir "set_aspect":

Basicamente, eu gostaria de obter a primeira figura (barra de cores corretamente colocada), mas sem usar o "set_aspect". Acho que isso deve ser possível com algumas transformações, mas não encontrei uma solução até agora.

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion