Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork7.9k
Description
Bug report
Bug summary
When using text in \mathdefault mode, the hyphen character '-' is remapped to Unicode minus (0x2212). When the font does not have this character the currency symbol is shown as a placeholder, incorrectly ignoring the settings rcParams['axes.unicode_minus'] and rcParams['mathtext.fallback_to_cm']. This is triggered by .set_xscale('log') which uses LogFormatterSciNotation.
Code for reproduction
importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']= ['Papyrus']# Or any other font without U+2212.plt.rcParams['axes.unicode_minus']=False# Will fix this y-axis, but not title or x-axisassertplt.rcParams['mathtext.fallback_to_cm']# Should be True by default.plt.rcParams['figure.dpi']=150# Just to see better.plt.title(r'$\mathdefault{-5}$')# Will show currency symbol for -.# This also happens on log-scale (which uses LogFormatterSciNotation).plt.plot([1e-4,10], [-10,10])plt.gca().set_xscale('log')plt.show()
If you don't have Papyrus, you can tryhttps://www.exljbris.com/delicious.html.
Actual outcome
...\lib\site-packages\matplotlib\mathtext.py:849: MathTextWarning: Font 'default' does not have a glyph for '-' [U+2212] MathTextWarning)...\lib\site-packages\matplotlib\mathtext.py:850: MathTextWarning: Substituting with a dummy symbol. warn("Substituting with a dummy symbol.", MathTextWarning)
The y-axis (which is linear, uses ScalarFormatter by default) shows the non-unicode '-' because of rcParams['axes.unicode_minus'], this is expected behavior.
But the title and x-axis (which uses the LogFormatterSciNotation formatter, which uses \mathdefault, presumably for the superscript) show currency symbol instead of minus.
Expected outcome
I expect:
- .set_xscale('log') to adhere to rcParams['axes.unicode_minus'] and use the hyphen '-'
- If it doesn't, at least listen to rcParams['mathtext.fallback_to_cm'] to fallback to Computer Modern instead of the currency symbol
- (If it doesn't, the '-' or even en-dash '–' would be better fallbacks than the currency symbol in this case)
It is unclear to me whyhttps://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/mathtext.py#L831 doesn't trigger the fallback_to_cm functionality. Perhaps it somehow doesn't realize that the math-font in \mathdefault is a custom font.
Nasty workaround
try:old_get_unicode_indexexceptNameError:print'Patching matplotlib.mathtext.get_unicode_index'importmatplotlib.mathtextasmathtextold_get_unicode_index=mathtext.get_unicode_indexmathtext.get_unicode_index=lambdasymbol,math=True:\ord('-')ifsymbol=='-'elseold_get_unicode_index(symbol,math)
Matplotlib version
- Operating system: Windows 10 [Version 10.0.16299.611]
- Matplotlib version: 2.2.3
- Matplotlib backend: module://ipykernel.pylab.backend_inline
- Python version: 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
- Jupyter version: 5.4.0
I've installed matplotlib through conda: conda update matplotlib.