Matplotlib绘制热力图色条显示数值范围 如何调整为仅显示单一值
问题描述
使用所有元素取值完全相同的数组T绘制热力图时,生成的colorbar(色条)默认会显示一段数值范围,需要调整设置让色条仅显示唯一值0.01109。
复现代码
import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable import matplotlib.pyplot as plt T=np.array([[0.01109, 0.01109, 0.01109], [0.01109, 0.01109, 0.01109], [0.01109, 0.01109, 0.01109]]) fig, ax = plt.subplots() im = ax.imshow(T) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) plt.colorbar(im, cax=cax) ax.set_title('\u03C3' ' ' "(N/m)")
异常效果

解决方案
该现象的触发逻辑是:当传入imshow的数组所有值完全一致时,matplotlib会自动将颜色映射的数值范围向外扩展1个单位量级,导致色条显示一段区间而非单个值。
通过以下设置即可实现需求:
- 调用
imshow时显式指定vmin和vmax参数,将颜色映射范围设为紧邻目标值的极小区间,避免框架自动扩展范围,同时视觉上色条为纯色块 - 调用
colorbar时通过ticks参数指定仅显示目标值的刻度,可按需格式化刻度避免浮点显示误差
修改后的可运行代码:
import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable import matplotlib.pyplot as plt T=np.array([[0.01109, 0.01109, 0.01109], [0.01109, 0.01109, 0.01109], [0.01109, 0.01109, 0.01109]]) fig, ax = plt.subplots() # 提取数组唯一值,固定颜色映射范围为极小区间 target_val = T[0, 0] im = ax.imshow(T, vmin=target_val - 1e-10, vmax=target_val + 1e-10) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) # 指定色条仅展示目标值刻度 cb = plt.colorbar(im, cax=cax, ticks=[target_val]) # 统一刻度格式化规则,避免浮点显示偏差 cb.formatter.set_powerlimits((0, 0)) cb.update_ticks() ax.set_title('\u03C3' ' ' "(N/m)") plt.show()
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

