set categoryarray=None for that axis when matches=None
Open
Nobody has claimed this yet.
feature
P3
- Dominant language
- Python
- Stars
- 18.8k
- Forks
- 2.8k
- Avg merge
- 16h 26m
- Merged PRs (30d)
- 21
Description
Current behaviour
When a plot is created with facetted rows and xaxes matches is set to None, in the bottom plot the ticklabels for the values that are in other rows are still visible.
import plotly.express as px
import plotly
df = plotly.data.election()
fig = px.scatter(df, x= 'winner', y='total', facet_row="winner")
fig.for_each_xaxis(lambda x: x.update(showticklabels=True, matches=None))
fig.show()
- When a facetted figure is created, the items regarding xaxes of the resulting fig.layout look like this:
'xaxis': {'anchor': 'y',
'categoryarray': [Joly, Coderre, Bergeron],
'categoryorder': 'array',
'domain': [0.0, 0.98],
'title': {'text': 'winner'}},
'xaxis2': {'anchor': 'y2', 'domain': [0.0, 0.98], 'matches': 'x', 'showticklabels': False},
'xaxis3': {'anchor': 'y3', 'domain': [0.0, 0.98], 'matches': 'x', 'showticklabels': False},
xaxis2andxaxis3refer to the two top rows, while xaxis refers to the bottom one. The main difference between the two groups is that xaxis has some additional items/properties:'categoryarray': [Joly, Coderre, Bergeron], 'categoryorder': 'array', 'title': {'text': 'winner'}- When we apply
fig.for_each_xaxis(lambda x: x.update(showticklabels=True, matches=None)), the same part offig.layoutgets updated to:
'xaxis': {'anchor': 'y',
'categoryarray': [Joly, Coderre, Bergeron],
'categoryorder': 'array',
'domain': [0.0, 0.98],
'showticklabels': True,
'title': {'text': 'winner'}},
'xaxis2': {'anchor': 'y2', 'domain': [0.0, 0.98], 'showticklabels': True},
'xaxis3': {'anchor': 'y3', 'domain': [0.0, 0.98], 'showticklabels': True},
- The
categoryarrayandcategoryorderelements are still there (with the values for the three facets, not only the bottom one), so we need to remove them, which we can do with:
fig.for_each_xaxis(lambda x: x.update(categoryorder=None, categoryarray=None))
or
fig.update_xaxes(categoryarray=None, selector={'anchor':'y'})
- The updated part of the dict is:
'xaxis': {'anchor': 'y', 'domain': [0.0, 0.98], 'showticklabels': True, 'title': {'text': 'winner'}},
'xaxis2': {'anchor': 'y2', 'domain': [0.0, 0.98], 'showticklabels': True},
'xaxis3': {'anchor': 'y3', 'domain': [0.0, 0.98], 'showticklabels': True},
Desired behaviour
- When a plot is created with facetted rows and xaxes matches is set to None,
categoryordershould be set toNonefor those axes. - If the
categoryorderhas been specified on plot creation, that order is respected even after settingcategoryordertoNone. It would only be changed if we set a new value for that argument:
import plotly.express as px
df = px.data.tips()
df['weekend'] = df['day'].apply(lambda x: "weekend" if x in ["Sat", "Sun"] else "weekday")
fig = px.bar(df, x="day", y="total_bill", color="smoker", barmode="group", facet_row="weekend",
category_orders={
"weekend":["weekday", "weekend"],
"day": ["Thur", "Fri", "Sat", "Sun"],
"smoker": ["Yes", "No"],
"sex": ["Male", "Female"]
})
fig.for_each_xaxis(lambda x: x.update(showticklabels=True, matches=None))
fig.update_xaxes(categoryarray=None, selector={'anchor':'y'})
fig.show()
fig.update_xaxes(categoryarray=["Sun", "Sat"], selector={'anchor':'y'})
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 provided Plotly Express faceted-row reproduction and inspect the generated xaxis, xaxis2, and xaxis3 layout objects before and after setting matches=None. Verify that clearing categoryarray and categoryorder removes facet-wide category values while preserving an explicit category_orders setting, and confirm the resulting axis layout with the shown examples.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data-visualization
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100