plotly / plotly/plotly.py

FigureWidget doesn't allow draggable polygon

Open
#4,374 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug P3
Dominant language
Python
Stars
18.8k
Forks
2.8k
Avg merge
16h 26m
Merged PRs (30d)
21

Description

Using the following minimal code I wasn't able to draw a closed path and then drag and drop the polygon. Check the full error code.

from plotly.graph_objs._figurewidget import FigureWidget

FigureWidget(
    layout={
        'modebar': {
            "add": [
                "drawclosedpath",
                "eraseshape",
            ]
        },
    }
)
Full error code
ValueError                                Traceback (most recent call last)
File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/ipywidgets/widgets/widget.py:773, in Widget._handle_msg(self, msg)
    771         if 'buffer_paths' in data:
    772             _put_buffers(state, data['buffer_paths'], msg['buffers'])
--> 773         self.set_state(state)
    775 # Handle a state request.
    776 elif method == 'request_state':

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/ipywidgets/widgets/widget.py:650, in Widget.set_state(self, sync_data)
    645         self._send(msg, buffers=echo_buffers)
    647 # The order of these context managers is important. Properties must
    648 # be locked when the hold_trait_notification context manager is
    649 # released and notifications are fired.
--> 650 with self._lock_property(**sync_data), self.hold_trait_notifications():
    651     for name in sync_data:
    652         if name in self.keys:

File ~/micromamba/envs/streetsurface/lib/python3.10/contextlib.py:142, in _GeneratorContextManager.__exit__(self, typ, value, traceback)
    140 if typ is None:
    141     try:
--> 142         next(self.gen)
    143     except StopIteration:
    144         return False

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/traitlets/traitlets.py:1502, in HasTraits.hold_trait_notifications(self)
   1500 for changes in cache.values():
   1501     for change in changes:
-> 1502         self.notify_change(change)

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/ipywidgets/widgets/widget.py:701, in Widget.notify_change(self, change)
    698     if name in self.keys and self._should_send_property(name, getattr(self, name)):
    699         # Send new state to front-end
    700         self.send_state(key=name)
--> 701 super().notify_change(change)

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/traitlets/traitlets.py:1517, in HasTraits.notify_change(self, change)
   1515 def notify_change(self, change):
   1516     """Notify observers of a change event"""
-> 1517     return self._notify_observers(change)

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/traitlets/traitlets.py:1564, in HasTraits._notify_observers(self, event)
   1561 elif isinstance(c, EventHandler) and c.name is not None:
   1562     c = getattr(self, c.name)
-> 1564 c(event)

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/plotly/basewidget.py:644, in BaseFigureWidget._handler_js2py_relayout(self, change)
    640     relayout_data.pop("lastInputTime")
    642 # Perform relayout
    643 # ----------------
--> 644 self.plotly_relayout(relayout_data=relayout_data, source_view_id=source_view_id)
    646 self._js2py_relayout = None

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/plotly/basedatatypes.py:2612, in BaseFigure.plotly_relayout(self, relayout_data, **kwargs)
   2608     msg_kwargs = {}
   2610 # Perform relayout operation on layout dict
   2611 # -----------------------------------------
-> 2612 relayout_changes = self._perform_plotly_relayout(relayout_data)
   2613 if relayout_changes:
   2614     # The relayout operation resulted in a change to some layout
   2615     # properties, so we dispatch change callbacks and send the
   2616     # relayout message to the frontend (if any)
   2617     self._send_relayout_msg(relayout_changes, **msg_kwargs)

File ~/micromamba/envs/streetsurface/lib/python3.10/site-packages/plotly/basedatatypes.py:2648, in BaseFigure._perform_plotly_relayout(self, relayout_data)
   2644         for key_path_str, v in relayout_data.items():
   2646             if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):
-> 2648                 raise ValueError(
   2649                     """
   2650 Invalid property path '{key_path_str}' for layout
   2651 """.format(
   2652                         key_path_str=key_path_str
   2653                     )
   2654                 )
   2656             # Apply set operation on the layout dict
   2657             val_changed = BaseFigure._set_in(self._layout, key_path_str, v)

ValueError: 
Invalid property path 'shapes[0].path' for layout

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the minimal FigureWidget example and follow BaseFigureWidget._handler_js2py_relayout into BaseFigure._perform_plotly_relayout, where the invalid shapes[0].path property path is raised. Check how drawclosedpath and dragging update layout shapes, then verify that drawing and dragging a closed polygon no longer raises this error.

Written by the indexing model from the issue text.

Assessment

Tech stack
jupyter-notebook, python
Domain
data-visualization
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.