如何在Matplotlib中基于数值填充Shapefile多边形颜色
如何根据数值为Shapefile多边形填充渐变颜色?
没问题,我来帮你实现根据字典数值给对应ID的多边形分配渐变颜色的需求。核心思路是利用Matplotlib的**颜色映射(Colormap)和数值归一化(Normalize)**工具,把你的数值范围映射到对应的颜色区间,然后逐个匹配多边形的ID来分配颜色。
步骤说明与修改后的代码
首先,我们需要额外导入matplotlib.colors.Normalize来处理数值归一化,然后通过Matplotlib内置的颜色映射来生成对应颜色。另外,还可以添加颜色条来直观展示数值和颜色的对应关系:
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.colors import Normalize # 新增:用于数值归一化 import numpy as np # 你的数值字典 dict1 = {14464: 1.16, 14465: 1.35, 14466: 1.28, 14467: 1.69, 14468: 1.81, 14418: 1.38} fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111) # 初始化Basemap 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') # 1. 处理数值范围:获取字典中数值的最大最小值,用于归一化 vmin = min(dict1.values()) vmax = max(dict1.values()) # 2. 创建归一化对象和颜色映射 norm = Normalize(vmin=vmin, vmax=vmax) # 可以选择其他内置颜色映射,比如plt.cm.plasma、plt.cm.jet,或者自定义 cmap = plt.cm.viridis patches = [] colors = [] # 3. 遍历多边形,匹配ID并分配对应颜色 for info, shape in zip(m.nomoi_info, m.nomoi): id_2 = info['ID_2'] if id_2 in dict1: # 根据数值获取对应的颜色 color = cmap(norm(dict1[id_2])) patches.append(Polygon(np.array(shape), True)) colors.append(color) # 4. 创建PatchCollection并添加到轴上 pc = PatchCollection(patches, edgecolor='k', linewidths=1., zorder=2) pc.set_facecolors(colors) # 设置每个多边形的填充色 ax.add_collection(pc) # 5. 添加颜色条,展示数值与颜色的对应关系 sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) # 只需要关联归一化和颜色映射,不需要数据数组 plt.colorbar(sm, ax=ax, label='数值') plt.show()
关键部分解释
- 数值归一化:
Normalize(vmin=vmin, vmax=vmax)会把你的数值范围(1.16到1.81)映射到0到1之间,这样颜色映射才能正确对应到整个颜色区间。 - 颜色映射:
plt.cm.viridis是Matplotlib内置的一款色盲友好的颜色映射,你可以根据需求换成其他内置映射,比如plt.cm.plasma、plt.cm.RdYlBu等。 - 颜色匹配:遍历每个多边形时,检查
ID_2是否在你的字典中,如果存在,就通过cmap(norm(数值))得到对应的RGBA颜色值。 - 颜色条:通过
ScalarMappable把归一化和颜色映射关联起来,生成颜色条,让观看者能快速理解颜色对应的数值含义。
这样修改后,每个匹配ID_2的多边形都会根据字典里的数值填充对应的渐变颜色啦!
内容的提问来源于stack exchange,提问作者Ignatios Chatzidiamantis
相关产品推荐
相关产品推荐

