编程语言
首页 > 编程语言> > python-GeoPandas绘图-有什么方法可以加快速度吗?

python-GeoPandas绘图-有什么方法可以加快速度吗?

作者:互联网

我正在对某些地理数据运行梯度下降算法.目的是将不同的区域分配给不同的群集,以最小化某些目标功能.我正在尝试制作一部短片,展示算法的进展情况.现在,我的方法是在每个步骤绘制地图,然后使用其他一些工具从所有静态图像制作一些电影(非常简单).但是,我要绘制约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')

更新:查看了real-time plotting in while loop with matplotlib的drawow和其他指针,但是shapefile太大/笨拙,无法实时工作.

解决方法:

我认为有两个方面可以改善性能:1)使用matplotlib集合(当前的geopandas实现是分别绘制每个多边形)和2)仅更新多边形的颜色,而不是在每次迭代时都再次绘制它(您已经这样做了,但是使用集合会更简单).

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

这可能是实现更有效的geopandas绘图功能来绘制多边形的GeoSeries的一种可能的实现方式:

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方法一步完成更新多边形集合的颜色,其中数组中的值指示颜色(根据颜色图转换为颜色)

例如. (考虑s_poly一个具有多边形的GeoSeries):

fig, ax = plt.subplots(subplot_kw=dict(aspect='equal'))
col = plot_polygon_collection(ax, s_poly.geometry)
# update the color
col.set_array( ... )

带有一些伪数据的完整示例:

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

标签:pandas,matplotlib,geopandas,python,drawnow
来源: https://codeday.me/bug/20191119/2036163.html