Python - Plotly: ¿Cómo cambiar el rango del eje y de una subtrama?

CorePress2024-01-25  8

Tengo el siguiente código:

from plotly.subplots import make_subplots
import requests 
import json
import datetime as dt
import pandas as pd
import plotly.graph_objects as go




def get_candles(symbol, window, interval='1h'):
    url = "https://api.binance.com/api/v1/klines"
    end_time = dt.datetime.utcnow()
    delta = dt.timedelta(hours = window)
    start_time = end_time - delta
    start_date = str(int(start_time.timestamp() * 1000))
    end_date = str(int(end_time.timestamp() * 1000))
    limit = '1000'
    market = symbol + 'BUSD'

    req_param = {"symbol": market, "interval": interval, "startTime": start_date, "endTime": end_date, "limit": limit}

    text = requests.get(url, params = req_param).text
    data = json.loads(text)
    df = pd.DataFrame(data)
    df.columns = ['open_time',
                    'o', 'h', 'l', 'c', 'v',
                    'close_time', 'qav', 'num_trades',
                    'taker_base_vol', 'taker_quote_vol', 'ignore']

    df.index = [dt.datetime.fromtimestamp(x/1000.0) for x in df.close_time]

    return df


def chart(symbol, interval='1h'):
    windows = {'1m': 1, '5m': 5, '15m': 15, '30m': 30, '1h': 60, '2h': 120, '4h': 240, '6h': 360, '12h': 720, '1d': 1440}
    chart = get_candles(symbol.upper(), windows[interval], interval)
    fig = make_subplots(specs=[[{"secondary_y": True}]])
    print(chart['v'].max())
    fig.add_trace(go.Candlestick(x=chart.index,
            open=chart['o'],
            high=chart['h'],
            low=chart['l'],
            close=chart['c'],
            name="yaxis1 data",
            yaxis='y1'), secondary_y=True)
    fig.add_trace(go.Bar(x=chart.index, y=chart['v'], name="yaxis2 data", yaxis="y2"), secondary_y=False)
    fig.layout.yaxis2.showgrid=False
    fig.update_yaxes(type="linear")
    fig.update_layout(xaxis_rangeslider_visible=False)
    
    # fig.show()

    fig.write_image("figure.png", engine="kaleido")
    
chart('bnb')

Y produce la siguiente imagen:

Ahora quiero que las barras de volumen lleguen solo a 1/3 de la altura total del gráfico e intenté hacer esto de esta manera:

fig.update_layout(yaxis1=dict(title="barras", dominio=[0, int(2* gráfico['v'].max())]))

Pero esto no hace nada.

¿Cómo le doy un nombre a un determinado eje y y cambio su rango?



------------------------------------

Este es el camino:

fig.update_layout(yaxis2 = dict(range=[<from_value>, <to_value>]))

Por mi parte, su ejemplo de código no funciona. Pero en este ejemplo, la siguiente configuración:

fig.update_layout(yaxis2 = dict(range=[0, 300*10**6]))

... convertirá esto:

... en tsuyo:

Código completo:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd

# data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# include candlestick with rangeselector
fig.add_trace(go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'], high=df['AAPL.High'],
                low=df['AAPL.Low'], close=df['AAPL.Close']),
               secondary_y=False)

# include a go.Bar trace for volumes
fig.add_trace(go.Bar(x=df['Date'], y=df['AAPL.Volume']),
               secondary_y=True)
f = fig.full_figure_for_development(warn=False)

fig.layout.yaxis2.showgrid=False
fig.update_layout(yaxis2 = dict(range=[0, 300*10**6]))
fig.show()



------------------------------------

Tuve un problema similar a este, pero las respuestas anteriores no me ayudaron ya que mi gráfico es dinámico. Dependiendo del período de tiempo, el volumen máximo puede oscilar entre 300 y 10 millones, por lo que los rangos fijos no eran buenos.

Parecía que la mejor solución era usar la función max() para encontrar el valor más alto en la columna de volumen de mi marco de datos (también dinámico):

maxVol = max(df['Volume'], key=float)
ymax = float(maxVol)
print(ymax)

Luego simplemente use lo siguiente para escalar el rango máximo en un factor de 3

fig.update_layout(yaxis=dict(range=[0, ymax*3]))

5

1

Lo sé, también leí los documentos. Lo que no puedo entender es cómo cambiar 1 eje y (tengo 2).

- Mathijs van den Doel

28/03/2021 a las 15:36

¿Has probado second_y = False o True? Ver: plotly.com/python/multiple-axes

-astrochun

28/03/2021 a las 15:37

1

La figura contiene ambos ejes, por lo que al actualizar, aún debes ser explícito. Al igual que usas add_trace, debes especificar second_y en tu fig.update_yaxes

-astrochun

28/03/2021 a las 17:45

Gracias, eso es todo

- Mathijs van den Doel

28/03/2021 a las 19:19

@MathijsvandenDoel, cuando tenga la oportunidad, modificaré mi respuesta para que sea una respuesta aceptable.

-astrochun

28/03/2021 a las 20:54

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare