如何使用matplotlib将pandas dataframe绘制成颜色映射强度的水平线条
多温度频率强度热力图实现方案
首先修正你提供的模拟数据代码的笔误,再给出完整可运行的绘图实现:
1. 模拟数据生成
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import Normalize np.random.seed(1) # 定义x轴(频率)和温度列 columns = ['frequency', '275 K', '300 K', '325 K'] # 生成频率序列 x = np.linspace(-5, 5, 100) # 生成三个温度下的含噪强度信号 noise = np.random.randn(3, len(x)) # 构造DataFrame,修正原代码的笔误columns=T为columns=columns df = pd.DataFrame(np.vstack((x, noise)).T, columns=columns)
2. 绘图实现
我们采用pcolormesh方案,可直接让y轴位置与真实温度值一一对应,无需额外手动标注标签:
# 提取温度数值列表 temp_values = np.array([275, 300, 325]) # 提取强度矩阵,形状为 [温度数量, 频率采样点数量] intensity_mat = df[['275 K', '300 K', '325 K']].values.T # 提取频率序列 freq = df['frequency'].values # 调整该参数可修改水平热力条的高度 bar_height = 5 # 生成绘图所需的网格边界 y_edges = np.concatenate([[t - bar_height/2, t + bar_height/2] for t in temp_values]) x_edges = np.concatenate([freq, [freq[-1] + (freq[1] - freq[0])]]) # 扩展强度矩阵匹配网格维度 intensity_expand = np.repeat(intensity_mat, 2, axis=0) # 初始化画布 fig, ax = plt.subplots(figsize=(8, 4)) # 绘制热力图,可自行修改cmap参数更换色卡 norm = Normalize(vmin=intensity_mat.min(), vmax=intensity_mat.max()) pcm = ax.pcolormesh(x_edges, y_edges, intensity_expand, norm=norm, cmap='viridis', shading='flat') # 添加强度颜色条 fig.colorbar(pcm, ax=ax, label='Intensity') # 设置轴标签 ax.set_xlabel('Frequency') ax.set_ylabel('Temperature (K)') # 设置y轴刻度为真实温度值 ax.set_yticks(temp_values) # 调整y轴范围让显示更紧凑 ax.set_ylim(temp_values.min() - bar_height, temp_values.max() + bar_height) plt.show()
效果说明
- 每个温度对应一条独立的水平热力条,y轴坐标与实测温度完全匹配
- 颜色直接映射强度数值,支持自定义色卡、归一化范围等参数
- 如果温度为连续采样序列,可直接用
imshow配合extent参数设置y轴温度范围,代码逻辑更简洁
内容的提问来源于stack exchange,提问作者ARGratrex
相关产品推荐
相关产品推荐

