地质公园计划用什么方法来加速?

2024-06-16 18:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在对一些地理数据运行梯度下降算法。目标是将不同的区域分配给不同的簇,以最小化某些目标函数。我想拍一个短片来展示算法的进展。我现在用一些简单的方法来制作一些静态的图像。但是,我要绘制大约3000个区域,plot命令需要90秒或更长时间才能运行,这会破坏我的算法。在

有一些明显的快捷方式:每n次迭代保存一次图像,将所有步骤保存在一个列表中,并在最后生成所有图像(可能是并行的)。现在还可以,但最终我的目标是一些交互式功能,用户可以输入一些参数,并实时查看地图的收敛情况。在这种情况下,最好是动态更新地图。在

有什么想法吗?下面是基本命令(使用geopandas的最新dev版本)

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)

也尝试了类似于以下内容的东西(缩写如下)。我打开一个单独的绘图,然后在每次迭代中修改它并保存它。似乎一点也不加速。在

^{pr2}$

更新:查看了drawnow和real-time plotting in while loop with matplotlib中的其他指针,但是shapefile似乎太大/太笨重,无法实时工作。在


Tags: 数据函数图像命令算法区域目标plot
1条回答
网友
1楼 · 发布于 2024-06-16 18:35:38

这两个方面都可能会提高绘制多边形的性能(1)这两个方面都可以单独使用polygons和polygons来更新。在

1)使用matplotlib集合绘制多边形

这是使用geopandas绘制多边形地理系列的更高效绘图功能的可能实现:

from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon
import shapely

def plot_polygon_collection(ax, geoms, values=None, colormap='Set1',  facecolor=None, edgecolor=None,
                            alpha=0.5, linewidth=1.0, **kwargs):
    """ Plot a collection of Polygon geometries """
    patches = []

    for poly in geoms:

        a = np.asarray(poly.exterior)
        if poly.has_z:
            poly = shapely.geometry.Polygon(zip(*poly.exterior.xy))

        patches.append(Polygon(a))

    patches = PatchCollection(patches, facecolor=facecolor, linewidth=linewidth, edgecolor=edgecolor, alpha=alpha, **kwargs)

    if values is not None:
        patches.set_array(values)
        patches.set_cmap(colormap)

    ax.add_collection(patches, autolim=True)
    ax.autoscale_view()
    return patches

这大约比目前的geopandas绘图方法快10倍。在

2)更新多边形的颜色

一旦有了图形,就可以使用set_array方法一步完成更新多边形集合的颜色,其中数组中的值表示颜色(根据colormap转换为颜色)

例如(考虑s_poly一个具有多边形的地质系列):

^{pr2}$

包含一些虚拟数据的完整示例:

from shapely.geometry import Polygon

p1 = Polygon([(0, 0), (1, 0), (1, 1)])
p2 = Polygon([(2, 0), (3, 0), (3, 1), (2, 1)])
p3 = Polygon([(1, 1), (2, 1), (2, 2), (1, 2)])
s = geopandas.GeoSeries([p1, p2, p3])

绘制此图:

fig, ax = plt.subplots(subplot_kw=dict(aspect='equal'))
col = plot_polygon_collection(ax, s.geometry)

给出:

enter image description here

然后用表示簇的数组更新颜色:

col.set_array(np.array([0,1,0]))

给予

enter image description here

相关问题 更多 >