-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Matplotlib chooses the wrong font for unrecognized weights #8550
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
This is a bit of "wish" but I think it would nice to have the option to specify the subfamily explicitly, in case the subfamily is really exotic. So I should be able to pass e.g. |
Can you even do that with the font-config tools? That seems like a difficult parsing problem as the space is used to both in the family name (which I think in 'Fire Sans') and to separate the sub-family. There is a PR from @mdboom to replace our home-grown font selection with font-config around... |
Looks like font-config uses a colon:
(I'm actually surprised that font-config even recognizes subfamily) |
https://github.com/anntzer/mplfccache should allow you to regenerate the font cache using the metadata provided by fontconfig (obviously, this depends on fontconfig utilities being available in the $PATH). I also have a Python reimplementation of (most of) fontconfig's logic (translated from source) in https://github.com/anntzer/freetypybind/blob/master/lib/freetypybind/query_face.py#L499, just needs some packaging effort... |
Bug report
Bug summary
With a lot of the modern fonts containing exotic font weights like “Thin” or “Ultra bold”, matplotlib will sometimes pick the wrong font weight because it assumes that any font weight that it doesn’t recognize is either normal (400) or bold (700), even though there is a “Regular” available. Ultimately which one matplotlib picks seems to be actually kind of random, probably depending on the order in which the fonts appear in the font cache.
This is what the logic in
font_manager.py
looks like:sfnt4
appears to be a string that contains the full name of the font, including the weight. The problem with this approach is that if it doesn’t recognize the weight, it will simply assume the weight is either 400 or 700. A “Thin” font that was mistakenly labeled 400 might get picked over a “Regular” font.Here are all the weights currently recognized:
I imagine we could add “Thin” and some others into the list, but I don’t think this solves the fundamental problem that fonts with unrecognized weights are presumed “Regular”/“Bold” and do not have lower precedence than fonts that are definitely “Regular”/“Bold”.
TL;DR: It would be nice to have a more robust way to detect font weights and handle unknown font weights.
Matplotlib version
The text was updated successfully, but these errors were encountered: