Title: Should we use font metrics for line height instead of "lp"? · Issue #31220 · matplotlib/matplotlib · GitHub
Open Graph Title: Should we use font metrics for line height instead of "lp"? · Issue #31220 · matplotlib/matplotlib
X Title: Should we use font metrics for line height instead of "lp"? · Issue #31220 · matplotlib/matplotlib
Description: Currently, we set a minimum line height by measuring the height and depth of the "lp" string. Line spacing is then some multiple of the line height (by default 1.2×). matplotlib/lib/matplotlib/text.py Lines 446 to 451 in 47874b4 # Full v...
Open Graph Description: Currently, we set a minimum line height by measuring the height and depth of the "lp" string. Line spacing is then some multiple of the line height (by default 1.2×). matplotlib/lib/matplotlib/text...
X Description: Currently, we set a minimum line height by measuring the height and depth of the "lp" string. Line spacing is then some multiple of the line height (by default 1.2×). matplotlib/lib/matpl...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/31220
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Should we use font metrics for line height instead of \"lp\"?","articleBody":"Currently, we set a minimum line height by measuring the height and depth of the \"lp\" string. Line spacing is then some multiple of the line height (by default 1.2×).\nhttps://github.com/matplotlib/matplotlib/blob/47874b40356e97d4ed8c6a076bc3bfc4219ef5b6/lib/matplotlib/text.py#L446-L451\nLooking back into the history, this used to be \"Tglp\":\nhttps://github.com/matplotlib/matplotlib/blob/30a5d335cce098fdc7518101668f6257c841b646/lib/matplotlib/text.py#L254-L256\nand before that just a \"T\" was used for line height:\nhttps://github.com/matplotlib/matplotlib/blob/6f2a3f189452b2d99be80d421cc3557e6f66a811/lib/matplotlib/text.py#L251-L252\nand before that, the \"T\" was used only for empty lines:\nhttps://github.com/matplotlib/matplotlib/blob/2e3f32174432bfa563c20db0503d05a00c7e1481/lib/matplotlib/text.py#L183-L186\n\nNow that we are supporting more fonts and languages, this may not be ideal. For example, for the test in #30725, I only specified the OpenMoji font. This font contains _only_ emoji and _no_ Latin characters of any kind. This causes warnings that both `l` and `p` are not found even though they aren't used in any user strings. We then end up with the ascender/descender values for the Last Resort font. I haven't found a specific example, but I can imagine a user may be setting some language-specific font that contains no Latin characters and no fallback, and would trigger this warning as well, which might be a bit mysterious.\n\n[Microsoft's recommendation](https://learn.microsoft.com/en-us/typography/opentype/otspec150/recom#tad) is to use the ascender value to measure from top to baseline and descender value from baseline to bottom, plus a line gap to produce the interline spacing (suggested to add up to 120% the height similar to our default.) Of course, fonts being fonts, [there are 2 other sets of vertical metrics](https://glyphsapp.com/learn/vertical-metrics) and various strategies for dealing with them.\n\nRegardless of the multiple values to try, from the history, I don't think we went with the measurement strategy because it was thought that the embedded values were unreliable. Rather, it seems to have been from necessity of not having a font parser.\n\nSo the question now goes (with some of my thoughts in parentheses):\n1. Should we move to font metrics instead? (I think so.)\n2. If so, which strategy to use? (probably the webfont or Google ones.)\n3. Should we still _try_ to measure `lp` and set some combined minimum or just trust the fonts aren't broken? (hopefully not required.)\n4. What do we do when fallbacks are specified? Currently we get the measurement from the first to match the \"lp\" string. Should we instead look at _all_ the specified fonts and take a minimum of all of them (even if not used in the text)? Or measure all the fonts used in a line? Or measure all the fonts used in an entire text object? (probably not the first option, unsure whether the second or third.)","author":{"url":"https://github.com/QuLogic","@type":"Person","name":"QuLogic"},"datePublished":"2026-03-01T18:17:23.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":9},"url":"https://github.com/31220/matplotlib/issues/31220"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:07d8c79c-fadb-ee28-290c-f62527090020 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CB28:10F9C5:FEEAD1:152C0C7:6A51C528 |
| html-safe-nonce | a650f97c4fb1ba438cc6a0a652c31d545bf7ee1f64ea45e63daddf56405684d7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQjI4OjEwRjlDNTpGRUVBRDE6MTUyQzBDNzo2QTUxQzUyOCIsInZpc2l0b3JfaWQiOiI3NzAyNDMyNzk5NTMwMjcyMDQwIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | e2868ba609b2b926e1a730d305592f593333d5fe9c71783dd2adfc54ff5dcc5c |
| hovercard-subject-tag | issue:4007913073 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/31220/issue_layout |
| twitter:image | https://opengraph.githubassets.com/539585d6ecc3d8146da06f1d22151d1d1b221058b4a7d7d3a0947bbc484a884a/matplotlib/matplotlib/issues/31220 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/539585d6ecc3d8146da06f1d22151d1d1b221058b4a7d7d3a0947bbc484a884a/matplotlib/matplotlib/issues/31220 |
| og:image:alt | Currently, we set a minimum line height by measuring the height and depth of the "lp" string. Line spacing is then some multiple of the line height (by default 1.2×). matplotlib/lib/matplotlib/text... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | QuLogic |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width