是否可以在许多子图上绘制底图而无需多次重绘地图

时间:2016-11-23 08:52:20

标签: python multiprocessing matplotlib-basemap

通常,在创建底图时,可以将其指定给轴实例,例如

fig = plt.figure()
ax = fig.add_subplot()
m = Basemap(..., ax=ax)

现在,如果我想制作30个子图,我需要做类似

的事情
fig, axes = plt.subplots(6,5)
for ax in axes:
    m = Basemap(..., ax=ax)
    # plot some other things

但重绘底图需要很长时间。我想知道是否可以创建一次底图实例,然后将其分配给我的所有轴。类似的东西:

m0 = Basemap(...) # without ax = ax
for ax in axes:
    m = add_basemap(ax,m0)
    # plot some other things

这可能吗?

作为替代方案,我考虑过用所有底图创建一次图形然后进行酸洗,但子图的数量并不总是相同。

2 个答案:

答案 0 :(得分:0)

如果您在理论上绘制Public Function createInput() As String() Dim int = myControls.Length Dim count As Integer = 0 Dim str(int) As String For i = 1 To int - 1 Step 2 str(count) = myControls(i).Text count += 1 Next Return str End Function ,您可以删除(或设置不可见)所有对象并重复使用地图。

然而,我做了两个功能 - 一个用于生成地图,另一个用于绘制数据:

Basemap

在main中,我调用def genMap(): bMap = Basemap(llcrnrlat=5, urcrnrlat=50, llcrnrlon=10, urcrnrlon=210, \ rsphere=(6378137.00,6356752.3142),resolution='i',projection='lcc',lat_1=30.,lat_2=60.,lat_0=48.,lon_0=135.) return bMap def plot(cur_hour, leg, outdir, bMap, lon, lat): fig = plt.figure(figsize=(17, 17), dpi=70, facecolor='w', edgecolor='k') bMap.drawcountries(linewidth=1.5, color='purple') bMap.fillcontinents(color='#FFFCC4', zorder = 0) bMap.drawcoastlines(linewidth=0.75) bMap.drawparallels(np.arange(-90., 120., 10.), labels=[1,0,0,0], color="k", fontsize=LEGEND_SIZE, linewidth=1, labelstyle='+/-') bMap.drawmeridians(np.arange(0., 420., 10.), labels=[0,0,0,1], color="k", fontsize=LEGEND_SIZE, linewidth=1, labelstyle='+/-') CF2 = plt.contourf(lon[::2,::2], lat[::2,::2], fl[::2,::2]) 一次,并将其结果用作绘制函数的参数:

genMap

此代码的工作速度非常快,但我可能会错过Basemap类的低估。

答案 1 :(得分:0)

实际上可以这样做:

fig, axes = plt.subplots(6,5)
flat_axes = axes.reshape(-1)
m = Basemap(...) # without ax = ax
for ax in flat_axes:
    m.ax = ax
    # plot some other things

注意,需要展平轴网格以使迭代变得容易。在"绘制其他一些东西后,可能还需要以某种方式重置Basemap对象实例。这里。