2017-10-10 148 views
0

我一直在python中使用matplotlib的底图很长一段时间了,但是正在建立一段新的代码,并且遇到了这个非常奇怪的异常,不知道如何绕过它。Matplotlib底图多边形抛出一个错误,但成功,如果有东西被绘制

如果我有,我想用(lonList,latList)show命令与分配错误绘制多边形时将抛出一个错误matplotlib绘制多边形。或者在另一台机器上,我发现它会画出一个空白屏幕。

但是,如果我使用相同的列表并添加散点图(下面的注释行),它将起作用。此外,如果我自己绘制一条线或散点图,它将起作用,但是自行绘制多边形修补程序失败。我不知道这是为什么,也找不到任何错误报告。请帮忙?

顺便说一下,我运行Debian Jessie 8与Python 2.7,如果有帮助。

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from matplotlib.collections import PatchCollection 
from matplotlib.patches  import Polygon 

def singlePatchExample(): 
    patches = [] 
    fig = plt.figure(figsize=(19.2,10.8)) 
    ax = plt.subplot(111) 

    lonSW = -8.0 
    latSW = 51.0 
    lonNE = -6.0 
    latNE = 53.0 
    centLon = (lonSW + lonNE)/2.0 
    centLat = (latSW + latNE)/2.0 

    baseMap = Basemap(llcrnrlon=lonSW,llcrnrlat=latSW,urcrnrlon=lonNE,urcrnrlat=latNE,\ 
       resolution='i', lat_0 = centLon, lon_0 = centLat) 

    longList = [ -7.0, -7.5, -7.7 ] 
    latList = [ 51.5, 52.0, 52.5 ] 

    x, y = baseMap(longList, latList) 
    polygon = Polygon(zip(x,y), True) 
    patches.append(polygon) 

    patchInSingleImage = PatchCollection(patches, alpha=0.2) 
    ax.add_collection(patchInSingleImage) 
    ax.set_title("Single Patch Example, (without points????)") 

    #baseMap.scatter(x, y, color='r') 

    plt.show() 

singlePatchExample() 

回答

2

运行代码时,我得到一个带有轴的图形,但没有显示多边形。这实际上应该与底图一样。原因在于,当轴内唯一的艺术家是PatchCollection(或者可能只是任何集合)时,matplotlib不会自动缩放。

在这种情况下,解决办法是增加集合后添加

ax.autoscale() 

重点是因为地图上实际上没有任何东西,缩放需要由matplotlib轴接管。您可以通过将不需要的零线宽绘制到地图来确保地图实际上已连接到坐标轴。

baseMap.drawrivers(linewidth=0) 

这将使ax.autoscale()多余的,将缩放地图,就好像它有就可以了一些数据。同样,绘制平行线或经线也会产生相同的效果 - 只是实际将地图绘制到坐标轴上的任何东西。

baseMap.drawparallels(latList) 
+0

感谢这项工作,但我如何保留原来的SW,NE边界。这对保存也很重要。我仍然认为它值得+1,因为我甚至无法猜测这一点。它仍然看起来像一个bug。 –

+0

那么,只要你没有在地图上定位,就不会显示地图。只要确保在轴上有地图。我用一些可能的选项更新了答案。 – ImportanceOfBeingErnest