plotly / plotly/plotly.py

px.line erratic and wrong for large x value ranges

Open
#4,655 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

Problem

Plotting a straight line from ($-X$, 0) to ($+X$, 1) for various (large) $X$ within a much smaller window results in wrong and inconsistent behavior, as demonstrated in below minimum non-working examples (using a Jupyter notebook with plotly.js v2.27.0).

I doubt that this behavior can be explained by intrinsic rounding problems, since

>>> np.interp([-0.1,0.1],[-1e17,+1e17],[0,1])
array([0.5, 0.5])

>>> np.interp([-0.1,0.1],[-1e18,+1e18],[0,1])
array([0.5, 0.5])

Examples

Data frame

df = pd.DataFrame(dict(x=[-1e17,+1e17,-1e18,+1e18],
                       y=[0,1,0,1],
                       xlimit=['±1e17','±1e17','±1e18','±1e18']))

Very tight plotting range (symmetric 0.1)

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-.1,.1],
              range_y=[0.4,0.6],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

pxLine_0_1

Slightly wider plotting range (symmetric 0.3)

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-.3,.3],
              range_y=[0.4,0.6],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

pxLine_0_3

Another plotting range (symmetric 1)

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-1,1],
              range_y=[0.4,0.6],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

pxLine_1

Another even wider plotting range (symmetric 3)

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-3,3],
              range_y=[0.4,0.6],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

pxLine_3

Apparently wide enough plotting range (symmetric 3.2)

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-3.2,3.2],
              range_y=[0.4,0.6],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

pxLine_3_2

As far as my tests go, for any range_x that is wider than about ±3, the plotting is rendered correctly:

fig = px.line(df,x='x',y='y',color='xlimit',
              range_x=[-1e17,1e17],
              range_y=[0,1],
              width=400,
              height=400,)
fig.update_traces(opacity=0.5)
fig.show()

px_Line_full

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

Reproduce the issue in a Jupyter notebook using px.line with the supplied DataFrame, narrow range_x values, and plotly.js v2.27.0. Compare the rendered lines across the example ranges and trace whether the behavior originates in the plotly.py px.line path or the plotly.js rendering; done means the large-range lines render consistently in the provided cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, 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.