在matplotlib中用颜色填充shapefile多边形 [英] Filling shapefile polygons with a color in matplotlib

查看:188
本文介绍了在matplotlib中用颜色填充shapefile多边形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种基于值填充shapefile多边形的方法. 到目前为止与底图教程( http://basemaptutorial.readthedocs.io/en/latest/shapefile.html ),我发现了如何用特定颜色填充多边形.

I am searching way to fill polygons of a shapefile based on a value. So far from basemap tutorial (http://basemaptutorial.readthedocs.io/en/latest/shapefile.html) i 've found how to fill the polygons with a specific color.

import matplotlib.pyplot as plt
import pypyodbc
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from matplotlib.patches import PathPatch
import numpy as np

fig= plt.figure()
ax= fig.add_subplot(111)
m=Basemap(projection='cyl',llcrnrlat=34.5,llcrnrlon=19,urcrnrlat=42,urcrnrlon=28.5,resolution='h')
m.drawmapboundary(fill_color='aqua')
m.fillcontinents(color='#ddaa66',lake_color='aqua')
m.drawcoastlines()
m.readshapefile('nomoi','nomoi')

patches   = []

for info, shape in zip(m.nomoi_info, m.nomoi):
    if info['ID_2'] == 14426:
        patches.append( Polygon(np.array(shape), True) )

ax.add_collection(PatchCollection(patches, facecolor='m', edgecolor='k', linewidths=1., zorder=2))

plt.show()

我想做的是从这样的字典中获取值:

What I would like to do is taking values from a dictionary such as this:

dict1={14464: 1.16, 14465: 1.35, 14466: 1.28, 14467: 1.69, 14468: 1.81, 14418: 1.38}

,其中的键是shapefile中的info ['ID_2']列,如上面的代码所示,值是我要表示为颜色的变量.意味着具有一个从1.16到1.81的颜色映射,并且每个多边形(ID_2)都具有与dict1的值相关的颜色.

in which the keys are the info['ID_2'] column from the shapefile as in the code presented above and the values are the variable that i want to represent to color. Meaning to have a colormap varying from 1.16 to 1.81 and each polygon (ID_2) to have a color related to it's value from dict1.

预先感谢

推荐答案

似乎您想在底图中生成一个Choropleth图.
为此,您需要一个颜色映射cmap和一个规范化norm以便将值映射到颜色cmap(norm(val)).对于每种形状,可以将Polygon的颜色设置为词典中的相应颜色,在这种情况下为cmap(norm(dict1[info['ID_2']])).

It seems you want to produce a choropleth plot in basemap.
To this end you need a colormap cmap and a normalization norm in order to map values to colors, cmap(norm(val)). For each shape one may than set the Polygon's color to the respective color from the dictionary, in this case cmap(norm(dict1[info['ID_2']])).

PatchCollection内,需要设置match_original=True以保留原始多边形的颜色.

Inside the PatchCollection the match_original=True needs to be set to keep the colors from the original polygons.

最后,从颜色图和规范化中生成颜色图可能很有用.

At the end it may be useful to produce a colormap from the colormap and the normalization.

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

fig= plt.figure()
ax= fig.add_subplot(111)
m=Basemap(projection='cyl',llcrnrlat=34.5,llcrnrlon=19,
                           urcrnrlat=42,urcrnrlon=28.5,resolution='h')
m.drawmapboundary(fill_color='aqua')
m.fillcontinents(color='w',lake_color='aqua')
m.drawcoastlines()
m.readshapefile('data/nomoi/nomoi','nomoi')

dict1={14464: 1.16, 14465: 1.35, 14466: 1.28, 14467: 1.69, 14468: 1.81, 14418: 1.38}
colvals = dict1.values()

cmap=plt.cm.RdYlBu
norm=plt.Normalize(min(colvals),max(colvals))

patches   = []

for info, shape in zip(m.nomoi_info, m.nomoi):
    if info['ID_2'] in list(dict1.keys()):
        color=cmap(norm(dict1[info['ID_2']]))
        patches.append( Polygon(np.array(shape), True, color=color) )

pc = PatchCollection(patches, match_original=True, edgecolor='k', linewidths=1., zorder=2)
ax.add_collection(pc)

#colorbar
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array(colvals)
fig.colorbar(sm, ax=ax)

plt.show()

这篇关于在matplotlib中用颜色填充shapefile多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆