如何在Matplotlib中设置非周期性增量的Y轴刻度
解决Matplotlib中Y轴刻度错位问题(非均匀参数网格)
问题原因
你的代码使用imshow时,通过extent将Y轴范围设为0到parb_increment[-1],但imshow会将35行数据均匀分布在这个范围内。而参数B的取值是非均匀的(比如16、18、20后连续到33,再间隔5到125),导致手动设置的parb_increment刻度位置和数据行的实际位置不匹配,出现错位。
解决方案
方案一:保留imshow,手动映射行索引到参数标签
直接将行索引作为刻度位置,替换为参数B的实际数值,确保每行对应正确的标签:
import matplotlib.pyplot as plt import numpy as np # 生成测试数据(替换为你的实际x数组) x = np.random.rand(35, 225) # Define parameter B values parb_increment = [16, 18, 20] + list(range(21,34)) + list(range(35,126,5)) # Figure and axes figure, axes = plt.subplots(figsize=(10, 8)) # Plotting:去掉extent的Y范围设置,使用默认行索引映射 im = axes.imshow(x, aspect='auto', origin="lower", cmap='Blues', interpolation='none') # 正确设置Y轴刻度:行索引对应参数B的数值 axes.set_yticks(range(len(parb_increment)), labels=parb_increment) # 调整Y轴范围,让刻度与行边缘对齐 axes.set_ylim(-0.5, len(parb_increment)-0.5) # Colorbar cb = figure.colorbar(im, ax=axes) plt.show()
方案二:使用pcolormesh适配非均匀网格(更推荐)
pcolormesh支持非均匀坐标轴网格,能准确匹配参数B的非均匀取值:
import matplotlib.pyplot as plt import numpy as np # 生成测试数据(替换为你的实际x数组) x = np.random.rand(35, 225) # Define parameter B values parb_increment = [16, 18, 20] + list(range(21,34)) + list(range(35,126,5)) # 参数A的网格边缘(0到225共225列,需要226个边缘点) parA_edges = np.arange(0, 226) # 计算参数B的网格边缘(35行需要36个边缘点,取相邻B值的中点作为边界) parB_edges = np.concatenate([ [parb_increment[0] - (parb_increment[1]-parb_increment[0])/2], (parb_increment[:-1] + parb_increment[1:])/2, [parb_increment[-1] + (parb_increment[-1]-parb_increment[-2])/2] ]) # Figure and axes figure, axes = plt.subplots(figsize=(10, 8)) # 使用pcolormesh绘制非均匀网格 im = axes.pcolormesh(parA_edges, parB_edges, x, cmap='Blues', edgecolors='none') # 设置Y轴刻度为参数B的实际数值 axes.set_yticks(parb_increment) # Colorbar cb = figure.colorbar(im, ax=axes) plt.show()
内容的提问来源于stack exchange,提问作者Arturo Rodriguez
相关产品推荐
相关产品推荐

