Matplotlib绘制多波段栅格图时x轴刻度设置异常问题
问题判定
你写的ax.set_xticklabels相关代码确实无法实现x轴波段标识显示的需求,运行触发警告、图表不符合预期的原因有三个:
- 传入的参数是包裹了生成器的单元素列表,Matplotlib无法解析生成器内部的内容,只会把整个生成器对象作为唯一标签,不可能生成4个独立刻度
- 直接调用
set_xticklabels前没有显式指定刻度位置,会触发Matplotlib固定定位器相关的官方警告,这是运行时弹警告的直接原因 - 原代码的标签生成逻辑仅能生成1开始的连续数字,和你需要显示的对应波段标识没有映射关系,就算能正常渲染也不符合业务需求。
另外你代码里循环外初始化的n = 1和循环结束后的n = n+1是无效冗余代码,不会对绘图产生任何影响,可以直接删除。
简便正确实现方案
不需要手动硬编码刻度标签,你定义的band_n列表里每个元素本身就存储了当前子图对应的4个波段号,直接解析提取即可,逻辑简单不会出错。
把原循环内的x轴设置部分替换为如下代码即可:
import re # 获取当前子图对应的数据列数,和波段数量一一对应 col_num = len(band_val.columns) # 先显式设置x轴刻度位置,彻底消除警告 ax.set_xticks(range(col_num)) # 直接从当前循环的波段规则字符串里提取所有波段数字作为x轴标签 current_band_labels = re.findall(r'\d+', ba) ax.set_xticklabels(current_band_labels)
如果你不需要显示真实波段号,只想显示1~4的序号,把标签生成部分替换为列表推导式即可,不要使用生成器:
ax.set_xticklabels([str(idx) for idx in range(1, col_num+1)])
完整修正后代码参考
import re import matplotlib.pyplot as plt prof = train_pts.groupby(['classes']).mean() fig = plt.figure(figsize=(17,20)) band_n = [ 'Band [33,36,39,40]', 'Band [2,6,11,16]', 'Band [3,7,12,17]', 'Band [4,8,13,30]', 'Band [20,22,14,26]', 'Band [2,26,11,30]','Band [2,26,11,30]'] band_name = ['B2', 'B3', 'B4', 'B8', 'NDVI', 'VV', 'VH'] for i, ba in enumerate(band_n): ax = fig.add_subplot(4, 2, i + 1) ax.set_title(band_name[i]) # 筛选当前波段组对应的数据 band_val = prof[prof.columns[prof.columns.to_series().str.contains(ba)]] # 绘制各类别曲线 for index, row in band_val.iterrows(): ax.plot(row, color=cmap(index)) # 配置x轴刻度 col_num = len(band_val.columns) ax.set_xticks(range(col_num)) ax.set_xticklabels(re.findall(r'\d+', ba)) # 添加图例 ax.legend(loc='best', fontsize='small', ncol=1, labels=class_names) # 自动调整子图间距,避免标签、标题重叠 plt.tight_layout() plt.show()
修正后每个子图x轴会正好显示4个刻度,标签对应当前组的真实波段号,无运行警告,图表符合预期。
内容的提问来源于stack exchange,提问作者Gulnihal
相关产品推荐
相关产品推荐

