利用 Plotly 绘制动态更新的蜡烛图循环展示。

4
我希望能够动态更新来自plotlyCandlestick图表:
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_df pandas数据框。

然而,在循环的每次迭代中,图表只会短暂地显示(远少于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()

我希望对于蜡烛图做出类似的事情。

2个回答

1
你的代码对我来说完美地运行了。顺便说一下,我为你的系列编写了一些模拟数据——在像这样提问时提供一些示例数据是很好的实践。
    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秒显示一张图表。具体行为将取决于您的图形渲染器。如果您在终端中运行它,它可能会在每个循环中弹出一个在本地主机上查看的浏览器选项卡 - 这可能不是您想要的。如果您在Jupyter笔记本中运行它,它将动态更改图形,这可能更接近您想要的结果。
如果您想在浏览器中动态更新图形,则可以考虑查看dash

如果您想查看正在运行的ipynb,请访问https://colab.research.google.com/drive/16M06Z9k1EiFHisqvzgDEbucmZwYC5app?usp=sharing。 - J Richard Snape

0

尝试任何这些想法,看看它们是否奏效,我无法尝试它们,因为我没有您的数据框:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接