问题描述
我正在寻找一种基于值填充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多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!