如何在Matplotlib FuncAnimation动态图中设置x轴左边界为当前时间减2小时(基于pandas Datetime)
解决Matplotlib动态图表X轴左边界限制问题
我来帮你搞定这个X轴范围的问题~你之前的代码没生效,核心原因是你在设置xlim后又调用了self.ax.relim()和self.ax.autoscale_view(),这两个方法会自动重置整个坐标轴的范围,直接覆盖了你手动设置的左边界,所以你的设置根本没起作用。
解决方案思路
我们需要把X轴的范围控制权握在自己手里,同时保留Y轴的自动缩放(如果需要的话):
- 先计算出X轴的左边界:取最新数据时间减去2小时,同时确保这个左边界不会早于数据集的最早时间(避免出现大片空白)
- 手动设置X轴的左右范围(右边界用最新数据时间即可)
- 对于Y轴,我们可以单独开启自动缩放,让它自适应数据变化
修改后的完整代码
from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation from datetime import datetime import pandas as pd def to_pd(wt, wf): p = pd.DataFrame({"Date": [wt], "Cost": [wf]}) p["Date"] = pd.to_datetime(p["Date"], format='%Y-%m-%d %H:%M:%S') return p fig = plt.figure(figsize=(18,8), dpi=90) class Graph(): def __init__(self): self.ax = fig.add_subplot() self.start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') self.data = to_pd(self.start_time, 0) self.line, = self.ax.plot(self.data.Date, self.data.Cost) # 初始化时就设置一次X轴范围,避免初始显示异常 latest_time = self.data.iloc[-1, 0] left_x = latest_time - pd.Timedelta(hours=2) self.ax.set_xlim(left=left_x, right=latest_time) def update(self,i): self.current_time = (self.data.iloc[-1,0]+pd.Timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S') # 替换已弃用的append方法,用concat更稳妥 self.data = pd.concat([self.data, to_pd(self.current_time, (-1)**i)], ignore_index=True) self.line.set_data(self.data.Date, self.data.Cost) # 计算并设置X轴边界 latest_time = self.data.iloc[-1, 0] left_x = latest_time - pd.Timedelta(hours=2) # 确保左边界不会早于数据集的最早时间 final_left = max(left_x, self.data.iloc[0, 0]) self.ax.set_xlim(left=final_left, right=latest_time) # 仅自动缩放Y轴,X轴保持手动设置的范围 self.ax.relim() self.ax.autoscale_view(scalex=False, scaley=True) return self.line, object = Graph() def animate(i): return object.update(i) anim = FuncAnimation(fig, animate, frames=200, interval=100, blit=True) plt.show()
额外说明
- 我把
self.data.append()改成了pd.concat(),因为pandas的append方法已经被官方弃用,用concat更符合最新规范 - 初始化阶段就设置了X轴范围,避免动画启动时出现显示异常
autoscale_view(scalex=False, scaley=True)参数确保只调整Y轴范围,X轴完全按照我们设置的左边界显示
内容的提问来源于stack exchange,提问作者An Ri
相关产品推荐
相关产品推荐

