plotly / plotly/plotly.py

[BUG]: FigureWidget: layout.shapes not updated after drawing a path in JupyterLab

Abierto
#5,689 4 comentarios 0 reacciones 1 asignado Ver en GitHub

@emilykl ya está trabajando en esto.

Desde el 3/8/2026.

bug P3 size: 1
Lenguaje dominante
Python
Estrellas
18.8k
Forks
2.8k
Merge medio
16 h 26 min
PR fusionados (30 d)
21

Descripción

Description

When attempting to enable draw closed paths on a plotly.graph_objects.FigureWidget, I noticed that there was an issue when attempting to delete the existing drawn paths. It seems that while fig.layout.to_plotly_json().get("shapes") is able to detect the path drawn, this information is not relayed to fig.layout.shapes. This can be fixed by manually editing fig.layout.to_plotly_json().get("shapes"), plugging it into fig.layout.shapes, and then deleting. The manual edits are to remove the <object object at 0x000001BFE6411440> that is assigned to both "name" and "legendwidth".

Steps to reproduce
import plotly.graph_objects as go
import ipywidgets as widgets
from IPython.display import display

fig = go.FigureWidget(
    go.Heatmap(
        z=[[1, 2], [3, 4]],
        showscale=False,
    )
)

fig.update_layout(
    dragmode="drawclosedpath",
    newshape=dict(
        line=dict(color="red", width=2)
    )
)

fail_clear_button = widgets.Button(description="Clear ROI (Fails)")
working_clear_button = widgets.Button(description="Clear ROI (Works)")
out = widgets.Output() 

def clear_roi(_):
    with out:
        print("layout.shapes:", fig.layout.shapes)
        print("JSON shapes:", fig.layout.to_plotly_json().get("shapes"))
        with fig.batch_update():         
            fig.layout.shapes = []
        print("After update_layout")
        print("layout.shapes:", fig.layout.shapes)
        print("JSON shapes:", fig.layout.to_plotly_json().get("shapes"))

def clear_roi_alt(_):
    with out:
        print("layout.shapes:", fig.layout.shapes)
        print("JSON shapes:", fig.layout.to_plotly_json().get("shapes"))
        json_shapes = fig.layout.to_plotly_json().get("shapes", [])
        for s in json_shapes:
            s['legendwidth'] = 0
            s['name'] =  ''
        fig.layout.shapes = json_shapes
        print("After pulling from JSON")
        print("layout.shapes:", fig.layout.shapes)
        print("JSON shapes:", fig.layout.to_plotly_json().get("shapes"))
        fig.layout.shapes = []
        print("After clearing")
        print("layout.shapes:", fig.layout.shapes)
        print("JSON shapes:", fig.layout.to_plotly_json().get("shapes"))

fail_clear_button.on_click(clear_roi)
working_clear_button.on_click(clear_roi_alt)

display(widgets.VBox([fail_clear_button, working_clear_button, fig, out]))
Notes

Python: 3.12.13
Plotly: 6.9.0
JupyterLab: 4.5.6
ipywidgets: 8.1.8
OS: Windows-11-10.0.26100-SP0

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.