我正在尝试生成每日温度热图的GIF。我先生成每小时的热图。然后我使用imageio附加所有生成的图像以生成最终的gif。
以下是显示我的基本逻辑的草稿代码:
# Find min and max value from all sample data
while (count < len(grib_objects)):
vmax = max(grib_objects[count]['maximum'], vmax)
vmin = min(grib_objects[count]['minimum'], vmin)
count++
# Get the standard mappable object
cs = self.GenerateMasterMappable(grib_objects[0], vmin, vmax)
# Generate image of each frame with defined vmin, vmax and cs
count = 0
while count < len(grib_objects):
self.Frame(grib_objects[count], filenames[index], vmin, vmax, cs)
count++
# Generate the final gif by appending each generated image as above
由于生成的每个热图具有不同的数据值范围,因此它们具有不同的颜色条比例。但是我想要一个带有静态颜色条的移动热图。因此,我尝试使用每小时样本生成一个标准颜色条,并将此颜色条用于所有其他图像。
我使用一个示例数据来获取可映射对象 cs 并将其传递给colorbar函数。但这不能按预期工作,gif仍显示动态颜色条。似乎标准的可映射对象cs设置不正确。
以下是我在函数GenerateMasterMappable中获取可映射对象cs的代码:
GenerateMasterMappable(self, grib_object, vmin, vmax):
data = grib_object.values
lat,lon = grib_object.latlons()
m = Basemap(
resolution='c', # c, l, i, h, f or None
projection='cyl',
lat_0=39.72, lon_0=-86.29,
llcrnrlon=-87.79, llcrnrlat= 38.22,
urcrnrlon=-84.79, urcrnrlat=41.22)
x,y = m(lon, lat)
cs = m.pcolormesh(x,y,data,
shading='flat',
vmin=vmin,
vmax=vmax,
cmap=plt.cm.jet)
return cs
然后我将这个标准的可映射对象传递给函数Frame,它按如下方式生成每小时的热图:
Frame(self, grib_object, file_name, vmin, vmax, cs):
... // draw basic map layout m
x,y = m(lon, lat)
norm = mpl.colors.Normalize(vmin=vmin,vmax=vmax)
ab = m.pcolormesh(x,y,data,
shading='flat',
vmin=vmin,
vmax=vmax,
cmap=plt.cm.jet)
// passing cs as first parameter does not really make a difference, why?
cbar = plt.colorbar(cs,location='bottom', fraction=0.046, pad=0.06)
事实上,即使我删除了colorbar()中的第一个参数,最终的gif也保持不变。是否有一种正确的方法来绘制独立于当前图像(热图)的标准颜色条?