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

R语言交互式/动态绘图:随采样过程更新的直方图

序贯蒙特卡洛(SMC)采样过程动态直方图可视化方案

嘿,我完全懂你想要的效果——实时展示SMC每一步X_t的分布演变,不用自己折腾带延迟的循环对吧?给你推荐几个成熟的工具包,轻松实现交互式/动态可视化:

1. Matplotlib FuncAnimation:生成流畅的离线/实时动画

Matplotlib自带的FuncAnimation是做这类动态图的经典选择,它会自动处理帧更新的逻辑,不用你手动加延迟。核心思路是先把SMC每一步的样本X_t都存到一个列表里,然后让动画逐帧加载这些样本更新直方图。

示例代码:

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

# 模拟SMC每一步的样本(这里用正态分布漂移代替实际SMC采样)
smc_samples = []
for t in range(10):
    # 模拟X_t的分布随t变化:均值从0逐渐移到5
    samples = np.random.normal(loc=t*0.5, scale=1, size=1000)
    smc_samples.append(samples)

# 初始化画布和直方图
fig, ax = plt.subplots()
hist, bins, patches = ax.hist(smc_samples[0], bins=30, alpha=0.7)
ax.set_xlim(-2, 7)
ax.set_ylim(0, 150)
ax.set_title(f"SMC Step t=0")
ax.set_xlabel("X_t")
ax.set_ylabel("Count")

# 定义更新函数:每一步替换直方图数据
def update(frame):
    ax.clear()
    ax.hist(smc_samples[frame], bins=30, alpha=0.7)
    ax.set_xlim(-2, 7)
    ax.set_ylim(0, 150)
    ax.set_title(f"SMC Step t={frame}")
    ax.set_xlabel("X_t")
    ax.set_ylabel("Count")
    return ax,

# 创建动画
ani = FuncAnimation(fig, update, frames=len(smc_samples), interval=500, blit=True)

# 可以保存为视频,或者直接在Notebook/窗口展示
plt.show()

2. Plotly FigureWidget:交互式实时更新(适合Jupyter)

如果你用Jupyter Notebook/Lab,Plotly的FigureWidget绝对是首选——它支持实时、交互式的更新,你可以随时暂停、缩放,还能hover查看具体数据点的信息,非常适合调试和理解SMC的采样过程。

示例代码:

import plotly.graph_objects as go
import numpy as np

# 同样先准备SMC各步样本
smc_samples = []
for t in range(10):
    samples = np.random.normal(loc=t*0.5, scale=1, size=1000)
    smc_samples.append(samples)

# 创建交互式图部件
fig = go.FigureWidget()
fig.add_histogram(x=smc_samples[0], nbinsx=30)
fig.update_layout(title="SMC Step t=0", xaxis_title="X_t", yaxis_title="Count")

# 逐帧更新数据
for t in range(1, len(smc_samples)):
    with fig.batch_update():
        fig.data[0].x = smc_samples[t]
        fig.layout.title = f"SMC Step t={t}"
    # 这里可以加短暂延迟,让更新更直观
    import time
    time.sleep(0.5)

fig

3. ipywidgets + Matplotlib:手动控制的交互式滑块

如果你想自己控制进度(比如拖动滑块查看任意t步的分布),ipywidgets的滑块控件搭配Matplotlib会非常方便,适合细致分析每一步的采样结果。

示例代码:

import ipywidgets as widgets
import matplotlib.pyplot as plt
import numpy as np

# 准备SMC各步样本
smc_samples = []
for t in range(10):
    samples = np.random.normal(loc=t*0.5, scale=1, size=1000)
    smc_samples.append(samples)

# 创建滑块控件
step_slider = widgets.IntSlider(min=0, max=len(smc_samples)-1, value=0, description="Step t:")

# 定义绘图函数
def plot_histogram(step):
    plt.figure(figsize=(8, 5))
    plt.hist(smc_samples[step], bins=30, alpha=0.7)
    plt.xlim(-2, 7)
    plt.ylim(0, 150)
    plt.title(f"SMC Step t={step}")
    plt.xlabel("X_t")
    plt.ylabel("Count")
    plt.show()

# 关联滑块和绘图函数
widgets.interact(plot_histogram, step=step_slider);

关键提示

不管用哪个工具,核心前提是把SMC每一步生成的X_t样本都保存下来——你只需要在SMC的循环里,把每一轮的采样结果追加到一个列表/数组中,后续可视化直接调用这个列表就行,比实时采样实时绘图要稳定得多。

这些方案都比自己写带延迟的for循环要专业、高效,而且能做出更清晰的可视化效果,帮你更好地理解SMC的采样演变~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:12