-1

我有一个 python 代码,通过使用 Matplotlib 实时显示烛台图,所以最后一个柱每秒更新一次,问题是程序不允许我向后滚动/放大......(与图表交互)因为它不断重置位置。我该如何解决这个问题?谢谢,祝你有美好的一天。

import pandas as pd
import mplfinance as mpf
import matplotlib.animation as animation

# Class to simulate getting more data from API:


class RealTimeAPI():
    def __init__(self):
    self.data_pointer = 0
    self.data_frame = pd.read_csv('SP500_NOV2019_IDay.csv', 
    index_col=0, parse_dates=True)
    # self.data_frame = self.data_frame.iloc[0:120,:]
    self.df_len = len(self.data_frame)

def fetch_next(self):
    r1 = self.data_pointer
    self.data_pointer += 1
    if self.data_pointer >= self.df_len:
        return None
    return self.data_frame.iloc[r1:self.data_pointer, :]

def initial_fetch(self):
    if self.data_pointer > 0:
        return
    r1 = self.data_pointer
    self.data_pointer += int(0.2*self.df_len)
    return self.data_frame.iloc[r1:self.data_pointer, :]


rtapi = RealTimeAPI()

resample_map = {'Open': 'first',
            'High': 'max',
            'Low': 'min',
            'Close': 'last'}
resample_period = '15T'

df = rtapi.initial_fetch()
rs = df.resample(resample_period).agg(resample_map).dropna()

fig, axes = mpf.plot(rs, returnfig=True, figsize=(11, 8), 
type='candle', title='\n\nGrowing Candle')
ax = axes[0]


def animate(ival):
   global df
   global rs
   nxt = rtapi.fetch_next()
   if nxt is None:
       print('no more data to plot')
       ani.event_source.interval *= 3
       if ani.event_source.interval > 12000:
           exit()
       return
   df = df.append(nxt)
   rs = df.resample(resample_period).agg(resample_map).dropna()
   ax.clear()
   mpf.plot(rs, ax=ax, type='candle')

ani = animation.FuncAnimation(fig, animate, interval=250)
mpf.show()
4

1 回答 1

0

您发布的代码是 mplfinance 存储库中的“增长蜡烛动画”示例。Mplfinance 不使用Matlab而是使用 MatPlotLib

(编辑您的问题并将“Matlab”的所有引用更改为“Mplfinance/Matplotlib”是很容易的,但我将把它留给您去做,以防万一我遗漏了什么或者您实际上正在使用 Matlab 做某事。此外,为了清楚起见,代码绘制的是“烛台图”,而不是“条形图。”顺便说一下,MatPlotLib 最初是为了有点类似于 Matlab 的绘图界面而编写的,所以有些混乱是可以理解的,但 matplotlib 已经成长了很多方面)。

@CrisLuengo 的评论是正确的,因为 mplfinance 代码在每个动画帧中或多或少地从头开始重新绘制绘图,因此任何交互式更改(例如放大)都将在每个动画帧中重新设置。mplfinance 动画示例这样做是为了使代码更简单。

我相信有可能完成你想要的(具有交互性的动画)但是我自己从来没有做过,所以没有明确说明如何去做,如果我要这样做,我可能会做一些事情以下帖子的行:

全面披露:我是mplfinance 包的维护者。也许有一天我们会增强 mplfinance 以使这更容易;但目前这种增强不是优先事项;因此,上述更复杂的解决方案之一是必要的。

于 2021-10-18T14:09:20.910 回答