禁用 Matplotlib 图表的常量位置重置
Disable constant position reset of Matplotlib chart
我有一个 python 代码,通过使用 Matplotlib 实时显示烛台图表,所以最后一个柱每秒更新一次,问题是程序不允许我滚动 back/zoom在 ...(与图表交互)因为它不断重置位置。我该如何解决这个问题?
谢谢,祝你有个愉快的一天。
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()
您发布的代码是 "growing candle animation" example from the mplfinance repository. Mplfinance does not use Matlab but rather MatPlotLib。
(很想编辑你的问题并将“Matlab”的所有引用更改为“Mplfinance/Matplotlib”,但我会把它留给你去做,以防万一我遗漏了什么或者你是实际上用 Matlab 做了一些事情。此外,为了清楚起见,代码绘制的是“烛台图”,而不是“条形图”。顺便说一下,MatPlotLib 最初编写的有点类似于 Matlab 绘图界面,所以有些混淆可以理解,但 matplotlib 从那以后在很多方面都得到了发展。
@CrisLuengo 的评论是正确的,因为 mplfinance 代码在每个动画帧中或多或少地从头开始重新绘制绘图,因此任何交互式更改(例如放大)都将重新设置每个动画帧。 mplfinance 动画示例这样做是为了使代码更简单。
我相信有可能完成你想要的(动画 with 互动)但是我自己从来没有做过,所以没有明确说明如何去做,如果我打算这样做,我可能会按照以下帖子的思路做一些事情:
完全披露:我是 mplfinance package 的维护者。也许有一天我们会增强 mplfinance 以使其更容易;但目前这种增强不是优先事项;因此,上述更复杂的解决方案之一是必要的。
我有一个 python 代码,通过使用 Matplotlib 实时显示烛台图表,所以最后一个柱每秒更新一次,问题是程序不允许我滚动 back/zoom在 ...(与图表交互)因为它不断重置位置。我该如何解决这个问题? 谢谢,祝你有个愉快的一天。
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()
您发布的代码是 "growing candle animation" example from the mplfinance repository. Mplfinance does not use Matlab but rather MatPlotLib。
(很想编辑你的问题并将“Matlab”的所有引用更改为“Mplfinance/Matplotlib”,但我会把它留给你去做,以防万一我遗漏了什么或者你是实际上用 Matlab 做了一些事情。此外,为了清楚起见,代码绘制的是“烛台图”,而不是“条形图”。顺便说一下,MatPlotLib 最初编写的有点类似于 Matlab 绘图界面,所以有些混淆可以理解,但 matplotlib 从那以后在很多方面都得到了发展。
@CrisLuengo 的评论是正确的,因为 mplfinance 代码在每个动画帧中或多或少地从头开始重新绘制绘图,因此任何交互式更改(例如放大)都将重新设置每个动画帧。 mplfinance 动画示例这样做是为了使代码更简单。
我相信有可能完成你想要的(动画 with 互动)但是我自己从来没有做过,所以没有明确说明如何去做,如果我打算这样做,我可能会按照以下帖子的思路做一些事情:
完全披露:我是 mplfinance package 的维护者。也许有一天我们会增强 mplfinance 以使其更容易;但目前这种增强不是优先事项;因此,上述更复杂的解决方案之一是必要的。