如何在Matplotlib同一坐标轴绘制带自定义坐标轴的潮汐时间多线图
代码修改方案
原来的错误操作有两个:
- 将时间转为字符串后,matplotlib会将每个时间字符串视为独立的离散分类,不会按照时间的实际间隔排序排列,导致x轴顺序混乱
- 不需要转置DataFrame,直接逐行遍历原DataFrame处理每日的两个潮汐时间即可
完整可运行的修改后代码如下:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 原示例DataFrame生成逻辑保留,仅调整时间格式处理 low = ['08:20','11:50','09:44','11:12'] high = ['10:45','08:05','11:55','09:10'] # 保留完整datetime格式,统一用同一天作为基准,方便matplotlib识别时间连续属性 low = pd.to_datetime(low) high = pd.to_datetime(high) col_name = ['lowtide','hightide'] ind_val = pd.date_range(start='01-01-2021',periods=4) df = pd.DataFrame(data= zip(low,high),columns=col_name,index=ind_val) fig, ax = plt.subplots(figsize=(10,3)) # 固定y轴两个位置,分别对应lowtide、hightide y_pos = [0, 1] ax.set_yticks(y_pos) ax.set_yticklabels(['lowtide', 'hightide']) # 逐行遍历数据,每日绘制一条连线连接两个潮汐时间点 for _, row in df.iterrows(): ax.plot([row['lowtide'], row['hightide']], y_pos, marker='o') # 自定义x轴时间范围、刻度间隔与显示格式 ax.set_xlim(pd.to_datetime('08:00'), pd.to_datetime('12:00')) # 如需5分钟一个刻度,将interval参数改为5即可 ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=30)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) plt.xticks(rotation=90) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Hank Gordon
相关产品推荐
相关产品推荐

