Как добавить более одной фигуры с помощью петли - PullRequest
1 голос
/ 21 октября 2019

Я использую plotly package, чтобы показать динамический финансовый график на 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. Я могу нарисовать только одну дату, как показано на рисунке ниже, однако мне не удалось показать все диапазоны на одном графическом графике.

Вот примерный набор данных .

Data Example

Plotly Example

Вот решение для добавленных строк:

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()

1 Ответ

1 голос
/ 22 октября 2019

Ответ:

Для полного контроля каждой вставляемой фигуры вы можете придерживаться этой логики:

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%, на что вы нацелены, но следующее предложение буквально ответит на ваш вопрос относительно:

Как добавить ещечем одна фигура с петлей на графике?

Тогда вам придется выяснить детали относительно:

удастся разместить все линии ключевых точек на одном графике

Сюжет:

Сам сюжет, скорее всего, не тот, который вы ищете, но, поскольку вы по какой-то причине добавляете сюжет по длиневаши данные for i in range(0,len(data), я сделал это:

enter image description here

код:

Этот фрагмент будетпокажите, как обрабатывать все желаемые трассы и формы с помощью циклов 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()
...