2016-06-20 6 views
2

Следующий код создает изображение, я хочу, но colourbar пустой/белый, и не соответствует данным:Пустой Colorbar с использованием basemap.pcolor в ImageGrid

def plot_array(da, ax=None, shift=True): 
    """plots an array of lat by lon on a coastline map""" 

    m = basemap.Basemap() 
    m.drawcoastlines() 
    m.pcolormesh(da.lon, y=da.lat, data=da.T, latlon=True) 

    return m 

# 'monthly mean' is an xarray DataArray 

fig = plt.figure(0, (14, 8)) 
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=0.3, 
       cbar_mode='single', cbar_location="bottom",) 
for i, m in enumerate(months): 
    plt.sca(grid[i]) 
    plot_array(monthly_mean.sel(month=i + 1)) 
    plt.title(m) 
plt.suptitle("{b} - {y} monthly means".format(b=benchmark, y=year)) 
# plt.colorbar() 
plt.tight_layout() 

os.makedirs("plots/monthly_means/{y}".format(y=year), exist_ok=True) 
plt.savefig("plots/monthly_means/{y}/{b}_{y}.png".format(b=benchmark, y=year)) 
plt.close() 

blank colorbar

Is есть что-то еще, что мне нужно сделать, чтобы заставить colorbar работать с ImageGrid, или ImageGrid и Basemap просто не хорошо сочетаются?

ответ

3

Насколько я понимаю, это не проблема с базовым картографическим кодом. В вызове ImageGrid() просто устанавливается пустой набор осей для цветовой панели, который можно передать в plt.colorbar() через аргумент cax. По умолчанию ImageGrid() имеет аргумент cbar_set_cax=True, который устанавливает атрибут cax на каждой из подзаговоров. Затем вы можете передать это colorbar():

... 
plt.colorbar(cax=grid[0].cax) 
plt.tight_layout() 
... 

Это будет просто использовать в настоящее время активных осей, чтобы определить диапазон данных Colorbar, так что это будет только в соответствии с окончательным сюжетом. Вам нужно будет использовать комбинации vmin/vmax с pcolormesh(), чтобы обеспечить согласованность по всем участкам.

+0

Когда я пытаюсь использовать 'plt.colorbar (cax = grid [0] .cax)', я получаю сообщение об ошибке: 'RuntimeError: Не найдено ни одного сопоставления для создания цветной панели. Сначала определите отображаемое изображение, например изображение (с imshow) или контурное множество (с контуром). ' и если я попробую' plt.colorbar (plt.gca(), cax = grid [0] .cax) ' Я получаю ошибку 'AttributeError: 'Объект CbarAxes' не имеет атрибута 'autoscale_None'' Наконец, если я попробую' plt.colorbar (сетка [0], cax = grid [0] .cax) 'Получаю ошибку 'AttributeError: объект LocatableAxes 'не имеет атрибута' autoscale_None' Любая идея, как исправить это? –

+0

Используя ответ Serentiy ниже, исправляет эту проблему. –

+0

@ user2472441 Возможно, что-то вроде. Это 'plt.colorbar (pcm)' добавляет новый экземпляр colorbar вместо замены уже установленного 'ImageGrid'. Исходный пустой номер все еще находится под новым - попробуйте установить «ориентация =» по вертикали «» в вызове colorbar, чтобы увидеть их оба. Если вы не замените оригинал, он может быть виден с некоторыми размерами фигур. – Deditos

2

Matplotlib не может определить, что вы хотите построить на цветной панели. Напишите как

... 
pcm = m.pcolormesh(da.lon, y=da.lat, data=da.T, latlon=True) 
plt.colorbar(pcm) 
...