plotly.py icon indicating copy to clipboard operation
plotly.py copied to clipboard

Choropleth_mapbox and FigureWidget - 'mapbox._derived' Value Error

Open macadology opened this issue 4 years ago • 19 comments

When plotting a choropleth_mapbox using plotly express and containing it within a figure widget, I am encountering a ValueError when I drag the plot around. The error does not affect the interactivity of the plot, but it does create a huge error log in the output. I thought about trying go.add_choroplethmapbox(), but realized that the arguments are different from the plotly express version.

I have included a sample code below.

Plotly [offline] jupyter core : 4.6.3 jupyter-notebook : 6.0.3 ipywidgets : 7.5.1 traitlets : 4.3.3 plotly : 4.8.1

import plotly.express as px
import plotly.graph_objs as go

df = px.data.election()
geojson = px.data.election_geojson()

fig = px.choropleth_mapbox(df, geojson=geojson, color="Bergeron",
                           locations="district", featureidkey="properties.district",
                           center={"lat": 45.5517, "lon": -73.7073},
                           mapbox_style="carto-positron", zoom=9)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
figwid = go.FigureWidget(fig)
display(figwid)
ValueError: 
Invalid property path 'mapbox._derived' for layout

macadology avatar Jun 15 '20 19:06 macadology

Added a temporary hack in basedatatypes.py to skip the exception specifically for mapbox._derived and it seems to work for now.

if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):
                if key_path_str == "mapbox._derived":
                    return
                raise ValueError(
                    """
Invalid property path '{key_path_str}' for layout
""".format(
                        key_path_str=key_path_str
                    )
                )

macadology avatar Jun 16 '20 05:06 macadology

Hello! Have you solved the issue? I'm a newbee in coding, would you answer, is your temporary solution should be placed in a specific place of basedatatypes.py? I've inserted it below and got the same error.

n1rvanana avatar Jul 27 '20 11:07 n1rvanana

When editing basedatatypes.py, look for the code snippet

if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):
     raise ValueError(...

Before the error is raised, create a conditional check that skips that error if key_path_str == "mapbox._derived" as I have done above. Note that this is obviously a hack that will no longer work when you install a new version of plotly.

macadology avatar Jul 27 '20 14:07 macadology

Hello, just to note that I also have the same issue with a scatter mapbox plot. Using add_scattermapbox does not seem to help. Here is a minimal reproducer:

import plotly.graph_objects as go
import numpy as np
lons = np.random.random(1000) * 360.0
lats = np.random.random(1000) * 180.0 - 90.0
z = np.random.random(1000) * 50.0
fig = go.FigureWidget()
fig.add_scattermapbox(lon=lons, lat=lats, marker={'color': z})
fig.update_layout({'mapbox': {'style': 'stamen-terrain'}})

cjroberts avatar Sep 24 '20 10:09 cjroberts

I have the same issue. The workaround by @macadology seems to be temporary.

sanskarvijpuria avatar Nov 05 '20 18:11 sanskarvijpuria

I have the same issue too. Is there anyway to suppress the warning at least without altering the .py file mentioned above? Is there some callback we can listen for that is triggering it?

Jmete avatar Nov 22 '20 14:11 Jmete

Just run this to do @macadology 's edit.

basedatatypesPath = os.path.join(os.path.dirname(os.__file__),'site-packages','plotly','basedatatypes.py')

# read basedatatypes.py
with open(basedatatypesPath, 'r') as f:
    lines = f.read()

find = 'if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):'

replace = """if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):
                if key_path_str == "mapbox._derived":
                    return"""

# add new text
lines = lines.replace(find,replace)

# overwrite old 'basedatatypes.py'
with open(basedatatypesPath, 'w') as f:   
    f.write(lines)

DougRzz avatar Dec 04 '20 11:12 DougRzz

I'm also having the same issue. Are there any updates on when this will be addressed?

pjireland avatar Feb 11 '21 21:02 pjireland

Just bumping this. Seeing the same behavior for @cjroberts min example. plotly 5.1.0 ipywidgets 7.6.3 notebook 6.4.0 Is this a bug or user error? If user error, does anyone have any information on what we are missing?

briochh avatar Jun 29 '21 01:06 briochh

No one on our development team has ever been able to reproduce this behaviour starting from a clean environment, so we don't know what to recommend. If someone can provide reproducible instructions for replicating this behaviour, I can investigate further. Some folks have reportedly achieved success by un/re-installing plotly and rebooting Jupyter.

nicolaskruchten avatar Jun 29 '21 12:06 nicolaskruchten

Yay, glad to hear back from the development team.

I tried it again from a clean environment too and I encountered the same error. See below for my setup using conda and pip. For convenience, I didn't specify a particular version but instead rely on pip to resolve the latest version.

conda create -n myenv python=3.9
conda activate myenv
pip install plotly
pip install pandas
pip install ipython
pip install ipywidgets
pip install jupyter
pip install notebook

When running the min code in a jupyter notebook environment, the error message appears whenever I interact with the plot. Below is a screenshot of the actual error. Is it possible the development team tested the code outside of the notebook environment? Let me know if I should create a mybinder notebook to reproduce the error.

image ...more error messages... image

macadology avatar Jun 29 '21 13:06 macadology

Thanks for this. Yes, a replicable environment like Binder would be a great help :)

nicolaskruchten avatar Jun 29 '21 14:06 nicolaskruchten

Here you go. https://github.com/macadology/plotly_binder https://mybinder.org/v2/gh/macadology/plotly_binder/master?filepath=%2Fmin_code.ipynb

Once the plot is generated, moving it or interacting with it will cause error messages to appear in the output cell below the plot.

macadology avatar Jun 29 '21 15:06 macadology

I am having the same issue with Python 3.8, notebook 6.1.4, plotly 5.5.0.

plotly

giswqs avatar Dec 26 '21 01:12 giswqs

also seeing this with python 3.9 plotly 5.10 making the scattarmapbox unusable for us.

where does the mapbox._derived property come from? image

janhurst avatar Sep 28 '22 03:09 janhurst

Run the following function as a temporary fix.

def fix_widget_error():
    """
    Fix FigureWidget - 'mapbox._derived' Value Error.
    Adopted from: https://github.com/plotly/plotly.py/issues/2570#issuecomment-738735816
    """
    import shutil
    import pkg_resources

    pkg_dir = os.path.dirname(pkg_resources.resource_filename("plotly", "plotly.py"))

    basedatatypesPath = os.path.join(pkg_dir, "basedatatypes.py")

    backup_file = basedatatypesPath.replace(".py", "_bk.py")
    shutil.copyfile(basedatatypesPath, backup_file)

    # read basedatatypes.py
    with open(basedatatypesPath, "r") as f:
        lines = f.read()

    find = "if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):"

    replace = """if not BaseFigure._is_key_path_compatible(key_path_str, self.layout):
                if key_path_str == "mapbox._derived":
                    return"""

    # add new text
    lines = lines.replace(find, replace)

    # overwrite old 'basedatatypes.py'
    with open(basedatatypesPath, "w") as f:
        f.write(lines)

giswqs avatar Sep 28 '22 03:09 giswqs

@giswqs unfortunately I cannot... the environment I am using does not permit writing to site-packages

janhurst avatar Sep 28 '22 04:09 janhurst

@janhurst Sorry to hear that! This issue has been open for 2.5 years now. I have been waiting for an official fix. Not sure when it will happen.

giswqs avatar Sep 28 '22 04:09 giswqs

I am seeing the same problem with:

  • plotly-5.19.0-pyhd8ed1ab_0
  • notebook-7.1.0-pyhd8ed1ab_0
  • python-3.11.8-hdf0ec26_0_cpython

thadd3us avatar Feb 23 '24 20:02 thadd3us

This still seems to a problem. It is now July, 2024. Is the above workaround still the recommended way to deal with this problem? Thank you.

pmallas avatar Jul 26 '24 14:07 pmallas

@archmoj will your recent work with MapLibre address this?

gvwilson avatar Aug 12 '24 15:08 gvwilson