matplotlib绘制X轴格式为%H:%M的放大插图时Timedelta不可迭代报错
报错原因
- 第45行报错是因为
ztdate = indate['UTC'][2700]-indate['UTC'][1800]计算得到的是单个时间差对象,不是可迭代的时间序列,无法用for循环遍历。 - 其他逻辑问题:
- 插图绘图时
df.iloc[19+i]取值逻辑错误,应该取索引1800-2700对应行、第19+i列的值 - 不需要单独计算插图的时间序列,直接复用主图已处理好的
time序列切片即可 - 没有手动限制插图的Y轴范围为需求的-0.5到1
- 插图绘图时
修正后可运行代码
import matplotlib.pyplot as plt import matplotlib.pylab as pl import matplotlib.dates as md from mpl_toolkits.axes_grid1.inset_locator import (inset_axes, InsetPosition, mark_inset) import numpy as np import pandas as pd # 读取数据并转换UTC列为datetime格式 df = pd.read_csv("cpt_202110240757.csv") df['UTC'] = pd.to_datetime(df['UTC']) colors = pl.cm.viridis(np.linspace(0,1,3)) # 处理主图时间序列 tdate = df['UTC']-df['UTC'][0] zero = df['UTC'][0] time = [zero + t for t in tdate] zero = md.date2num(zero) time = [t-zero for t in md.date2num(time)] fig1 = plt.figure(figsize=(18,12), dpi=80) fig1.suptitle('Position / Time', fontsize=14, fontweight='bold') ax = fig1.add_subplot(2,1,1) names = ['delta y','delta x','delta z'] # 绘制主图 for i in range(len(names)): ax.plot(time, df.iloc[:, 19+i], label=names[i], color=colors[i]) ax.grid(True) ax.set_ylabel('Absolute Error (m)') ax.xaxis_date() ax.xaxis.set_major_formatter(md.DateFormatter("%H:%M")) ax.set_xlabel('Time (h:m)') plt.legend(loc='upper right') # 创建插图坐标系 ax2 = plt.axes([0,0,1,1]) ip = InsetPosition(ax, [0.4,0.4,0.5,0.5]) ax2.set_axes_locator(ip) # 取对应00:30-00:45区间的索引切片 start_idx, end_idx = 1800, 2700 inset_time = time[start_idx:end_idx+1] # 绘制插图内容 for i in range(len(names)): ax2.plot(inset_time, df.iloc[start_idx:end_idx+1, 19+i], color=colors[i]) # 限制插图坐标轴范围符合需求 ax2.set_xlim(time[start_idx], time[end_idx]) ax2.set_ylim(-0.5, 1) # 添加主图和插图的连接指示线 mark_inset(ax, ax2, loc1=2, loc2=4, fc="none", ec='0.5') # 设置插图格式 ax2.grid(True) ax2.xaxis_date() ax2.xaxis.set_major_formatter(md.DateFormatter("%H:%M")) plt.show()
运行效果
运行后会生成带局部放大插图的时序图,插图展示X轴00:30到00:45、Y轴-0.5到1范围的数值,同时自带主图与插图的连接指示线,符合需求。
内容的提问来源于stack exchange,提问作者arkriger
相关产品推荐
相关产品推荐

