Repository navigation
Fix *auto* text of zero-length bar traces - #8078
william-xue wants to merge 4 commits into
Conversation
A zero-length bar kept its text hidden when textposition was *auto*, while *outside* text was drawn. Only hide text for a bar with no position or for *inside* placement.
Baselines taken from the ubuntu-latest CI renders of run 39709994398 (per CONTRIBUTING: download from the test-baselines job). Only the mocks whose text placement changes with this fix: bar/funnel zero-length cases. map_* and scattermap_dynamic_defaults are left untouched - they differ only because Mapbox tokens are not available to PR runs.
|
Thanks for the PR. This changes behavior that might be considered a feature, so I'm going to pause on reviewing until I discuss this with my team. |
|
Understood — no rush on the review. For the discussion, both sides of the record are now in the description:
What tipped it for me was consistency rather than preference: the If the team lands on the current behaviour being intended, say so and I'll close this. |
Fixes #6474.
What changes
src/traces/bar/plot.jsreturned early for every blank bar whentextpositionwas*auto*or*inside*, so a bar of zero length never drew itstext. The early return now covers*inside*placement and bars that have no position at all (null values). Text with*auto*placement falls through to the existing fit check, which finds no room inside a zero-length bar and places the text outside.*outside*text already drew for zero-length bars, so*auto*and*outside*now agree.On the behavior change
Issue #6474 reports this same behaviour, and the maintainer record on it is split.
alexcjohnson(collaborator) wrote on 2023-02-09 that it "does look like a bug to me, and certainly a zero-size bar is different from no bar", and that the fix "may be as simple as removing thattextPosition === 'auto' ||line (and adding this situation to a test image)". This branch does exactly that removal, and the moved baselines are the test image.The other reading is on record too: in the equivalent
plotly.pyreport (plotly/plotly.py#4686)archmojwrote on 2024-07-24 "I'm not sure we should consider this a bug", pointing at explicittextpositionas the way to choose the placement, andgvwilsonagreed it was "a feature rather than a bug".The attribute description in
src/traces/bar/attributes.jsstates the contract for*auto*as well: the text is moved outside when the bar is too small and nothing is stacked on it. A zero-length bar is the extreme case of too small, and*outside*already draws its text today, so before this change the two documented placements disagreed with each other.Bars that carry no value at all keep their current behaviour: a
nullvalue still produces no text, and the new test asserts that.Validation
plotly-4.1.1.min.jsfrom the CDN, loaded in headless Chrome. One page holds two figures; the.barlayer .bartextnodes come from the DOM afternewPlot.y: [0, 5, 10],textposition: 'auto',text: ['ZERO', 'FIVE', 'TEN']FIVE,TENZERO(bartext-outside,translate(96.66, 334)),FIVE,TENy: [null, 5, 10],textposition: 'auto',text: ['NULLPT', 'FIVE', 'TEN']FIVE,TENFIVE,TEN(unchanged)The right column comes from the same page with the change applied to the bundle copy.
Tests
test/jasmine/tests/bar_test.js: new case inside theA bar plotdescribe,should draw *auto* text of zero-length bars outside. It fails before the change, because noZEROnode exists, and it asserts that a null value keeps its text hidden.Baselines
Thirteen baselines move. They are the
baselines-default-diffartifact of thetest-baselinesjob from the CI run on07834db0(ubuntu-latest), so they carry the renderer the job uses rather than a local machine.Every one keeps its dimensions, and diffing each updated image against the previous baseline shows label-sized deltas only — 0.02% to 0.38% of the pixels, with the largest change in
blank-bar-outsidetext.png:bar_attrs_relative.png,round-bar_attrs_relative.png,bar_display_height_zero.png,bar_display_height_zero_no_line_width.png,bar_display_height_zero_only_line_width.png,rounded-bar_display_height_zero_no_line_width.png,bar_hide_nulls.png,bar-marker-line-colorscales.png,blank-bar-outsidetext.pngsrc/traces/funnel/plot.js→barPlot.plotand therefore use the same text placement:funnel-grouping-vs-defaults.png,funnel-offsetgroups.png,funnel_horizontal_stack_basic.png,funnel_nonnumeric_sizes.pngmap_*andscattermap_dynamic_defaultsare deliberately left alone: those mocks cannot render without a Mapbox token.I did not run the karma suites locally.
The draft log follows in a second commit, since its filename needs this PR number.