【问题标题】:How to create an animated line plot with ploty express?如何使用 plotly express 创建动画线图?
【发布时间】:2021-12-29 19:16:11
【问题描述】:

我正在尝试创建一个动画线图来说明 3 个不同资产类别随时间(年)的价格上涨,但它不起作用,我不知道为什么!

到目前为止我做了什么:

  1. 获取每个资产的收盘价数据
start = datetime.datetime(2010,7,01) 
end = datetime.datetime(2021,7,01) 
data = pdr.get_data_yahoo(['BTC-USD', 'GC=F','^GSPC'],startDate,endDate)['Adj Close']
  1. 将列转置为行以避免大量计算
data['Date'] = data.index
data['Year'] = data.index.year
dataNew =data.melt(['Date', 'Year'], var_name='Asset')
dataNew = dataNew.rename(columns = {'value': 'Price'})

  1. 情节
fig = px.line(dataNew,
             x = 'Date',
             y = 'Price',
             range_y=[0,50000],
             color = 'Asset',
             animation_frame = 'Year')
    st.write(fig)

输出:

【问题讨论】:

  • 帖子Cumulative Lines Animation in Python 表明使用Python 和Plotly.Express 是不可能的,而使用go.Figure() 进行多重跟踪是最可行的方法。
  • 也有一个例子here,但它并不完全直截了当,也没有使用 Plotly Express。

标签: python animation plotly plotly-python plotly-express


【解决方案1】:

简答:

这实际上很有可能,您必须对标准 px.line() time series using axes of type date 绘图设置进行以下添加:

# input data
dfi = px.data.stocks().head(50)

# new datastructure for animation
df = pd.DataFrame() # container for df with new datastructure
for i in np.arange(start,obs):
    dfa = dfi.head(i).copy()
    dfa['ix']=i
    df = pd.concat([df, dfa])

很酷的细节:

与似乎最普遍的看法相反,与几分钟前我自己的 cmets 相反,这实际上可能与 px.line 和您所描述的一组时间序列有关。只要您稍微一点 调整数据集。唯一真正的缺点似乎是它可能不适用于较大的数据集,因为图形结构将包含的数据量将是巨大的。但是,让我们在酷的东西之后回到无聊的细节。下面的sn-p和数据集px.data.stocks()会产生下图:

情节 1 - 使用 play button 的动画:

当动画结束时,您还可以根据需要对线条进行子集化。

情节 2 - 使用 slider 的动画:

无聊的细节:

如果 OP 或其他任何人感兴趣,我会回到这个问题

完整代码:

import pandas as pd
import numpy as np
import plotly.express as px

# input data
dfi = px.data.stocks().head(50)
dfi['date'] = pd.to_datetime(dfi['date'])
start = 12
obs = len(dfi)

# new datastructure for animation
df = pd.DataFrame() # container for df with new datastructure
for i in np.arange(start,obs):
    dfa = dfi.head(i).copy()
    dfa['ix']=i
    df = pd.concat([df, dfa])

# plotly figure
fig = px.line(df, x = 'date', y = ['GOOG', 'AAPL', 'AMZN', 'FB', 'NFLX', 'MSFT'],
              animation_frame='ix',
              # template = 'plotly_dark',
              width=1000, height=600)

# attribute adjusments
fig.layout.updatemenus[0].buttons[0]['args'][1]['frame']['redraw'] = True
fig.show()

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2021-07-21
    • 1970-01-01
    • 2022-09-24
    • 2022-01-16
    • 2017-08-20
    • 1970-01-01
    • 2020-10-20
    • 2021-10-25
    相关资源
    最近更新 更多