如何为matplotlib imshow绘图制作适配3维数组的自定义colorbar
问题解决步骤
1. 三维数组降维处理
你当前使用的ex数组维度为(60,60,1),多了最后一个冗余维度,直接用numpy的squeeze方法去掉即可适配二维绘图要求:
ex = np.squeeze(ins[1]) # 处理后数组维度变为(60,60)
2. 修正自定义配色与绘图代码
你之前的实现存在两个核心错误:
- 归一化参数
vmin和vmax写反,且和你需要的刻度范围不匹配 contourf的x、y入参长度和数组维度不匹配
完整可运行修正代码:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable import matplotlib as mpl # 数据读取与预处理 ins = np.load('ins.npy') ex = np.squeeze(ins[1]) # 自定义分段色阶与归一化 levels = [20,35,45,55,65,75] colors = ["#eaa941", "#efef39", "#53a447", "#3b387f", "#48a2ba"] cmap = mpl.colors.ListedColormap(colors) cmap.set_under("crimson") cmap.set_over("w") # 使用BoundaryNorm适配分段配色,更符合气象填色图逻辑 norm = mpl.colors.BoundaryNorm(levels, ncolors=cmap.N, extend='both') # 绘图 ax = plt.gca() # 若使用imshow绘图用下行代码 im = ax.imshow(ex, cmap=cmap, norm=norm) # 若偏好contourf绘图,替换上一行即可: # im = ax.contourf(ex, levels=levels, extend='both', cmap=cmap, norm=norm) # 添加自定义colorbar divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) cbar = plt.colorbar(im, cax=cax, ticks=levels) # 可按需修改colorbar的标签名称 cbar.set_label('对应物理量名称') plt.show()
补充说明
如果你的图像需要自定义坐标范围而非默认的0-59,可给imshow添加extent=[x最小值, x最大值, y最小值, y最大值]参数调整即可。
内容的提问来源于stack exchange,提问作者McM
相关产品推荐
相关产品推荐

