在ImageGrid

时间:2016-06-20 07:56:00

标签: python matplotlib matplotlib-basemap subplot

以下代码生成我想要的图像,但颜色栏为空白/白色,并且与数据不匹配:

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

我需要做些什么才能让colorbar使用ImageGrid,或者ImageGrid和Basemap不能很好地协同工作?

2 个答案:

答案 0 :(得分:3)

据我了解,它不是Basemap问题。 ImageGrid()调用只是为颜色条设置了一组空白轴,可以通过plt.colorbar()参数传递给cax。默认情况下,ImageGrid()具有参数cbar_set_cax=True,该参数在每个子图上设置cax属性。然后,您可以将其传递给colorbar()

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

这将仅使用当前活动的轴来确定色条数据范围,因此它只与最终的图形一致。您必须使用vmin/vmaxpcolormesh()的组合来确保所有图表的一致性。

答案 1 :(得分:2)

Matplotlib无法定义您想在彩条上绘制的内容。写得像

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