为什么选择条形热图
在科研数据分析和工程信号处理领域,当我们需要同时展示多个样本的连续变量波形时,传统的折线图往往显得杂乱无章 —— 想象一下,15 条波形曲线在同一个坐标系里交织,是不是瞬间让人眼花缭乱?这时候,条形热图(strip heatmap) 就像一位魔法设计师,用色彩编码和有序排列让复杂数据变得清爽直观!
今天我们要分享的案例是:通过模拟带噪声的高斯峰值信号,用 seaborn 绘制高颜值条形热图,展示不同样本的波形差异。这种可视化方法广泛应用于光谱分析、传感器信号处理、生物医学数据(如心电图波形)等场景,能让你一眼捕捉到数据的峰值位置、强度差异和噪声分布~
代码全景
先来看一段充满 “数学美感” 的代码,它模拟了 15 个带随机峰值的信号,并将它们优雅地排列成热图:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 生成随机数据(核心可替换区域①) np.random.seed(0) # 固定随机种子,确保结果可复现 x = np.arange(0, 91) # x轴范围:0到90(代表信号的连续变量,如波长、时间等) n_samples = 15 # 样本数量,可改为你的实际样本数 data = [] # 生成每个样本的峰值位置(35-55之间的随机值,可替换为真实峰值数据②) peaks = np.random.uniform(35, 55, size=n_samples) for p in peaks: # 高斯函数生成峰值波形(可替换为自定义函数③,如正弦波、指数衰减等) profile = np.exp(-(x - p)**2 / (2 * 8**2)) # 标准差8控制峰宽 noise = np.random.randn(len(x)) * 2 # 高斯噪声,可调整噪声强度④ # 信号叠加:基线10 + 峰值信号*40 + 噪声(可修改基线和缩放因子⑤) row = 10 + profile * 40 + noise data.append(row) # 创建数据框(核心可替换区域⑥:替换为你的真实数据) df = pd.dataframe(data, columns=x) # columns对应x轴变量,如波长、时间点 labels = [f"samp {chr(ord('a')+i)}" for i in range(n_samples)] # 样本标签 df.index = labels # 设置行名为样本标签 # 绘制条形热图(可视化参数可灵活调整⑦) plt.figure(figsize=(12, 6)) # 调整画布大小 sns.heatmap( df.iloc[::-1], # 反转行顺序,让第一个样本显示在顶部 cmap="coolwarm", # 蓝-红发散色阶,适合显示有基线的信号 vmin=0, vmax=50, # 固定颜色范围,确保不同数据对比一致 cbar=true, # 显示颜色条 linewidths=0.5, # 样本间添加白色分隔线 linecolor='white' # 分隔线颜色 ) plt.title("条形热图:带噪声的高斯峰值信号", fontsize=16, pad=20) plt.xlabel("k (w) (可替换为实际变量名,如波长/nm、时间/ms)", fontsize=14) plt.ylabel("样本", fontsize=14) # 定制x轴刻度:每10个单位显示一个刻度 plt.xticks(np.arange(0, len(x), 10), np.arange(0, len(x), 10)) # 定制y轴标签:反转顺序并取消旋转,让标签水平显示 plt.yticks(np.arange(len(labels)) + 0.5, labels[::-1], rotation=0) plt.tight_layout() # 自动调整布局,避免标签重叠 plt.show()
效果如下
代码逐行解析
1.数据生成:打造带峰值的模拟信号(核心可替换区)
① x 轴范围与样本数量:
x = np.arange(0, 91)定义了信号的连续变量,比如这里模拟的是 0-90 的 “k (w)” 变量(实际可替换为波长、时间、温度等)。n_samples是样本数量,直接改为你的实际样本数,比如 30 个传感器数据。
② 峰值位置定制:
peaks = np.random.uniform(35, 55, size=n_samples)生成 35-55 之间的随机峰值位置。如果有真实峰值数据,直接替换为列表或数组,例如:
peaks = [40.2, 52.1, 38.5, ...] # 你的真实峰值位置
③ 波形函数替换:
目前用高斯函数np.exp(-(x - p)**2 / (2 * 8**2))生成钟形曲线,你可以换成任何自定义函数!比如:
正弦波:np.sin(x * 0.1 + p)(模拟周期性信号)
指数衰减:np.exp(-(x - p)/10)(模拟衰减信号)
阶梯函数:np.where(x > p, 1, 0)(模拟开关信号)
④ 噪声调整:
np.random.randn(len(x)) * 2控制噪声强度,*2是标准差。想让信号更 “干净”?改成*1;想突出噪声?试试*5~
⑤ 信号缩放与基线:
10 + profile * 40 + noise中,10是基线(信号最小值),*40是峰值缩放因子。根据真实数据范围调整这两个值,比如基线改为 20,缩放因子改为 30。
2.数据结构化:用 pandas 构建表格(零代码替换区)
⑥ 替换真实数据:
如果你有现成的 csv 数据,直接用pd.read_csv('你的数据.csv')读取,确保列是 x 轴变量(如波长点),行是样本,然后跳过data生成步骤。例如:
df = pd.read_csv('sensor_data.csv', index_col=0) # index_col=0假设第一列为样本标签
3.可视化魔法:seaborn 热图的 “美颜秘籍”
⑦ 热图参数调优:
cmap="coolwarm":蓝 - 红配色适合显示有基线的信号,冷色代表低值,暖色代表高值。换成"viridis"(绿 - 黄 - 红)或"magma"(黑 - 红 - 黄)会有不同效果~
vmin=0, vmax=50:固定颜色映射范围,避免不同数据导致色阶变化,确保跨图对比一致。如果数据范围是 10-60,就改为vmin=10, vmax=60。
linewidths=0.5, linecolor='white':在样本间添加细白分隔线,让每个条形更清晰,就像给数据 “穿上整齐的格子衫”~
df.iloc[::-1]:反转行顺序,让第一个样本显示在热图顶部(默认是底部),符合从 “上到下” 的阅读习惯。
个性化改造
场景一:我的数据不是高斯峰值,是真实传感器波形怎么办
直接替换信号生成部分!假设你有一批心电图(ecg)数据,每个样本是 500 个时间点的电压值:
- 删除peaks和循环生成profile的代码
- 用pd.read_csv读取 csv 文件,确保每行是一个样本,每列是时间点
- 跳过噪声生成(如果数据已含噪声)或添加自定义噪声
场景二:想换一种更专业的配色方案
seaborn 提供了超多色阶,试试这些组合:
- 科研论文常用:cmap="rocket"(蓝 - 黄 - 红,适合单峰数据)、cmap="bwr"(蓝 - 白 - 红,突出基线对称数据)
- 高对比度模式:cmap="coolwarm_r"(反转色阶,让高值显示为蓝色)
- 渐变色推荐:搭配vmin和vmax使用,比如光谱数据用cmap="hsv",呈现彩虹色渐变~
场景三:样本标签太多,y 轴标签挤在一起
三大解决方案来袭:
缩小字体:plt.yticks(..., fontsize=10)
截断标签:用缩写(如 “samp a”→“a”),或生成标签时用简写:
labels = [f"a{i}" for i in range(n_samples)] # 生成a0, a1, ..., a14
旋转标签:如果必须显示全称,尝试轻微旋转:
plt.yticks(..., rotation=15) # 15度倾斜,更易阅读
扩展应用
生物医学:心电图波形对比
x 轴:时间(ms),y 轴:不同患者,颜色:电压(μv)
应用:快速识别异常波形(如峰值偏移、节律异常),比单独看折线图清晰 10 倍!
材料科学:光谱吸收曲线
x 轴:波长(nm),y 轴:不同薄膜样品,颜色:吸光度
应用:对比材料的特征吸收峰位置和强度,一键定位最佳制备工艺~
工程信号:传感器阵列数据
x 轴:频率(hz),y 轴:不同传感器节点,颜色:信号强度
应用:监测设备振动信号,快速定位异常频率的传感器节点~
关键可替换点总结
替换场景 | 代码位置 | 示例操作 |
x 轴变量名称 | x = np.arange(0, 91) | 改为x = np.linspace(200, 800, 301)(波长 200-800nm,301 个点) |
样本数量 | n_samples = 15 | 改为n_samples = 30(30 个样本) |
峰值位置(真实数据) | peaks = np.random... | 改为peaks = [45.2, 50.1, 38.7](手动输入峰值) |
波形函数 | profile = np.exp(...) | 改为profile = np.sin(x*0.05)(正弦波) |
导入真实数据 | df = pd.dataframe(data...) | 改为df = pd.read_excel('你的数据.xlsx', index_col=0) |
颜色映射 | cmap="coolwarm" | 改为cmap="viridis"(绿 - 黄 - 红渐变) |
总结
通过这篇攻略,我们掌握了从信号生成到热图绘制的全流程,更重要的是学会了如何将代码适配到真实场景。条形热图的核心优势在于:
- 有序排列:样本按行排列,避免折线图的重叠混乱
- 色彩编码:用颜色深浅直观展示数值大小,比数字表格更易捕捉规律
- 细节可控:从色阶到分隔线,每个像素都能定制,满足论文、报告、ppt 的不同需求
现在,你只需替换代码中的6 处核心区域(数据生成、数据框、可视化参数),就能将这段代码变成你的专属可视化工具~
到此这篇关于python绘制条形热图的示例代码的文章就介绍到这了,更多相关python条形热图内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论