GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Fix confusion between text height and ascent in metrics calculations. by anntzer · Pull Request #31107 · matplotlib/matplotlib

Conversation

@anntzer

@anntzer anntzer commented Feb 6, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

The text height includes both the ascender and the descender, but the logic in _get_layout is that multiline texts should be treated as having an ascent at least as large as "l" and a descent at least as large as "p" (not a height at least as large as "lp" and a descent at least as large as "p") to prevent lines from bumping into each other (see changes to test_text/test_multiline, where the topmost superscript was close to bumping into the "p" descender previously).

Partial fix for #21653; see #21653 (comment).

old
multiline-expected
new
multiline

PR summary

PR checklist

  • "closes #0000" is in the body of the PR description to link the related issue
  • new and changed code is tested
  • Plotting related features are demonstrated in an example
  • New Features and API Changes are noted with a directive and release note
  • Documentation complies with general and docstring guidelines

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer anntzer added the topic: text label Feb 6, 2026
timhoffm
timhoffm reviewed Feb 6, 2026
View reviewed changes
Comment thread lib/matplotlib/text.py Outdated
xys = M.transform(offset_layout) - (offsetx, offsety)

return bbox, list(zip(lines, zip(ws, hs), *xys.T)), descent
return bbox, list(zip(lines, wads, *xys.T)), descent

@timhoffm timhoffm Feb 6, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need to return descent now that we have d in wads?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@anntzer anntzer Feb 6, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, it was anyways unused; removed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer
anntzer force-pushed the supal branch from a00ff40 to 848292c Compare February 6, 2026 14:34
@timhoffm

timhoffm commented Feb 6, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

You need to also update this call:

matplotlib/lib/matplotlib/offsetbox.py

Line 802 in d68c7e3

bbox, info, yd = self._text._get_layout(renderer)

yd is not unused here. You must reconstruct it from wads.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer
anntzer force-pushed the supal branch from 848292c to 117d8b3 Compare February 6, 2026 15:38
@anntzer

anntzer commented Feb 6, 2026

Copy link
Copy Markdown
Contributor Author

Oops, I missed that call site; fixed.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@timhoffm

timhoffm commented Feb 6, 2026

Copy link
Copy Markdown
Member

Code looks good. Not checked, but I assume the image comparison failures are from slight text changes? What's the plan to handle them?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic added this to Font and text overhaul Feb 6, 2026
@QuLogic QuLogic moved this to Ready for Review in Font and text overhaul Feb 6, 2026
@QuLogic QuLogic added this to the v3.11.0 milestone Feb 6, 2026
@QuLogic

QuLogic commented Feb 7, 2026

Copy link
Copy Markdown
Member

I don't see anything obviously wrong in the code so far. This PR targets the text-overhaul branch, so test images can be handled as with all the other text changes.

There are 248 test image failures with this change, but they are a bit inconsistent in how they manifest. For example, in test_axes.py::test_errorbar[png], the log (10^x) ticks all shift up. I'm uncertain whether any of these ticks are supposed to align here with the linear axis in the other Axes but at least the top and bottom one are close, and they went from about 1 pixel lower to 0.5-1 pixel higher. On the other hand, in test_image.py::test_nonuniform_logscale[png] the log ticks all shift down one pixel. Other than the multiline text alignment image in the original post, maybe the legend in the patheffects tests is the most noticeable change.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented Feb 7, 2026

Copy link
Copy Markdown
Contributor Author

Agreed that it is hard to judge whether most changes (in non-multiline text) are really better or worse, except the patheffect legend (test_patheffect3) which appears clearly better (more vertically centered in the box) to me.

old
patheffect3-expected
new
patheffect3
(it's much easier to see the difference with the builtin triager, though).

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

tacaswell
tacaswell approved these changes Feb 12, 2026
View reviewed changes
@tacaswell

tacaswell commented Feb 12, 2026

Copy link
Copy Markdown
Member

My read is that this makes the code match what the comments said it actually did.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

timhoffm
timhoffm approved these changes Feb 12, 2026
View reviewed changes

@timhoffm timhoffm left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good apart from the vauge naming.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread lib/matplotlib/offsetbox.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@anntzer
anntzer force-pushed the supal branch from 117d8b3 to 2dad5bf Compare February 12, 2026 23:22
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Feb 14, 2026
@QuLogic
Update test images for matplotlib#31107 [skip ci]
56328f2
@QuLogic
QuLogic force-pushed the supal branch from 2dad5bf to 33a2437 Compare February 14, 2026 09:39
@QuLogic

QuLogic commented Feb 14, 2026

Copy link
Copy Markdown
Member

I've pushed the image changes to the text-overhaul-figures branch: QuLogic@56328f2 and rebased this PR, so it should pass now. Feel free to review those images as it's a separate commit with only the relevant changes.

anntzer reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Feb 14, 2026

Copy link
Copy Markdown
Member

Test failures look like the Mock.call_count thing, for which I'll merge main into the text-overhaul branch. I'm not sure what's up with the docs build yet.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic mentioned this pull request Feb 14, 2026
mathtext: add mathnormal and distinguish between normal and italic family #31121
Merged
1 of 5 tasks
@anntzer @QuLogic
Fix confusion between text height and ascent in metrics calculations.
60f2310
The text height includes both the ascender and the descender, but the
logic in _get_layout is that multiline texts should be treated as having
an ascent at least as large as "l" and a descent at least as large as
"p" (not a height at least as large as "lp" and a descent at least as
large as "p") to prevent lines from bumping into each other (see changes
to test_text/test_multiline, where the topmost superscript was close to
bumping into the "p" descender previously).
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Feb 17, 2026
@QuLogic
Update test images for matplotlib#31107 [skip ci]
90d1bf0
@QuLogic
QuLogic force-pushed the supal branch from 33a2437 to 60f2310 Compare February 17, 2026 19:17
@QuLogic
QuLogic merged commit dfe4e55 into matplotlib:text-overhaul Feb 18, 2026
33 of 36 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@github-project-automation github-project-automation Bot moved this from Ready for Review to Done in Font and text overhaul Feb 18, 2026
@anntzer
anntzer deleted the supal branch February 18, 2026 06:14
wavebyrd pushed a commit to wavebyrd/matplotlib that referenced this pull request Mar 13, 2026
@QuLogic
Merge pull request matplotlib#31107 from anntzer/supal
10a0988
Fix confusion between text height and ascent in metrics calculations.
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Apr 10, 2026
@QuLogic
Update test images for font/text overhaul
12d2a4d
This includes images changes for the following pull requests / commits:

* [Fix center of rotation with
  rotation_mode='anchor'](matplotlib#29199)
  (c44db77)
* [Remove ttconv backwards-compatibility
  code](matplotlib#30145)
  (8caff88)
* [Remove kerning_factor from
  tests](matplotlib#29816)
  (7b4d725)
* [Set text hinting to
  defaults](matplotlib#29816)
  (8255ae2)
* [Update FreeType to
  2.13.3](matplotlib#29816)
  (89c054d)
* [Implement text shaping with
  libraqm](matplotlib#30000)
  (b0ded3a,
  9813523)
* [Add language parameter to Text
  objects](matplotlib#29794)
  (7ce8eae)
* [Fix auto-sized glyphs with BaKoMa
  fonts](matplotlib#29936)
  (3ba2c13)
* [pdf: Improve text with characters outside embedded font
  limits](matplotlib#30512)
  (b70fb88,
  6cedcf7)
* [Prepare `CharacterTracker` for advanced font
  features](matplotlib#30608)
  (8274e17,
  70dc388,
  df670cf,
  ed5e074)
* [Add font feature API to
  Text](matplotlib#29695)
  (972a688)
* [Fix spacing in r"$\max
  f$"](matplotlib#30715)
  (4a99a83)
* [Implement libraqm for vector
  outputs](matplotlib#30607)
  (bd17cd4)
* [Drop the FT2Font intermediate
  buffer](matplotlib#30059)
  (9d7d7b4)
* [Rasterize dvi files without
  dvipng](matplotlib#30039)
  (7627118)
* [Update bundled FreeType and HarfBuzz
  libraries](matplotlib#30938)
  (a161658,
  9619bcc)
* [Fix positioning of wide mathtext
  accents](matplotlib#31069)
  (c2fa7ba)
* [Refactor RendererAgg.draw_{mathtext,text,tex} to use same base
  algorithm](matplotlib#31085)
  (931bcf3)
* [Implement TeX's fraction and script
  alignment](matplotlib#31046)
  (94ff452,
  4bfa0f9,
  1cd8510)
* [Fix confusion between text height and ascent in metrics
  calculations](matplotlib#31107)
  (60f2310)
* [mathtext: Fetch quad width & axis height from font
  metrics](matplotlib#31110)
  (692df3f,
  383028b)
* [mathtext: add mathnormal and distinguish between normal and italic
  family](matplotlib#31121)
  (a6913f3)
* [ENH: Ignore empty text for
  tightbbox](matplotlib#31285)
  (d772043)
* [Drop axis_artist tickdir image compat, due to text-overhaul
  merge](matplotlib#31281)
  (2057583)
* [text: Use font metrics to determine line
  heights](matplotlib#31291)
  (3ab6a27,
  d961462,
  97f4943)
* [ps/pdf: Override font height metrics to support AFM
  files](matplotlib#31371)
  (e0913d4)
* [TST: Cleanup back-compat code in tests touched by text
  overhaul](matplotlib#31295)
  (7c33379)
* [TST: Set tests touched by text overhaul to mpl20
  style](matplotlib#31300)
  (41c4d8d)
@QuLogic QuLogic mentioned this pull request Apr 10, 2026
Font and text overhaul #30161
Merged
4 tasks done
@anntzer anntzer mentioned this pull request Sep 8, 2026
[Bug]: misaligned between xticklabel baselines #32316
Open
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@tacaswell tacaswell tacaswell approved these changes
@timhoffm timhoffm timhoffm approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

topic: text

Projects

Font and text overhaul
Status: Done

Milestone

v3.11.0

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

4 participants

@anntzer @timhoffm @QuLogic @tacaswell
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.