Inconsistent theme updates using `template`
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
- Issue type
- Bug
- Clarity
- Needs clarification
- Activity status
- Stale
- Tech stack
- python
- Domain
- data-visualization
Research direction
Start by reproducing the Plotly Express and graph-object examples using template and update_layout, including the explicit colorscale case. Compare how Figure 2/3 and Figure 5/7 resolve template settings, then clarify which of the two proposed behaviors is intended. Done means the accepted template-update semantics are consistent across both interfaces and the documented examples no longer diverge.
Written by the indexing model from the issue text.
Description
According to Theming and templates in Python, a figure can be created using a predefined template or updated to match it. However, the way updates happen is confusing if not inconsistent. Consider the examples below for plotly[express] == 6.2.0.
Plotly Express
import plotly.express as px
df = px.data.iris()
# uses the default `plotly` template
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="petal_length", title="Figure 1")
fig.show()
# update to use another template, note that the colour scale is unchanged
fig.update_layout(template="seaborn", title="Figure 2")
fig.show()
# this is not equivalent to Figure 2
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="petal_length", template="seaborn", title="Figure 3")
fig.show()
So Figure 3 is not the same as Figure 2, at least because the colour scales don't match. For custom themes, I can imagine that there may be other components of the figure object that would differ. As far as I know, there is no way to update traces using a template, e.g., fig.update_traces(template="seaborn"), to adjust non-layout settings.
Plotly Graph Object
To make things more confusing, there is a Specifying themes in graph object figures example in the documentation that does the same, but it actually works as expected. Adjusting the example we get:
import plotly.express as px
import plotly.graph_objects as go
df = px.data.iris()
# uses the default `plotly` template
fig = go.Figure(
data=go.Scatter(
x=df["sepal_width"],
y=df["sepal_length"],
mode="markers",
marker={
"color": df["petal_length"],
"showscale": True,
},
)
)
fig.update_layout(title="Figure 4")
fig.show()
# update to use another template, note that the colour scale has changed as expected
fig.update_layout(template="seaborn", title="Figure 5")
fig.show()
However, specifying an explicit colorscale will prevent a template update from setting its own colour scheme:
# same as Figure 4 but with an explicit `colorscale`
fig = go.Figure(
data=go.Scatter(
x=df["sepal_width"],
y=df["sepal_length"],
mode="markers",
marker={
"color": df["petal_length"],
"colorscale": "Viridis", # or any other colour scale
"showscale": True,
},
)
)
fig.update_layout(title="Figure 6")
fig.show()
# no longer matches Figure 5
fig.update_layout(template="seaborn", title="Figure 7")
fig.show()
Suggestions
- I would expect
fig.update_layout(template="seaborn")to have the same effect, regardless of whetherpxorgointerface is used. From this perspective, to result for Figure 2 is a bug (the colour scale should have changed forseaborntemplate). - When an existing figure is updated, the settings from a template should take precedence over any existing settings. So Figure 5 and Figure 7 should produce the same result. This would entail that an update in Figure 7 overwrites whatever the
colorscalesetting Figure 6 has with that of a template provided inupdate_layout.
- Dominant language
- Python
- Stars
- 18.8k
- Forks
- 2.8k
- Avg merge
- 16h 26m
- Merged PRs (30d)
- 21
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.
More from plotly/plotly.py
-
P3 size: 1 task
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
bug P1
Difficulty 1/5 Under an hour Newbie friendliness 68/100
-
feature P3
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
-
feature P3
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
Difficulty 3/5 1-2 days Newbie friendliness 35/100
All issues in plotly/plotly.py
Similar issues
-
Add: hunch Open
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
AbdelStark/awesome-typesafe#104 ·
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
DiamondLightSource/dodal#2211 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
openml/openml-python#1749 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
sipyourdrink-ltd/bernstein#6191 ·