Alinear varios ejes Y a un valor en Plotly

Sep 03 2020

Tengo el siguiente código (ligeramente modificado de la página de Plotly)

import plotly.graph_objects as go
from plotly.subplots import make_subplots

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

# Add traces
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis data"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[2, 3, 4], y=[80, 40, 30], name="yaxis2 data"),
    secondary_y=True,
)

# Add figure title
fig.update_layout(
    title_text="Double Y Axis Example"
)

# Set x-axis title
fig.update_xaxes(title_text="xaxis title")

# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b> yaxis title", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b> yaxis title", secondary_y=True)

fig.show()

Esto da como resultado

Ahora ve los dos círculos rojos a la izquierda y uno a la derecha. Puede ver que el valor 50 no está alineado con el mismo rect.

¿Cómo puedo hacer que el eje Y izquierdo y el eje Y derecho estén alineados en un punto en particular? (en la mayoría de los casos sería 0)

EDITAR: Me gustaría aclarar que los valores en ambos ejes (izquierda y derecha) pueden ser muy diferentes. Me gusta

Solo quiero que la alineación de un valor (en este caso el 0) esté al mismo nivel

Respuestas

1 vestland Sep 03 2020 at 09:05

Puedes hacerlo así:

  1. Establezca (o busque) valores mínimos y máximos apropiados para sus ejes y,
  2. ajuste sus rangos y usando fig.update_layout(yaxis=dict(range=[all_min,all_max]), yaxis2=dict(range=[all_min,all_max])), y
  3. establezca el scaleanchorde su eje y secundario de y1esta manera:fig.update_layout(yaxis2=dict(scaleanchor = 'y1'))

Trama:

Si la cantidad de datos de su figura es un marco de datos de pandas, hay formas más elegantes de encontrar valores máximos y mínimos globales que simplemente codificarlos allí. De lo contrario, el enfoque será el mismo.

Código completo: