Python contourf函数Gamma校正增强低值区并保留原值色标方案咨询
实现方法
核心是直接使用Matplotlib内置的PowerNorm实现Gamma数值映射,不需要手动转换原始数据,Colorbar会自动显示原始数值,同时满足你用contourf的需求。
完整修改后代码
import numpy as np import matplotlib.pyplot as plt from matplotlib import colors # 此处保留你读取DoP矩阵的原有代码 # --------------------------自定义参数-------------------------- gamma = 0.3 # 取值小于1,可根据显示效果调整,值越小低值区域差异越突出 vmin = 0 max_DoP = DoP.max() vmax = max_DoP # 生成Gamma变换空间下均匀分布的levels,逆变换回原始值作为等高线阈值 # 保证低值区域等高线更密,符合突出低值的需求 y_levels = np.linspace(vmin**gamma, vmax**gamma, 100) x_levels = y_levels ** (1/gamma) # --------------------------坐标处理-------------------------- umu = [0.99999,0.99452,0.98481,0.96593,0.93969,0.90631,0.86603,0.81915,0.76604,0.70711, 0.64279,0.57358,0.50000,0.42262,0.34202,0.25882,0.17365,0.08716,0.00000] umu = umu[::-1] umu = np.multiply(umu,-1) umu = np.arccos(umu) umu = np.pi - umu phi = np.arange(0,375,15) phi = phi * np.pi / 180 # --------------------------绘图-------------------------- fig = plt.figure(figsize=(8,8)) ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True) # 核心修改:指定norm参数为PowerNorm,levels用原始值空间的非均匀阈值 contourf_obj = ax.contourf(phi, umu * 180/np.pi, DoP, cmap='jet', levels=x_levels, norm=colors.PowerNorm(gamma=gamma, vmin=vmin, vmax=vmax)) plt.rc('font', size=32) ax.grid(linewidth=2) ax.xaxis.set_tick_params(pad=28) # 直接传入contourf对象,Colorbar自动显示原始数值 plt.colorbar(contourf_obj, orientation="vertical", fraction=0.09, anchor=(2.0,0.0)) plt.savefig('DoP.png', bbox_inches='tight') # 加bbox_inches避免Colorbar被截断 plt.show()
注意事项
- 已修正原有代码的两处bug:
max_DoP定义顺序错误、phi重复转弧度的问题,可直接运行 - 若不需要等高线在Gamma空间均匀分布,仅需要颜色映射做Gamma变换,可删除自定义
x_levels的代码,直接用原始均匀levels,仅保留norm参数即可 gamma推荐在0.2~0.6区间调试,找到最符合你数据的低值突出效果
内容的提问来源于stack exchange,提问作者Yannick
相关产品推荐
相关产品推荐

