【问题标题】:How to add more than one shape with loop in plotly如何在绘图中添加多个带有循环的形状
【发布时间】:2020-02-17 22:53:23
【问题描述】:

我使用 plotly 包在 python 中显示动态财务图表。但是,我没有设法将所有关键点线放在一个带有 for 循环的图表上。这是我的代码:

fig.update_layout(
    for i in range(0,len(data)):
        shapes=[
            go.layout.Shape(
            type="rect",
            x0=data['Date'][i],
            y0=data['Max_alt'][i],
            x1='2019-12-31',
            y1=data['Max_ust'][i],
            fillcolor="LightSkyBlue",
            opacity=0.5,
            layer="below",
            line_width=0)])
fig.show()

我有如下数据。它是基于时间序列的 EURUSD 平价金融数据集。我计算了局部最小值和最大值的两个约束。我想根据每个 Min_alt / Min_ust 和 Max_alt / Max_range 绘制矩形形状。我只能绘制一个日期,如下图所示,但是我没有设法在同一个绘图图中显示所有范围。

这里是sample data set

添加行的解决方法如下:

import datetime

colors = ["LightSkyBlue", "RoyalBlue", "forestgreen", "lightseagreen"]
ply_shapes = {}
for i in range(0, len(data1)):
    ply_shapes['shape_' + str(i)]=go.layout.Shape(type="rect",
                                                    x0=data1['Date'][i].strftime('%Y-%m-%d'),
                                                    y0=data1['Max_alt'][i],
                                                    x1='2019-12-31',
                                                    y1=data1['Max_ust'][i],
                                                    fillcolor="LightSkyBlue",
                                                    opacity=0.5,
                                                    layer="below"
                                                )
lst_shapes=list(ply_shapes.values())
fig1.update_layout(shapes=lst_shapes)
fig1.show()

但是,在这些行中添加跟踪仍然存在问题。我的意思是文本属性。

这是我的代码:

add_trace = {}
for i in range(0, len(data1)):
    add_trace['scatter_' + str(i)] =  go.Scatter(
                        x=['2019-12-31'],
                        y=[data1['Max_ust'][i]],
                        text=[str(data['Max_Label'][i])],
                        mode="text")

lst_trace = list(add_trace.values())

fig2=go.Figure(lst_trace)
fig2.show()

【问题讨论】:

    标签: python loops for-loop plotly data-visualization


    【解决方案1】:

    答案:

    要完全控制您插入的每个形状,您可以遵循以下逻辑:

    fig = go.Figure()
    
    #[...] data, traces and such
    
    ply_shapes = {}
        for i in range(1, len(df)):
        ply_shapes['shape_' + str(i)]=go.layout.Shape()
    
    lst_shapes=list(ply_shapes.values())
    fig.update_layout(shapes=lst_shapes)
    fig.show()
    

    详情:

    我不能 100% 确定您在这里的目的是什么,但以下建议将完全从字面上回答您的问题:

    如何在 plotly 中添加多个带循环的形状?

    然后你必须弄清楚有关以下内容的详细信息:

    设法将我的所有关键点线放在一张图表上

    剧情:

    该图本身很可能不是您要寻找的,但由于您出于某种原因要按数据长度添加一个图for i in range(0,len(data),所以我做了这个:

    代码:

    这个 sn-p 将展示如何使用 for 循环处理所有需要的轨迹和形状:

    # Imports
    import pandas as pd
    #import matplotlib.pyplot as plt
    import numpy as np
    import plotly.graph_objects as go
    #from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
    
    # data, random sample to illustrate stocks
    np.random.seed(12345)
    rows = 20
    x = pd.Series(np.random.randn(rows),index=pd.date_range('1/1/2020', periods=rows)).cumsum()
    y = pd.Series(x-np.random.randn(rows)*5,index=pd.date_range('1/1/2020', periods=rows))
    df = pd.concat([y,x], axis = 1)
    df.columns = ['StockA', 'StockB']
    
    # lines
    df['keyPoints1']=np.random.randint(-5,5,len(df))
    df['keyPoints2']=df['keyPoints1']*-1
    
    # plotly traces
    fig = go.Figure()
    stocks = ['StockA', 'StockB']
    df[stocks].tail()
    
    traces = {}
    for i in range(0, len(stocks)):
        traces['trace_' + str(i)]=go.Scatter(x=df.index,
                                             y=df[stocks[i]].values,
                                             name=stocks[i])
    data=list(traces.values())  
    fig=go.Figure(data)
    
    # shapes update
    colors = ["LightSkyBlue", "RoyalBlue", "forestgreen", "lightseagreen"]
    ply_shapes = {}
    for i in range(1, len(df)):
        ply_shapes['shape_' + str(i)]=go.layout.Shape(type="line",
                                                        x0=df.index[i-1],
                                                        y0=df['keyPoints1'].iloc[i-1],
                                                        x1=df.index[i],
                                                        y1=df['keyPoints2'].iloc[i-1],
                                                        line=dict(
                                                            color=np.random.choice(colors,1)[0],
                                                            width=30),
                                                        opacity=0.5,
                                                        layer="below"
                                                    )
    lst_shapes=list(ply_shapes.values())
    fig.update_layout(shapes=lst_shapes)
    fig.show()
    

    【讨论】:

    • 你做得很好@vestland!我从你的代码 sn-p 中得到解决方案。非常感谢。
    • @Syildiz 乐于助人!看到你的解决方案也很酷!
    • 你能帮我创建一个分位数范围内的矩形图吗? link
    • @shaikmoed 当然!如果您确保按照here 所述提供数据样本
    • 我添加了示例数据。请立即检查。 link
    【解决方案2】:

    你也可以使用 fig.add_{shape}:

    fig = go.Figure()
        
    fig.add_trace( 
        go.Scatter( ...)
    
    for i in range( 1, len( vrect)):
        fig.add_vrect( 
            x0=vrect.start.iloc[ i-1], 
            x1=vrect.finish.iloc[ i-1], 
            fillcolor=vrect.color.iloc[ i-1]], 
            opacity=0.25, 
            line_width=0)  
    
    fig.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 2018-09-06
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多