如何为pcolormesh设置全局颜色刻度,实现跨数据集颜色一致?
统一pcolormesh多图颜色刻度的解决方案
要让多个数据集的pcolormesh图像使用全局统一的颜色映射规则(比如固定数值4对应黄色),核心是固定归一化的数值范围,避免每个图自动使用自身数据的范围缩放。具体步骤如下:
1. 确定全局数值范围
你有两种方式确定范围:
- 自动计算:收集所有数据集的最小/最大值,确保覆盖所有数据
- 手动指定:如果你明确知道数据的取值区间(比如0-8),直接设定即可
自动计算全局范围示例
import numpy as np # 假设你把所有STFT结果存在Zxx_list里,比如[Zxx1, Zxx2, Zxx3] global_min = min(np.min(z) for z in Zxx_list) global_max = max(np.max(z) for z in Zxx_list)
手动指定范围示例
如果你要让数值4对应黄色(通常是colormap的中间色),可以把范围设为vmin=0、vmax=8,这样4刚好在中间位置:
global_min = 0 global_max = 8
2. 修改绘图代码,应用全局归一化
在pcolormesh的norm参数里,给PowerNorm加上固定的vmin和vmax,确保所有图使用同一套映射规则:
import matplotlib.pyplot as plt from matplotlib import colors from scipy import signal # 先定义全局归一化规则(放在所有绘图代码之前) global_norm = colors.PowerNorm(gamma=1./8., vmin=global_min, vmax=global_max) global_cmap = plt.get_cmap(cmap) # cmap是你用的颜色映射,比如'viridis' # 绘制第一个数据集的STFT f1, t1, Zxx1 = signal.stft(inputSignal1, samplingFreq, window=window, nperseg=nperseg) fig1 = plt.figure(figsize=figsize, dpi=100) spec1 = plt.pcolormesh(t1, f1, Zxx1, norm=global_norm, cmap=global_cmap) plt.colorbar(spec1) # 颜色条也会自动使用全局范围 # 绘制第二个数据集的STFT f2, t2, Zxx2 = signal.stft(inputSignal2, samplingFreq, window=window, nperseg=nperseg) fig2 = plt.figure(figsize=figsize, dpi=100) spec2 = plt.pcolormesh(t2, f2, Zxx2, norm=global_norm, cmap=global_cmap) plt.colorbar(spec2)
原理说明
默认情况下PowerNorm会自动将当前数据集的最小值映射为0、最大值映射为1,导致不同图的颜色刻度不统一。当你指定vmin和vmax后,所有图都会把vmin到vmax区间的数值统一缩放到0-1后再应用gamma校正,确保相同数值对应完全一致的颜色。
内容的提问来源于stack exchange,提问作者Matias Navarrete
相关产品推荐
相关产品推荐

