如何用matplotlib的contourf实现阈值下固定颜色的等高线图
实现Matplotlib等高线图阈值分段着色
要实现阈值以下固定颜色、阈值以上渐变的等高线图,核心是自定义颜色映射和调整等高线层级,以下是具体实现方案:
步骤说明
- 自定义颜色映射:将阈值以下的区域设为固定颜色(比如黑色),阈值以上复用
viridis的渐变色彩。 - 分割等高线层级:以阈值为分界,低于阈值的区域用单一区间统一着色,高于阈值的区域用连续层级实现渐变。
修改后的代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap x = np.linspace(0, 50, 1000) y = np.linspace(0, 20, 1000) X, Y = np.meshgrid(x, y) Z = np.sin(X) + np.cos(Y) threshold = 1.03 # 构建自定义颜色映射 # 获取viridis的渐变色彩数组 viridis_colors = plt.cm.viridis(np.linspace(0, 1, 256)) # 阈值以下的固定黑色(RGBA格式) black = np.array([0, 0, 0, 1]) # 拼接颜色:黑色在前,viridis渐变在后 custom_colors = np.vstack([black[np.newaxis, :], viridis_colors]) custom_cmap = ListedColormap(custom_colors) # 设置等高线层级 # 低于阈值的区间:从Z最小值到阈值 lower_levels = [Z.min(), threshold] # 高于阈值的连续层级:从阈值到Z最大值,生成300个渐变点 upper_levels = np.linspace(threshold, Z.max(), 300) # 合并层级,避免重复的阈值 lvls = np.concatenate([lower_levels, upper_levels[1:]]) # 绘制等高线图 contour_plot = plt.contourf(X, Y, Z, levels=lvls, cmap=custom_cmap) colorbar = plt.colorbar(contour_plot) # 可选:调整色标刻度,突出阈值位置 colorbar.set_ticks([Z.min(), threshold, Z.max()]) plt.show()
关键细节解释
- 颜色映射:通过
ListedColormap拼接固定颜色和渐变色彩数组,确保阈值以下区域统一显示黑色。 - 层级设置:将阈值作为层级分割点,低于阈值的区域用
[Z.min(), threshold]单一区间,contourf会自动为该区间填充固定颜色;高于阈值的区域用连续层级,实现渐变效果。 - 层级必须严格递增,因此合并时要去掉
upper_levels中重复的阈值。
内容的提问来源于stack exchange,提问作者bubucodex
相关产品推荐
相关产品推荐

