Per character font fallback (#20740) works great, except in tick labels.
Code for reproduction
importmatplotlib.pyplotasplt# CMU fonts available here : https://www.1001fonts.com/download/cmu.zipplt.rcParams["font.family"] = ["CMU Bright", "DejaVu Sans"]
s="There are \u2212\u00D7 in between!"plt.figtext(0.18, 0.45, s)
plt.gcf().suptitle(s)
plt.gca().set_title(s)
plt.xscale("log")
plt.xlim(1e-2, 6e-2)
plt.show()
Actual outcome
In the tick labels, characters not covered by CMU Bright are rendered with a placeholder instead of falling back to DejaVu
Expected outcome
Tick labels should fall back to DejaVu for \u2212 (minus sign) and \u00D7 (times sign) as in the other text instances.
Additional information
It seems to happen only with tick labels, other instances of text rendering work as intended in #20740. I get the same outcome with both macosx and TkAgg backends
I get the following warnings:
Font 'default' does not have a glyph for '\u2212' [U+2212], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\\times' [U+d7], substituting with a dummy symbol.
This is some specific thing to do with mathtext which seems to some special glyph mapping itself, but the odd thing is that if you wrap the other text in $, that doesn't repeat the bug.
Ah, the difference is that the ticks wrap their text in \mathdefault which picks up CMU Bright that you set, but regular math text would use the fonts from the mathtext.* rcParams, so that's why the regular text appears to work even when wrapped in $.
So the bug is that in mathtext, \mathdefault text only uses the first font specified as the default. A shortened reproducer is:
import matplotlib.pyplot as plt
# CMU fonts available here : https://www.1001fonts.com/download/cmu.zip
plt.rcParams["font.family"] = ["CMU Bright", "DejaVu Sans"]
s = "$\\mathdefault{\u2212 \u00D7 \\times}$"
plt.figtext(0.5, 0.5, s, fontsize=30, horizontalalignment='center')
plt.show()
which "works" if you replace \mathdefault with \mathrm.
Activity
QuLogic commented on Mar 21, 2024
This is some specific thing to do with mathtext which seems to some special glyph mapping itself, but the odd thing is that if you wrap the other text in $, that doesn't repeat the bug.
QuLogic commented on Mar 21, 2024
Ah, the difference is that the ticks wrap their text in \mathdefault which picks up CMU Bright that you set, but regular math text would use the fonts from the mathtext.* rcParams, so that's why the regular text appears to work even when wrapped in $.
So the bug is that in mathtext, \mathdefault text only uses the first font specified as the default. A shortened reproducer is:
import matplotlib.pyplot as plt # CMU fonts available here : https://www.1001fonts.com/download/cmu.zip plt.rcParams["font.family"] = ["CMU Bright", "DejaVu Sans"] s = "$\\mathdefault{\u2212 \u00D7 \\times}$" plt.figtext(0.5, 0.5, s, fontsize=30, horizontalalignment='center') plt.show()which "works" if you replace \mathdefault with \mathrm.
dedebenui commented on Mar 25, 2024
It seems that mathdefault also ignores axes.unicode_minus: