我正在对一些地理数据运行梯度下降算法。目标是将不同的区域分配给不同的集群以最小化一些目标函数。我正在尝试制作一部短片,展示算法的进展情况。现在我的方法是在每一步绘制地图,然后使用其他一些工具从所有静态图像中制作一个小电影(非常简单)。但是,我有大约 3000 个区域要绘制,并且 plot 命令需要 90 秒或更长时间才能运行,这会杀死我的算法。
有一些明显的捷径:每第 N 次迭代保存一次图像,将所有步骤保存在一个列表中,并在最后制作所有图像(可能是并行的)。目前这一切都很好,但最终我的目标是一些交互式功能,用户可以输入一些参数并实时查看他们的地图收敛。似乎在这种情况下,动态更新地图是最好的。
有任何想法吗?这是基本命令(使用最新的 geopandas 开发版本)
fig, ax = plt.subplots(1,1, figsize=(7,5))
geo_data.plot(column='cluster',ax=ax, cmap='gist_rainbow',linewidth=0)
fig.savefig(filename, bbox_inches='tight', dpi=400)
还尝试了类似于以下的内容(下面是缩写版本)。我打开一个图,并在每次迭代中更改并保存它。似乎根本没有加快速度。
fig, ax = plt.subplots(1,1, figsize=(7,5))
plot = geo_data.plot(ax=ax)
for iter in range(100): #just doing 100 iterations now
clusters = get_clusters(...)
for i_d, district in enumerate(plot.patches):
if cluster[i] == 1
district.set_color("#FF0000")
else:
district.set_color("#d3d3d3")
fig.savefig('test'+str(iter)+'.pdf')
更新:查看了使用 matplotlib 在 while 循环中实时绘制的drawow 和其他指针,但 shapefile 似乎太大/笨重而无法实时工作。