我正在为一个研究项目绘制一些天气数据。该图包括18个时间步。我决定完成此操作的最佳方法是为每个时间步创建一个新图,将其保存为一个文件,并为下一个时间步创建一个新图(使用for循环)。

例如:


map_init  #[Basemap Instance]
extra_shapes  #[Basemap.readshapefile object]

for i in range(timesteps):
    #plot the weather data for current timestep to current plot
    map_init.imshow(data[i])

    # extra_shapes are county boundaries.  Plot those as polygons
    pyplot.Polygon(map_init.extra_shapes[i])

    # Plot the state boundaries (in basemap)
    map_init.drawstates()

    # add a colorbar
    pyplot.colorbar()

    # Save the figure
    pyplot.savefig(filepath)

    #close figure and loop again (if necessary)
    pyplot.clf()


问题在于pyplot.clf()

该代码工作正常,只有一件事。只有第一个情节出人意料。随后的每个情节都缺少extra_shapes(即没有县边界)。我不了解pyplot.clf()的存在与pyplot.Polygon()的失败之间的关系?

如果删除,将绘制extra_shapes,但是每个图都有多个颜色条(取决于i的值)。 pyplot.clf()的唯一原因是要避免在最终图中使用18个颜色条。有没有一种方法可以强制每个图只有一个色标?

最佳答案

尝试制作一个新图形,而不是使用clf()。

例如

for i in range(timesteps):
    fig = pyplot.figure()
    ...
    fig.savefig(filepath)


另外(更快),您可以更新图像对象中的数据
(由imshow()返回)。

例如像(完全未经测试):

map_init  #[Basemap Instance]
extra_shapes  #[Basemap.readshapefile object]


#plot the weather data for current timestep to current plot
img = map_init.imshow(data[0])

# extra_shapes are county boundaries.  Plot those as polygons
plygn = pyplot.Polygon(map_init.extra_shapes[0])

# Plot the state boundaries (in basemap)
map_init.drawstates()

# add a colorbar
pyplot.colorbar()

for i in range(timestamps):
    img.set_data(data[i])
    plygn.set_xy(map_init.extra_shapes[i])
    pyplot.draw()
    pyplot.savefig(filepath)


但是,该方法可能无法与底图很好地配合使用。我可能还不太记得重新绘制图形的正确方法,但是我很确定它只是plt.draw()...

希望无论如何会有所帮助

编辑:刚注意到,您也在循环内绘制多边形。更新了第二个示例以正确反映这一点。

关于python - 循环绘制(使用 basemap 和pyplot)…pyplot.clf()有问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3460707/

10-12 18:46