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

如何在Matplotlib中实现保留历史数据的动态直方图(不覆盖旧图表)

动态直方图保留历史数据并向右延伸实现

原示例的动态直方图每次都会重绘同一区间的条形,无法保留历史数据。要实现每次调用animate时向右延伸图表、保留已渲染的历史数据,需要修改逻辑,维护历史数据集并动态扩展直方图的区间范围,具体实现如下:

修改后的代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 固定随机种子保证可复现
np.random.seed(19680801)

# 初始化历史数据和初始区间
history_data = []
# 初始bins范围:-4到4,分成20个区间(减少初始数量方便观察扩展)
current_bins = np.linspace(-4, 4, 20)

def animate(frame_number):
    global history_data, current_bins, bar_container
    
    # 生成新的批量数据
    new_data = np.random.randn(1000)
    history_data.extend(new_data)
    
    # 向右扩展bins:每次扩展1个单位,分成5个新子区间
    new_bin_start = current_bins[-1]
    new_bin_end = new_bin_start + 1
    new_bins = np.linspace(new_bin_start, new_bin_end, 5)
    # 合并新旧bins(去重,避免重复边界)
    current_bins = np.unique(np.concatenate([current_bins, new_bins[1:]]))
    
    # 基于所有历史数据计算直方图
    n, _ = np.histogram(history_data, current_bins)
    
    # 更新现有条形的高度
    for count, rect in zip(n[:len(bar_container.patches)], bar_container.patches):
        rect.set_height(count)
    
    # 添加新的条形(如果bins数量超过现有条形)
    if len(n) > len(bar_container.patches):
        new_rects = ax.bar(current_bins[:-1][len(bar_container.patches):], 
                           n[len(bar_container.patches):],
                           width=np.diff(current_bins)[0],
                           lw=1, ec="yellow", fc="green", alpha=0.5)
        bar_container.patches.extend(new_rects)
    
    # 调整x轴范围以显示所有bins
    ax.set_xlim(left=current_bins[0], right=current_bins[-1])
    # 动态调整y轴上限,确保所有数据可见
    ax.set_ylim(top=max(n) * 1.1 if n else 1)
    
    return bar_container.patches

fig, ax = plt.subplots()
# 初始化直方图,基于空数据生成初始条形
_, _, bar_container = ax.hist([], current_bins, lw=1, ec="yellow", fc="green", alpha=0.5)

# 关闭blit,因为需要添加新的图形元素
ani = animation.FuncAnimation(fig, animate, 20, repeat=False, blit=False)
plt.show()

关键改动说明

  • 历史数据维护:用history_data列表累积所有生成的数据,每次动画帧添加新数据
  • 动态扩展bins:每次向右扩展一段区间,合并到现有bins,保证直方图区间持续延伸
  • 条形更新与添加:先更新已有条形的高度,再根据新的bins数量添加新的条形元素
  • 轴范围调整:每次动画后更新x轴范围以覆盖新的bins,动态调整y轴上限避免数据被截断
  • 关闭blit:因为需要动态添加新的条形,blit=True仅支持更新现有元素,无法处理新增元素

内容的提问来源于stack exchange,提问作者Darron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:15:50