Matplotlib 底图多边形抛出错误,但如果绘制了某些内容则成功
Matplotlib basemap polygon throws an error but succeeds if something is plotted
我在 python 中使用带有 matplotlib 的底图已经有一段时间了,但是在构建一段新代码时遇到了这个非常奇怪的异常现象,我不知道如何解决它。
如果我有一个多边形,我想使用 (lonList,latList) 在 matplotlib 中绘制,show 命令在绘制多边形时会抛出一个分配错误的错误。或者在另一台机器上我看到它会绘制一个空白屏幕。
但是,如果我使用相同的列表并添加一个散点图(下面的注释行),它将起作用。此外,如果我单独绘制一条线或散点图,它会起作用,但单独绘制多边形补丁会失败。我不知道为什么会这样,也找不到任何关于它的错误报告。请帮忙?
顺便说一句,如果有帮助的话,我是 运行 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()
当 运行 代码时,我得到一个带轴的图形,但没有显示多边形。这在有和没有底图的情况下实际上应该是一样的。原因是当轴内的唯一艺术家是 PatchCollection(或者可能只是任何 collection)时,matplotlib 不会自动缩放。
这种情况下的解决方案是添加
ax.autoscale()
添加 collection 之后。
要点是,由于地图上实际上没有任何东西,所以缩放需要由 matplotlib 轴接管。您可以通过在地图上绘制零线宽的不需要的东西来确保地图实际上已连接到坐标区。
baseMap.drawrivers(linewidth=0)
这会使 ax.autoscale()
变得多余,并且会缩放地图,就好像它上面有一些数据一样。同样,绘制平行线或子午线会产生相同的效果 - 只是任何实际将地图绘制到轴上的东西。
baseMap.drawparallels(latList)
我在 python 中使用带有 matplotlib 的底图已经有一段时间了,但是在构建一段新代码时遇到了这个非常奇怪的异常现象,我不知道如何解决它。
如果我有一个多边形,我想使用 (lonList,latList) 在 matplotlib 中绘制,show 命令在绘制多边形时会抛出一个分配错误的错误。或者在另一台机器上我看到它会绘制一个空白屏幕。
但是,如果我使用相同的列表并添加一个散点图(下面的注释行),它将起作用。此外,如果我单独绘制一条线或散点图,它会起作用,但单独绘制多边形补丁会失败。我不知道为什么会这样,也找不到任何关于它的错误报告。请帮忙?
顺便说一句,如果有帮助的话,我是 运行 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()
当 运行 代码时,我得到一个带轴的图形,但没有显示多边形。这在有和没有底图的情况下实际上应该是一样的。原因是当轴内的唯一艺术家是 PatchCollection(或者可能只是任何 collection)时,matplotlib 不会自动缩放。
这种情况下的解决方案是添加
ax.autoscale()
添加 collection 之后。
要点是,由于地图上实际上没有任何东西,所以缩放需要由 matplotlib 轴接管。您可以通过在地图上绘制零线宽的不需要的东西来确保地图实际上已连接到坐标区。
baseMap.drawrivers(linewidth=0)
这会使 ax.autoscale()
变得多余,并且会缩放地图,就好像它上面有一些数据一样。同样,绘制平行线或子午线会产生相同的效果 - 只是任何实际将地图绘制到轴上的东西。
baseMap.drawparallels(latList)