如何绘制区分witness来源的负数值彩图并将矩阵归一化至0-3?
实现步骤与代码示例
核心思路
- 追踪witness来源:不能仅存储较小的witness值,需同步记录该值来自
witness1还是witness2,为后续颜色区分提供依据。 - 归一化处理:将所有有效witness值线性缩放到0-3范围,保证可视化的一致性。
- 颜色映射规则:
- 来自
witness1的负值:蓝色 - 来自
witness2的负值:黄色 - 所有正值(无论来源):白色
- 来自
完整代码实现
import numpy as np import matplotlib.pyplot as plt # 1. 生成参数网格(100×100) h_vals = np.linspace(0.03, 3, 100) h0_vals = np.linspace(0.03, 3, 100) # 初始化两个矩阵:存储最小witness值、存储值的来源(1=witness1,2=witness2) min_witness = np.zeros((100, 100)) witness_source = np.zeros((100, 100), dtype=int) # 2. 遍历参数组合(替换为你的实际计算逻辑) for i, h in enumerate(h_vals): for j, h0 in enumerate(h0_vals): # --- 以下为示例逻辑,替换为你的真实计算步骤 --- # 步骤1:求解使差值/L=0的T值 T_solved = 1.0 # 示例值,替换为你的求解结果 # 步骤2:计算g0、gc、gs算子 g0, gc, gs = 0.5, 0.3, 0.2 # 示例值,替换为你的计算结果 # 步骤3:计算witness1和witness2 witness1 = np.random.randn() # 示例值,替换为你的计算结果 witness2 = np.random.randn() # 示例值,替换为你的计算结果 # --- 计算逻辑结束 --- # 记录最小witness值及其来源 if abs(witness1) < abs(witness2): min_witness[i, j] = witness1 witness_source[i, j] = 1 else: min_witness[i, j] = witness2 witness_source[i, j] = 2 # 3. 将witness值归一化到0-3范围 valid_vals = min_witness[~np.isnan(min_witness)] if len(valid_vals) == 0: raise ValueError("未获取到有效witness值") norm_min, norm_max = valid_vals.min(), valid_vals.max() normalized_witness = 3 * (min_witness - norm_min) / (norm_max - norm_min) # 4. 生成颜色矩阵(RGB格式) color_matrix = np.ones((100, 100, 3)) # 默认白色(正值) # 标记witness1的负值为蓝色 w1_neg_mask = (witness_source == 1) & (min_witness < 0) color_matrix[w1_neg_mask] = [0, 0, 1] # 标记witness2的负值为黄色 w2_neg_mask = (witness_source == 2) & (min_witness < 0) color_matrix[w2_neg_mask] = [1, 1, 0] # 5. 可视化结果 plt.figure(figsize=(8, 8)) plt.imshow(color_matrix, extent=[0.03, 3, 0.03, 3], origin='lower') plt.xlabel('h0') plt.ylabel('h') plt.title('Witness Visualization') plt.colorbar(label='Normalized Witness Value (0-3)') plt.show()
关键细节说明
- 来源追踪:
witness_source矩阵是区分颜色的核心,必须和min_witness矩阵同步更新,不能仅存储数值。 - 归一化逻辑:基于所有有效witness值的极值做缩放,避免单个极端值破坏整体可视化效果;若计算中存在NaN值,需提前过滤。
- 颜色调整:可通过修改RGB值调整颜色深浅,比如深蓝色用
[0,0,0.8],浅黄色用[1,1,0.5]。
内容的提问来源于stack exchange,提问作者user18624758
相关产品推荐
相关产品推荐

