Cartopy kullanarak, renk çubuğumun nereye gittiğini tam olarak kontrol etmek istiyorum. Genellikle şu anki eksenlerin konumunu temel alarak ve sonra renk çubuğu için yeni eksenler oluşturarak yapıyorum. Bu, standart matplotlib eksenleri için iyi çalışır, ancak Cartopy ve geo_axes kullanırken değil, çünkü bu eksenleri bozar.Renk çubuklarının coğrafi eksenlere göre doğru yerleştirilmesi (kartoplu)
Yani, sorum şu: geo_axes'imin tam konumunu nasıl alabilirim? "Set_aspect" kullanıldığında
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()
, Şekil Sonuç: Burada
Cartopy dokümanlar http://scitools.org.uk/cartopy/docs/latest/matplotlib/advanced_plotting.html göre bir kod örneği Şekil Sonuç, "set_aspect" atlama zaman:
Temel olarak, ilk rakamı (doğru yerleştirilmiş colorbar) ancak "set_aspect" kullanmadan almak istiyorum. Sanırım bu bazı dönüşümler ile mümkün olmalıydı, ancak şimdiye kadar bir çözüm bulamadım.
Teşekkürler!
Büyük cevap! Bu çözümü asla kendi başıma bulamazdım! – user3497890
Belki kısa yan soru eğer yapabilir: mümkün mü başka bir yere resize_colorbar tanımını koymak ve argümanlar olarak (bu fonksiyon yeniden olması için) balta ve cbar_ax geçmek? – user3497890
Güncelleme: plt.show() doğru sonucu verir iken, plt.savefig ('sst.png') değil (Colorbar [0,0,0.1,0.1] orijinal konumunda kalır). Arka ucunu matplotlib.use ('Agg') olarak değiştirmeye çalıştı ancak bu yardımcı olmuyor. Savefig ile çalışmayı nasıl başarabilirim? – user3497890