【发布时间】:2014-09-06 14:36:39
【问题描述】:
我想使用 imshow(例如)在一个国家的边界内显示一些数据(出于示例的目的,我选择了美国)下面的简单示例说明了我想要的:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
data = np.arange(100).reshape(10, 10)
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(data)
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none',
ec='k', transform=ax.transAxes)
im.set_clip_path(poly)
ax.add_patch(poly)
ax.axis('off')
plt.show()
结果是:
现在我想这样做,但我想使用美国的复杂形状,而不是简单的多边形。我创建了一些包含在“Z”数组中的示例数据,如下面的代码所示。我想使用颜色图显示这些数据,但仅限于美国大陆边界内。
到目前为止,我已经尝试了以下方法。我从 here 获得了一个包含在“nationp010g.shp.tar.gz”中的形状文件,我使用 python 中的 Basemap 模块来绘制美国。请注意,这是我发现的唯一一种方法,它使我能够获得所需区域的多边形。如果有其他方法,我也会对它们感兴趣。然后我创建了一个名为“mainpoly”的多边形,它几乎就是我想要用蓝色着色的多边形:
注意只有一个物体被着色,所有其他不相交的多边形保持白色:
所以蓝色的区域几乎是我想要的,请注意加拿大附近有不需要的边界线,因为边界实际上穿过一些湖泊,但这是一个小问题。真正的问题是,为什么我的 imshow 数据不显示在美国境内?比较我的第一个和第二个示例代码,我不明白为什么我在第二个示例中没有像第一个示例那样得到剪辑的 imshow。理解我所缺少的任何帮助将不胜感激。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
# Lambert Conformal map of lower 48 states.
m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
shp_info = m.readshapefile('nationp010g/nationp010g', 'borders', drawbounds=True) # draw country boundaries.
for nshape,seg in enumerate(m.borders):
if nshape == 1873: #This nshape denotes the large continental body of the USA, which we want
mainseg = seg
mainpoly = Polygon(mainseg,facecolor='blue',edgecolor='k')
nx, ny = 10, 10
lons, lats = m.makegrid(nx, ny) # get lat/lons of ny by nx evenly space grid.
x, y = m(lons, lats) # compute map proj coordinates.
Z = np.zeros((nx,ny))
Z[:] = np.NAN
for i in np.arange(len(x)):
for j in np.arange(len(y)):
Z[i,j] = x[0,i]
ax = plt.gca()
im = ax.imshow(Z, cmap = plt.get_cmap('coolwarm') )
im.set_clip_path(mainpoly)
ax.add_patch(mainpoly)
plt.show()
更新
我意识到这条线
ax.add_patch(mainpoly)
甚至不将多边形形状添加到绘图中。我没有正确使用它吗?据我所知,mainpoly 是使用 Polygon() 方法正确计算的。我检查了坐标输入是否合理:
plt.plot(mainseg[:,0], mainseg[:,1] ,'.')
这给了
【问题讨论】:
-
我也很好奇为什么我的票数下降了。请告诉我,以便我改进!
-
你试过什么?你在问什么?问题真的是“我如何简化路径吗?” ?如果是这样,为什么路径是美国?你看过任何几何库吗?大概你想关闭切萨皮克湾,也许是长岛海峡,但不是墨西哥湾。这个问题是超级开放式的,没有表现出太多的研究努力,并且读作“请为我做我的工作,给我密码!!1!”对愤世嫉俗/脾气暴躁/厌倦的 SO 成员。
-
好的,我会更新更多信息,谢谢。
-
请查看我更新的问题。
-
这样好多了。
标签: python matplotlib gis shapefile matplotlib-basemap