Python如何绘制以数值标注代替颜色填充的垂直温差图表
逐分钟垂直温差计算及坐标数值标注绘图方案
1. 数据预处理与温差计算优化
原始数据中同一分钟仅首行带有时间戳,其余行时间字段为空,先做填充处理,再用pandas向量化操作替代手动循环计算温差,逻辑更稳定、运行效率更高:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 读取数据:原始数据为多空格分隔,空时间戳会自动识别为NaN,根据实际时间格式调整dayfirst参数 df = pd.read_csv('你的温度数据存储路径.csv', sep=r'\s+', parse_dates=['timestamp'], dayfirst=False) # 向前填充空时间戳,让同一分钟的所有数据行匹配对应时间值 df['timestamp'] = df['timestamp'].ffill() # 计算逐分钟垂直温差:以每分钟首个高度(100m)的温度为基准做差 # 分组广播计算无需手动维护循环索引,和原有循环逻辑结果完全一致 df['tempdiff'] = df['tempVirt'] - df.groupby('timestamp')['tempVirt'].transform('first')
原有手动维护索引j的循环写法容易出现索引越界、时间匹配错误的问题,分组transform写法原生适配pandas数据结构,数据量较大时速度优势明显。
2. 无填充色的数值标注绘图实现
直接在「时间-高度」对应的坐标位置绘制文本标注,不需要颜色填充区域,代码如下:
# 初始化画布 fig, ax = plt.subplots(figsize=(10, 6), dpi=100) # 可选:添加浅灰色坐标点辅助定位,不需要可以注释掉 ax.scatter(df['timestamp'], df['high'], s=3, c='gray', alpha=0.4) # 遍历所有数据行,在对应坐标位置标注数值 for _, row in df.iterrows(): x = row['timestamp'] y = row['high'] # 标注内容按需选择:原始温度用row['tempVirt'],温差用row['tempdiff'] show_val = f"{row['tempVirt']:.1f}" # 可选:根据温差正负设置文字颜色,不需要可以统一设置color='black' if row['tempdiff'] < 0: txt_color = 'tab:blue' elif row['tempdiff'] > 0: txt_color = 'tab:red' else: txt_color = 'black' # 文本居中放置在坐标点位置 ax.text(x, y, show_val, ha='center', va='center', fontsize=10, color=txt_color) # 坐标轴样式配置 ax.set_xlabel('观测时间') ax.set_ylabel('观测高度 (m)') # x轴时间格式化为 月/日 时:分 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d %H:%M')) plt.xticks(rotation=45) # 调整y轴范围,上下留边距避免边缘文本被截断 ax.set_ylim(df['high'].min() - 25, df['high'].max() + 25) # 可选:添加浅网格辅助读数 ax.grid(alpha=0.3, linestyle='--') # 自动调整布局避免标签重叠 plt.tight_layout() plt.show()
常用调整项
- 若需要标注温差值,直接把
show_val的取值替换为f"{row['tempdiff']:.1f}"即可 - 修改
fontsize参数可以调整标注文字的大小 - 修改
figsize参数可以调整整图的宽高比例 - 不需要颜色区分温差的话,删掉颜色判断逻辑,直接在
ax.text里设置color='black'即可
内容的提问来源于stack exchange,提问作者Suci
相关产品推荐
相关产品推荐

