Cartopy网格线标签显示异常:隐藏右上标签后未达预期效果
解决Cartopy自定义边界地图网格标签显示异常问题
问题背景
绘制特定区域(西经80°至0°,北纬10°至60°)的Lambert投影地图,自定义矩形边界后,设置隐藏网格线的右侧和顶部标签,结果出现显示异常,无法仅保留左侧和底部标签。
原始效果与异常效果
未设置标签隐藏的初始图:
设置gl.right_labels = False和gl.top_labels = False后的异常图:
问题原因
自定义边界(ax.set_boundary)会干扰Cartopy网格线标签的自动定位逻辑,仅隐藏右侧和顶部标签的设置无法覆盖边界带来的定位偏差,导致标签显示异常。
解决方案
通过显式指定标签显示位置+固定刻度定位器来修正标签显示:
修改后的完整代码
from matplotlib.gridspec import GridSpec import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.path as mpath import cartopy.crs as ccrs from matplotlib.ticker import MultipleLocator, MaxNLocator import matplotlib.ticker as mticker n = 20 lon = np.linspace(-80, 0, n) lat = np.linspace(10, 60, n) ano = np.random.uniform(-4, 4, size=(n, n)) proj = ccrs.LambertConformal(central_longitude=-40, central_latitude=35.0) gs = GridSpec(2, 1, height_ratios=[1, 0.05]) matplotlib.rcParams.update({'font.size': 18}) fig = plt.figure(figsize=(6, 6), facecolor="w") ax = fig.add_subplot(gs[0, 0], projection=proj) # 定义自定义区域边界 aoi = mpath.Path(list(zip(np.linspace(-80, 0, n), np.full(n, 60))) + \ list(zip(np.full(n, 0), np.linspace(60, 10, n))) + \ list(zip(np.linspace(0, -80, n), np.full(n, 10))) + \ list(zip(np.full(n, -80), np.linspace(10, 60, n)))) ax.set_boundary(aoi, transform=ccrs.PlateCarree()) ax.set_extent((-80, 0, 10, 60)) # 配置网格线:明确指定标签显示位置+固定刻度 gl = ax.gridlines(draw_labels=True, linewidth=0.5, alpha=0.5, linestyle='--', rotate_labels=False, x_inline=False, y_inline=False) # 强制保留左侧和底部标签,隐藏其余 gl.left_labels = True gl.bottom_labels = True gl.right_labels = False gl.top_labels = False # 固定经纬度刻度,避免自定义边界导致的标签错位 gl.xlocator = mticker.FixedLocator(np.arange(-80, 10, 20)) gl.ylocator = mticker.FixedLocator(np.arange(10, 70, 10)) cmap = plt.get_cmap('RdYlBu_r', np.nanmax(ano) - np.nanmin(ano) + 1) s1 = ax.pcolormesh(lon, lat, ano, vmin=-4, vmax=4, cmap=cmap, transform=ccrs.PlateCarree()) ax.coastlines('50m') cax = fig.add_subplot(gs[1, 0]) cbar1 = plt.colorbar(s1, cax=cax, shrink=0.5, orientation="horizontal", format="$%.2f$", extend='both', pad=0.1) cax.xaxis.set_major_locator(MaxNLocator(nbins=5, prune='both')) cax.xaxis.set_major_formatter(mticker.FormatStrFormatter('%0.1f')) plt.show()
关键修改点
- 显式控制标签显示:不仅设置
right_labels和top_labels为False,还要主动开启left_labels和bottom_labels为True,确保自定义边界下标签不会被自动隐藏 - 固定刻度定位:用
FixedLocator指定经纬度刻度的间隔(比如经度每20°、纬度每10°),让网格线和标签在自定义边界内均匀分布,避免错位 - 保留原始样式参数:维持
rotate_labels=False等设置,匹配初始需求的标签显示风格
内容的提问来源于stack exchange,提问作者Thib Ödlaniug
相关产品推荐
相关产品推荐

