You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:34