如何在Lambert等面积圆锥投影地图中扩展边界并保留经纬网?
解决Lambert等面积圆锥投影下经纬网及标签消失的问题
核心原因
指定视图范围或添加等深线后经纬网消失,通常是因为投影坐标与经纬度范围不匹配导致自动裁剪,或是绘图层级覆盖,亦或是经纬网的自动生成逻辑未适配当前视图范围。
针对性解决方法
1. 用投影坐标而非经纬度设置视图范围
直接用经纬度设置xlim/ylim会导致投影系统无法正确识别边界,需先将目标经纬度范围转换为投影坐标,再设置视图边界。
2. 调整绘图层级与顺序
确保经纬网绘制在等深线、地图图层之上,通过zorder参数控制显示层级,避免被覆盖。
3. 显式指定经纬网生成范围
不要依赖自动计算,手动指定经纬线的经纬度范围,确保在当前视图内有可显示的经纬线。
示例代码(Basemap版本)
from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt # 初始化Lambert等面积圆锥投影 m = Basemap(projection='laea', lat_0=30, lon_0=120, resolution='l') # 绘制基础海岸线 m.drawcoastlines() # 转换目标经纬度范围为投影坐标(示例:东经100-140,北纬20-40) x_left, y_bottom = m(100, 20) x_right, y_top = m(140, 40) # 基于投影坐标设置视图范围 m.xlim(min(x_left, x_right), max(x_left, x_right)) m.ylim(min(y_bottom, y_top), max(y_bottom, y_top)) # 绘制等深线(以海陆掩码为例,可替换为实际等深线数据) m.drawlsmask(land_color='white', ocean_color='lightblue') # 显式指定经纬网范围,设置zorder确保显示在顶层 m.drawmeridians(range(100, 141, 10), labels=[0,0,0,1], zorder=5) m.drawparallels(range(20, 41, 5), labels=[1,0,0,0], zorder=5) # 绘制物种分布点 lon_list, lat_list = [110, 120, 130], [25, 30, 35] x_points, y_points = m(lon_list, lat_list) m.scatter(x_points, y_points, c='red', s=50, zorder=10) plt.show()
示例代码(Cartopy版本,更推荐的现代库)
import cartopy.crs as ccrs import matplotlib.pyplot as plt import cartopy.feature as cfeature # 初始化Lambert等面积圆锥投影 proj = ccrs.LambertAzimuthalEqualArea(central_latitude=30, central_longitude=120) ax = plt.axes(projection=proj) # 设置视图范围,指定输入为经纬度坐标系 ax.set_extent([100, 140, 20, 40], crs=ccrs.PlateCarree()) # 绘制海岸线与海洋(替代等深线示例) ax.coastlines(resolution='110m') ax.add_feature(cfeature.OCEAN, color='lightblue') # 添加经纬网,指定经纬度坐标系生成标签 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linestyle='--', zorder=5) # 关闭顶部和右侧的冗余标签 gl.top_labels = False gl.right_labels = False # 绘制物种分布点,指定点的坐标系为经纬度 lon_list, lat_list = [110, 120, 130], [25, 30, 35] ax.scatter(lon_list, lat_list, c='red', s=50, transform=ccrs.PlateCarree(), zorder=10) plt.show()
内容的提问来源于stack exchange,提问作者Luther Blissett
相关产品推荐
相关产品推荐

