使用matplotlib底图

时间:2016-03-01 14:32:33

标签: python matplotlib gis shapefile matplotlib-basemap

这是我的问题。

  • 由四个多边形组成的shapefile就是一个例子

使用:

fig = plt.figure(figsize =(8,6))
ax = plt.gca()
map =   Basemap(llcrnrlon=114.3,llcrnrlat=37.95,urcrnrlon=114.75,urcrnrlat=38.2)
map.readshapefile("xxx",'xxx',zorder =1,)
patches=[]
cs=plt.cm.Blues_r(np.arange(21)/21.)
for info, shape in zip(map.xxx_info, map.xxx):
    x,y=zip(*shape)
    patches.append( Polygon(np.array(shape), True) )  # facecolor= '#6582B3'
ax.add_collection(PatchCollection(patches, facecolor= cs,\
                  edgecolor='none', linewidths=1.5, zorder=2,alpha = 0.8))  

http://i13.tietuku.com/a331edcbeec29d5e.png

但是,当我想描绘这四个不同区域的某些特征时(例如:人口; GDP

### for example
pop = [1000,1500,2000,500] ## corresponding to 4 polygons. 

如何为显示相对人口规模的每个多边形设置facecolor

  

另一方面,人口较高的地区的蓝色为facecolor反之亦然

更新

我的项目有22个多边形(已上传here)和相应的功能

 VALUE = np.array([6152.710436, 21077.95313, 1052.05006, 2891.89123, 5717.184961,      
        2431.608241, 502.12633, 28384.79976, 0., 73919.84013, 6242.307304,     
        1072.474419, 35222.73927, 146232.4488, 4703.720773, 4080.297812,
        22897.91752, 2683.5972,   472.840926,  3367.341526,16628.64741 ,114564.1283  ])    

norm = Normalize()
cmap = plt.get_cmap('Spectral_r')
norm = Normalize()

cs_set =pc.set_facecolor(cmap(norm(VALUE)))
ax.add_collection(pc)  

http://i11.tietuku.com/256bce12e2716163.png

我的问题是如何根据VALUE添加颜色条?

我在答案中提到的post中尝试了这种方法,但它没有用。

cb = colorbar_index(ncolors=len(VALUE),cmap=cmap, shrink=0.5, labels=VALUE)
cb.ax.tick_params(labelsize=6)

http://i11.tietuku.com/fbfd19949c4ceddd.png

上图中的colorbar标签与真实数据不符?

如何解决这个问题?是否有更简单的方法来生成彩条?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。感谢您post

如果有人有更微妙的方式,请在这里发帖!

### original
for info, shape in zip(map.shiqu_info, map.shiqu):
    x,y=zip(*shape)
    patches.append( Polygon(np.array(shape), True) )  
pc = PatchCollection(patches, edgecolor='none', \    
                     linewidths=1.5, zorder=2,alpha = 0.8) 
## don't set facecolor here

## I add four sentences here!
cmap = plt.get_cmap('Blues')
norm = Normalize()
pop = np.array([1000,1500,2000,500])
pc.set_facecolor(cmap(norm(pop)))

ax.add_collection(pc)       

http://i11.tietuku.com/0a07095f88ba17ab.png