matplotlib/pandas绘制时间-高程散点图无显示问题咨询
核心问题
绘图失败/刻度异常的根源是Time列为字符串类型,matplotlib会将其识别为离散分类值而非连续时间轴;同时仅使用Time列缺少日期信息,跨天数据会出现时序错乱。
可直接运行的实现代码
需要先合并Date与Time列转为标准时间格式,再手动配置坐标轴刻度规则:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 读取并预处理数据 df = pd.read_csv('Area(4).txt', delimiter='\t') df16 = df.iloc[601:696, :] # 过滤9999无效值,加copy避免链式赋值警告 df17 = df16[df16.Value != 9999].copy() # 合并日期、时间列,转为标准datetime时间格式 df17['obs_time'] = pd.to_datetime( df17['Date'] + ' ' + df17['Time'], format='%d %m %Y %H:%M' ) # 初始化画布 fig, ax = plt.subplots(figsize=(10, 5)) # 绘制散点图 ax.scatter(x=df17['obs_time'], y=df17['Value'], s=25, alpha=0.8) # 配置X轴:6小时间隔,刻度显示为「月-日 时:分」 ax.xaxis.set_major_locator(mdates.HourLocator(interval=6)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M')) plt.xticks(rotation=45) # 旋转刻度避免文字重叠 # 配置Y轴:2米=200厘米间隔,自动适配数据范围设置上下限 y_min = (df17['Value'].min() // 200) * 200 y_max = ((df17['Value'].max() // 200) + 1) * 200 ax.set_yticks(range(y_min, y_max + 1, 200)) # 补充坐标轴标签和网格 ax.set_xlabel('观测时间') ax.set_ylabel('高程值 (cm)') ax.grid(alpha=0.3, linestyle='--') # 自动调整布局防止标签被截断 plt.tight_layout() plt.show()
注意事项
- 不要直接使用原始
Time列作为x轴:该列仅包含时分信息,不同日期的同一时间点会被识别为同一个x坐标,导致跨天数据时序错乱,合并Date列生成完整时间戳才能保证时间顺序正确。 - Y轴2米间隔对应步长为200:由于你的高程值单位为厘米,无需额外做单位转换,代码会自动根据数据的最大、最小值计算y轴上下限,不会出现数据截断或空白过多的问题。
- 如果运行后无弹窗显示图表,可以在
plt.show()前添加plt.savefig('elevation_scatter.png', dpi=300),直接将渲染完成的图片保存到脚本同级目录查看。
内容的提问来源于stack exchange,提问作者Kurapika
相关产品推荐
相关产品推荐

