Matplotlib/Seaborn如何绘制逐时间点独立映射的热电偶时序热力图
实现逐时间点独立颜色映射的热力图方案
核心逻辑:放弃seaborn默认的全局数据归一化,先将数据规整为「行=时间戳、列=热电偶测点」的标准表结构,对每一行单独做归一化后再映射颜色,和Excel逐行设置条件格式的逻辑完全一致,不受全局温度波动影响。
完整实现代码
1. 先规整数据结构
不要用globals()动态生成零散变量,统一存入DataFrame方便批量处理:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 组装27个热电偶的数据,索引为时间轴 tc_df = pd.DataFrame() for idx in range(1, 28): tc_df[f"测点{idx}"] = forceconvert_v(globals()[f"arTTXD{idx}"]) tc_df.index = TimeAxis # 沿用你之前生成的TimeAxis时间序列
2. 逐时间点做独立归一化(核心步骤)
指定按行计算,每个时间点单独用自身的最大/最小值做归一化,完全不跨时间对比数值:
# 归一化后所有值映射到[0,1]区间,0对应当前时刻最低温,1对应当前时刻最高温 tc_norm = tc_df.apply( lambda row: (row - row.min()) / (row.max() - row.min() + 1e-8), # 加1e-8避免同温时除0报错 axis=1 )
3. 绘制热力图
将归一化后的矩阵转置,让x轴为时间、y轴为测点,直接映射颜色即可:
fig, ax = plt.subplots(figsize=(25, 5)) plt.subplots_adjust(bottom=0.25) sns.heatmap( tc_norm.T, # 转置后结构为「行=测点、列=时间」,匹配热力图二维输入要求 cmap="coolwarm", # 冷色对应低温、暖色对应高温,可按需替换色卡 ax=ax, cbar=False, # 逐点独立归一化时全局色标无参考意义,需要可设为True xticklabels=10000, # 按数据密度调整x轴刻度间隔,避免标签重叠 yticklabels=True ) # 格式化x轴时间标签 ax.set_xticklabels( [tc_df.index[int(t)].strftime("%Y-%m-%d %H:%M") for t in ax.get_xticks() if t < len(tc_df)] ) plt.show()
问题说明
- 之前切片单个时间点报维度错误的原因:一维长度为27的数组不满足seaborn输入的二维矩阵要求,单个时间点绘图时只要给数组加个维度即可:
single_time_data.reshape(-1, 1),但批量归一化方案效率远高于逐点循环,15万级秒级数据无需逐点渲染。 - 效果完全匹配需求:无论全局温度如何波动,每个时间点的最高温测点固定显示为色卡暖端极值,最低温测点固定显示为冷端极值,不会出现全局升温后冷点颜色错位的问题。
- 可选调整:如果需要按温度排序而非线性映射颜色,把归一化逻辑替换为逐行排名即可:
lambda row: row.rank(pct=True)
内容的提问来源于stack exchange,提问作者Gilbertgrape87
相关产品推荐
相关产品推荐

