如何为Geopandas结合Rasterio绘制的韩国地形添加色阶条?
给Cartopy+Rasterio绘制的地形图像添加色阶条
要实现低海拔蓝色、高海拔渐变的地形色阶条,核心是结合**matplotlib的colorbar()**函数,配合地形绘图时的色彩映射(colormap)完成。以下是具体修改方案和代码示例:
关键修改步骤
- 保留绘图对象:调用
rasterio.plot.show()时,接收返回的图像对象(im),供色阶条绑定使用。 - 选择/自定义配色:用matplotlib自带的地形色卡(如
terrain)或自定义渐变,实现低蓝高棕的效果。 - 添加并配置色阶条:通过
plt.colorbar()关联图像对象,设置标签、方向、刻度等样式。
修改后的完整代码
import rasterio import cartopy.crs as ccrs import geopandas as gpd import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap # 读取DEM数据(替换为你的文件路径) with rasterio.open('korea_dem.tif') as src: dem_data = src.read(1) # 处理NoData值,避免色阶异常 dem_data = dem_data.astype(float) dem_data[dem_data == src.nodata] = float('nan') bounds = src.bounds # 初始化Cartopy绘图轴 fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()}) # 方案1:使用matplotlib自带地形色卡(低蓝高棕,无需自定义) # im = rasterio.plot.show(dem_data, ax=ax, transform=ccrs.PlateCarree(), extent=bounds, cmap='terrain', vmin=dem_data.min(), vmax=dem_data.max()) # 方案2:自定义渐变配色(更灵活) colors = ['#0055ff', '#00aa88', '#ffffcc', '#dd8844', '#884422'] custom_cmap = LinearSegmentedColormap.from_list('korea_terrain', colors, N=100) im = rasterio.plot.show( dem_data, ax=ax, transform=ccrs.PlateCarree(), extent=bounds, cmap=custom_cmap, vmin=dem_data.min(), vmax=dem_data.max() ) # 叠加韩国边界(替换为你的边界文件路径) korea_bound = gpd.read_file('korea_boundary.shp') korea_bound.plot(ax=ax, edgecolor='black', facecolor='none', linewidth=1) # 添加色阶条 cbar = plt.colorbar( im, ax=ax, orientation='horizontal', # 可选'vertical'改为垂直放置 pad=0.05, shrink=0.8 ) cbar.set_label('Elevation (m)', fontsize=12) cbar.ax.tick_params(labelsize=10) # 调整绘图样式 ax.set_title('Korea Terrain Elevation', fontsize=14) ax.gridlines(draw_labels=True, linestyle='--', alpha=0.5) plt.tight_layout() plt.show()
注意事项
- 无效值处理:必须将DEM中的NoData值转为
float('nan'),否则色阶条会出现异常刻度或色块。 - 投影一致性:确保
rasterio.plot.show()的transform参数与Cartopy轴的投影匹配,避免图像错位。 - 色阶范围:通过
vmin和vmax手动设置海拔范围,可以让配色更贴合韩国地形的实际起伏。
内容的提问来源于stack exchange,提问作者FANA
相关产品推荐
相关产品推荐

