FigureWidget update issues after single bin histogram.
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 18.8k
- Forks
- 2.8k
- Avg merge
- 16h 26m
- Merged PRs (30d)
- 21
Description
Running into an (admittedly quite edgy) issue updating a plotly graph_object Histogram in a FigureWidget.
The issue only seems to arise when using barmode='overlay' and seems to result from updating .data[0].x to a degenerative
(single bin) array (i.e. all elements equal).
Running in Jupyterlab the issue can be reproduced by:
import plotly.graph_objects as go
import numpy as np
hist_wgt = go.FigureWidget([go.Histogram(x=np.random.random(200), histnorm='probability', opacity=0.7)],
layout=dict(barmode='overlay'))
display(hist_wgt)
which produces a nicely binned histogram e.g.
and
print("xrange:", hist_wgt.layout.xaxis.range)
print("nbinsx:", hist_wgt.data[0].nbinsx)
print("yrange:",hist_wgt.layout.yaxis.range)
print("start:", hist_wgt.data[0].xbins.start)
print("end:", hist_wgt.data[0].xbins.end)
print("size:", hist_wgt.data[0].xbins.size)
xrange: (6.938893903907228e-17, 0.9999999999999999)
nbinsx: 0
yrange: (0, 0.1736842105263158)
start: 0
end: 1
size: 0.1
However, if we update hist_wgt.data[0].x with a (terrible) uniform array:
hist_wgt.data[0].x = np.ones(200)
the histogram becomes a single bin (as expected):
and the layout and bin info:
xrange: (0.5, 1.5)
nbinsx: 0
yrange: (0, 1.0526315789473684)
start: 0.5
end: 1.5
size: 1
The issue now happens when we try to update hist_wgt.data[0].x, but with with a more sensible array:
hist_wgt.data[0].x = np.random.random(200) * 1e6
it seems the widget layout is not re-evaluated or updated for this new x:
although nbinsx does get set to None (unsure if this is significant):
xrange: (0.5, 1.5)
nbinsx: None
yrange: (0, 1.0526315789473684)
start: 0.5
end: 1.5
size: 1
My guess is that the ambiguous nature of bin-width where the data range is 0 means that something is being set for the widget layout for that special case -- and then this setting overrides any later auto-range operations?
I am happy to admit that trying to plot a single bin histogram is slightly pointless but I want the histogram to be updatable for user selected variables, some of which could could collapse to a single value. I have tried to find an option to force the layout update through but haven't stumble upon the right combination of calls.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the FigureWidget and go.Histogram reproduction in JupyterLab, first confirming the update sequence from varied data to a single-bin array and back. Trace how changing FigureWidget.data[0].x updates histogram bin metadata and axis ranges; done means the layout and bin information are recalculated for the new data rather than retaining the single-bin values.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- jupyter-notebook, numpy, 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