plot烛台更新并在循环中动态显示



我想从plotly动态更新Candlestick图表:

import time
import plotly.graph_objects as go
while True:
candle_df = candle_handler.get_dataframe()
candlestick = go.Candlestick(x=candle_df['Time'], open=candle_df['Open'], high=candle_df['High'], low=candle_df['Low'], close=candle_df['Close'])  
fig = go.Figure(data=[candlestick])
fig.show()
time.sleep(3)

其中candle_handler.get_dataframe()从API中提取数据并更新candle_dfpandas数据框中的数据。

然而,图表只在循环的每次迭代中非常简短地显示(远远少于3秒)。

我找到了一个适用于散点图的代码片段:

import time
import plotly.graph_objects as go
data = [1,3,2,4,3,3,2,3]
fig = go.FigureWidget()
fig.add_scatter()
for i in range(len(data)):
time.sleep(3)
fig.data[0].y = data[:i]
fig.show()

,我想为Candlestick图表做类似的事情。

你的代码对我来说工作得很好。顺便说一下,我为您的系列模拟了一些数据—在提出这样的问题时,提供一些示例数据是很好的做法

import time

import numpy as np
import pandas as pd
import plotly.graph_objects as go
import datetime

class Handler:
def get_dataframe(self):
start = datetime.datetime(2011, 1, 1)
tim_col = pd.date_range(start, periods=500, freq="D")
tim_col.name = "Time"
prices_df = pd.DataFrame(data=np.random.rand(500,4), columns=['Open','High','Low','Close'], index=tim_col).reset_index()
prices_df['Open'] = prices_df['Open']+ prices_df['Low']
prices_df['Close'] = prices_df['Close']+ prices_df['Low']
prices_df['High'] = prices_df['High']+ prices_df[['Open','Close']].max(axis=1)
return prices_df

candle_handler = Handler()

while True:
candle_df = candle_handler.get_dataframe()
candlestick = go.Candlestick(x=candle_df['Time'], open=candle_df['Open'], high=candle_df['High'], low=candle_df['Low'], close=candle_df['Close'])
fig = go.Figure(data=[candlestick])
fig.show()
time.sleep(3)

这确实意味着每3秒生成一个图形。确切的行为将取决于你的图形渲染器。如果在终端中运行它,它可能会在每次循环时在浏览器中弹出一个查看localhost的选项卡——这可能不是您想要的。如果您在Jupyter Notebook中运行它,它将动态更改图形,这可能更接近您想要的。

如果你想在浏览器中动态更新一个图形,你可以考虑查看dash

试试这些想法,看看他们是否工作,我不能尝试他们,因为我没有你的数据框架:

  • time.sleep(3)放在fig.show()之前
  • 用循环代替while true
  • 也许把candle_df = candle_handler.get_dataframe()放在循环之外

最新更新