【问题标题】:Draw polygons more efficiently with matplotlib使用 matplotlib 更有效地绘制多边形
【发布时间】:2012-10-04 14:43:53
【问题描述】:

我有大约 60000 个形状的日期集(每个角的纬度/经度坐标),我想使用 matplotlib 和底图在地图上绘制。

这就是我目前的做法:

for ii in range(len(data)):
    lons = np.array([data['lon1'][ii],data['lon3'][ii],data['lon4'][ii],data['lon2'][ii]],'f2')
    lats = np.array([data['lat1'][ii],data['lat3'][ii],data['lat4'][ii],data['lat2'][ii]],'f2')
    x,y = m(lons,lats)
    poly = Polygon(zip(x,y),facecolor=colorval[ii],edgecolor='none')
    plt.gca().add_patch(poly)

但是,这在我的机器上大约需要 1.5 分钟,我正在考虑是否可以加快速度。有没有更有效的方法来绘制多边形并将它们添加到地图中?

【问题讨论】:

    标签: python numpy matplotlib scipy matplotlib-basemap


    【解决方案1】:

    您可以考虑创建多边形集合而不是单个多边形。

    相关文档可以在这里找到:http://matplotlib.org/api/collections_api.html 这里有一个值得选择的例子:http://matplotlib.org/examples/api/collections_demo.html

    举个例子:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import PolyCollection
    import matplotlib as mpl
    
    # Generate data. In this case, we'll make a bunch of center-points and generate
    # verticies by subtracting random offsets from those center-points
    numpoly, numverts = 100, 4
    centers = 100 * (np.random.random((numpoly,2)) - 0.5)
    offsets = 10 * (np.random.random((numverts,numpoly,2)) - 0.5)
    verts = centers + offsets
    verts = np.swapaxes(verts, 0, 1)
    
    # In your case, "verts" might be something like:
    # verts = zip(zip(lon1, lat1), zip(lon2, lat2), ...)
    # If "data" in your case is a numpy array, there are cleaner ways to reorder
    # things to suit.
    
    # Color scalar...
    # If you have rgb values in your "colorval" array, you could just pass them
    # in as "facecolors=colorval" when you create the PolyCollection
    z = np.random.random(numpoly) * 500
    
    fig, ax = plt.subplots()
    
    # Make the collection and add it to the plot.
    coll = PolyCollection(verts, array=z, cmap=mpl.cm.jet, edgecolors='none')
    ax.add_collection(coll)
    ax.autoscale_view()
    
    # Add a colorbar for the PolyCollection
    fig.colorbar(coll, ax=ax)
    plt.show()
    

    HTH,

    【讨论】:

    • 谢谢,很好的例子!我认为 PolyCollection 是关键。但是,我很困惑如何将我的 lons/lats 变成多边形。在你的情况下“verts”。
    • @JoeKington :很好的补充。不幸的是,我会因为你所有的辛勤工作而得到赞誉......
    【解决方案2】:

    我调整了我的代码,现在它可以完美运行了 :)

    以下是工作示例:

    lons = np.array([data['lon1'],data['lon3'],data['lon4'],data['lon2']])
    lats = np.array([data['lat1'],data['lat3'],data['lat4'],data['lat2']])
    x,y = m(lons,lats)
    pols = zip(x,y)
    pols = np.swapaxes(pols,0,2)
    pols = np.swapaxes(pols,1,2)
    coll = PolyCollection(pols,facecolor=colorval,cmap=jet,edgecolor='none',zorder=2)
    plt.gca().add_collection(coll)
    

    【讨论】:

    • 完美快速?与原来的 1.5 分钟相比,您节省了多少时间?
    • 现在需要 32 秒,所以它确实加快了速度!
    • 什么是m?添加导入/定义会很好。
    • @SkylarSaveland m 是一个底图对象(在 mpl_toolkits.basemap 模块中)。它可以将经度和纬度转换为坐标轴单位以绘制地图。
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2016-07-02
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多