Skip to content

Fix *auto* text of zero-length bar traces - #8078

Open
william-xue wants to merge 4 commits into
plotly:mainfrom
william-xue:bar-auto-text-zero-length
Open

william-xue wants to merge 4 commits into
plotly:mainfrom
william-xue:bar-auto-text-zero-length

Conversation

@william-xue

@william-xue william-xue commented Sep 25, 2026 •

Copy link
Copy Markdown

Fixes #6474.

What changes

src/traces/bar/plot.js returned early for every blank bar when textposition was *auto* or *inside*, so a bar of zero length never drew its text. 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.

Validation

plotly-4.1.1.min.js from the CDN, loaded in headless Chrome. One page holds two figures; the .barlayer .bartext nodes come from the DOM after newPlot.

trace before after
y: [0, 5, 10], textposition: 'auto', text: ['ZERO', 'FIVE', 'TEN'] FIVE, TEN ZERO (bartext-outside, translate(96.66, 334)), FIVE, TEN
y: [null, 5, 10], textposition: 'auto', text: ['NULLPT', 'FIVE', 'TEN'] FIVE, TEN FIVE, 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 the A bar plot describe, should draw *auto* text of zero-length bars outside. It fails before the change, because no ZERO node exists, and it asserts that a null value keeps its text hidden.

Baselines

Thirteen baselines move. They are the baselines-default-diff artifact of the test-baselines job from the CI run on 07834db0 (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 mocks, whose text is laid out by the code path that changed: 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.png
  • funnel mocks, which plot through src/traces/funnel/plot.js → barPlot.plot and therefore use the same text placement: funnel-grouping-vs-defaults.png, funnel-offsetgroups.png, funnel_horizontal_stack_basic.png, funnel_nonnumeric_sizes.png

map_* and scattermap_dynamic_defaults are 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.

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.
@camdecoster camdecoster self-assigned this Sep 29, 2026
camdecoster and others added 2 commits October 21, 2026 20:11
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bar chart: textposition='auto' not working for 0 values

2 participants