You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:52:44