Matplotlib底图多边形会抛出错误,但如果绘制了某些内容则会成功

时间:2017-10-10 14:10:19

标签: python matplotlib plot patch matplotlib-basemap

我已经在python中使用了matplotlib的底图已经有一段时间了,但是正在构建一段新的代码并遇到了这个非常奇怪的异常,我不知道如何绕过它。

如果我想在matplotlib中使用(lonList,latList)绘制多边形,则在绘制具有分配错误的多边形时,show命令将引发错误。或者在另一台机器上,我看到它将绘制一个空白屏幕。

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

顺便说一句,如果有帮助,我会使用python 2.7运行Debian Jessie 8。

#!/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()

1 个答案:

答案 0 :(得分:2)

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

在这种情况下的解决方案是添加

ax.autoscale() 
添加集合后

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

baseMap.drawrivers(linewidth=0)

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

baseMap.drawparallels(latList)