From ccac5e3a54b74ff72d18a68428f155d7020db988 Mon Sep 17 00:00:00 2001 From: Diego Leal Date: Mon, 27 Jul 2020 14:25:35 -0300 Subject: [PATCH 1/2] Implemented `math_fontfamily` param in `FontProperties` - The parameter can change the family of fonts for each text element instead of globally with `rcParams['mathtext.fontset']` - Added example of usage `/examples/text_labels_and_annotations/mathtext_fontfamily_example.py` - Added tests - Added documentation --- .../mathtext_fontfamily_example.py | 37 +++++++++++ lib/matplotlib/font_manager.py | 58 ++++++++++++++++-- lib/matplotlib/mathtext.py | 9 ++- .../test_mathtext/mathtext_fontset_image.png | Bin 0 -> 5637 bytes lib/matplotlib/tests/test_mathtext.py | 10 +++ lib/matplotlib/text.py | 34 ++++++++++ 6 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 examples/text_labels_and_annotations/mathtext_fontfamily_example.py create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png diff --git a/examples/text_labels_and_annotations/mathtext_fontfamily_example.py b/examples/text_labels_and_annotations/mathtext_fontfamily_example.py new file mode 100644 index 000000000000..2b417cfcac91 --- /dev/null +++ b/examples/text_labels_and_annotations/mathtext_fontfamily_example.py @@ -0,0 +1,37 @@ +""" +=============== +Math fontfamily +=============== + +A simple example showcasing the new *math_fontfamily* parameter that can +be used to change the family of fonts for each individual text +element in a plot. + +If no parameter is set, the global value +:rc:`mathtext.fontset` will be used. +""" + +import matplotlib.pyplot as plt + +plt.figure(figsize=(6, 5)) + +# A simple plot for the background. +plt.plot(range(11), color="0.9") + +# A text mixing normal text and math text. +msg = (r"Normal Text. $Text\ in\ math\ mode:\ " + r"\int_{0}^{\infty } x^2 dx$") + +# Set the text in the plot. +plt.text(1, 7, msg, size=12, math_fontfamily='cm') + +# Set another font for the next text. +plt.text(1, 3, msg, size=12, math_fontfamily='dejavuserif') + +# *math_fontfamily* can be used in most places where there is text, +# like in the title: +plt.title(r"$Title\ in\ math\ mode:\ \int_{0}^{\infty } x^2 dx$", + math_fontfamily='stixsans', size=14) + +# Note that the normal text is not changed by *math_fontfamily*. +plt.show() diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 5952b8bd190c..5769d6d33fe0 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -41,6 +41,7 @@ from matplotlib import afm, cbook, ft2font, rcParams from matplotlib.fontconfig_pattern import ( parse_fontconfig_pattern, generate_fontconfig_pattern) +from matplotlib.rcsetup import _validators _log = logging.getLogger(__name__) @@ -624,10 +625,10 @@ class FontProperties: """ A class for storing and manipulating font properties. - The font properties are those described in the `W3C Cascading - Style Sheet, Level 1 + The font properties are the six properties described in the + `W3C Cascading Style Sheet, Level 1 `_ font - specification. The six properties are: + specification and *math_fontfamily* for math fonts: - family: A list of font names in decreasing order of priority. The items may include a generic font family name, either @@ -653,6 +654,12 @@ class FontProperties: 'small', 'medium', 'large', 'x-large', 'xx-large' or an absolute font size, e.g., 12. + - math_fontfamily: The family of fonts used to render math text; overrides + :rc:`mathtext.fontset`. Supported values are the same as the ones + supported by :rc:`mathtext.fontset` :: + + 'dejavusans', 'dejavuserif', 'cm', 'stix', 'stixsans' and 'custom'. + The default font property for TrueType fonts (as specified in the default rcParams) is :: @@ -690,6 +697,7 @@ def __init__(self, stretch= None, size = None, fname = None, # if set, it's a hardcoded filename to use + math_fontfamily = None, ): self._family = _normalize_font_family(rcParams['font.family']) self._slant = rcParams['font.style'] @@ -698,6 +706,7 @@ def __init__(self, self._stretch = rcParams['font.stretch'] self._size = rcParams['font.size'] self._file = None + self._math_fontfamily = None if isinstance(family, str): # Treat family as a fontconfig pattern if it is the only @@ -714,6 +723,7 @@ def __init__(self, self.set_stretch(stretch) self.set_file(fname) self.set_size(size) + self.set_math_fontfamily(math_fontfamily) @classmethod def _from_any(cls, arg): @@ -745,7 +755,8 @@ def __hash__(self): self.get_weight(), self.get_stretch(), self.get_size_in_points(), - self.get_file()) + self.get_file(), + self.get_math_fontfamily()) return hash(l) def __eq__(self, other): @@ -934,6 +945,45 @@ def set_fontconfig_pattern(self, pattern): else: getattr(self, "set_" + key)(val) + def get_math_fontfamily(self): + """ + Return the name of the font family used for math text. + + The default font is :rc:`mathtext.fontset`. + """ + if self._math_fontfamily is None: + return rcParams['mathtext.fontset'] + return self._math_fontfamily + + def set_math_fontfamily(self, fontfamily): + """ + Set the font family for text in math mode. + + If not set explicitly, :rc:`mathtext.fontset` will be used. + + Parameters + ---------- + fontfamily : str + The name of the font family. + + Available font families are defined in the + matplotlibrc.template file + :ref:`here ` + + See Also + -------- + .text.Text.get_math_fontfamily + """ + if fontfamily is None: + self._math_fontfamily = None + return + + valid_fonts = _validators['mathtext.fontset'].valid.values() + # _check_in_list() Validates the parameter math_fontfamily as + # if it were passed to rcParams['mathtext.fontset'] + cbook._check_in_list(valid_fonts, math_fontfamily=fontfamily) + self._math_fontfamily = fontfamily + def copy(self): """Return a copy of self.""" new = type(self)() diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 8641a4416f41..8b9df7e19203 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -3351,12 +3351,10 @@ def parse(self, s, dpi=72, prop=None, *, _force_standard_ps_fonts=False): # lru_cache can't decorate parse() directly because the ps.useafm and # mathtext.fontset rcParams also affect the parse (e.g. by affecting # the glyph metrics). - return self._parse_cached(s, dpi, prop, _force_standard_ps_fonts, - rcParams['mathtext.fontset']) + return self._parse_cached(s, dpi, prop, _force_standard_ps_fonts) @functools.lru_cache(50) - def _parse_cached(self, s, dpi, prop, force_standard_ps_fonts, fontset): - + def _parse_cached(self, s, dpi, prop, force_standard_ps_fonts): if prop is None: prop = FontProperties() @@ -3365,7 +3363,8 @@ def _parse_cached(self, s, dpi, prop, force_standard_ps_fonts, fontset): else: backend = self._backend_mapping[self._output]() fontset_class = cbook._check_getitem( - self._font_type_mapping, fontset=fontset) + self._font_type_mapping, + fontset=prop.get_math_fontfamily()) font_output = fontset_class(prop, backend) fontsize = prop.get_size_in_points() diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png new file mode 100644 index 0000000000000000000000000000000000000000..d34e6d5d28d58434bc3e0db47cb1d20ae00f1b39 GIT binary patch literal 5637 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 285841f7277b..8e4ddf5b66e1 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -364,3 +364,13 @@ def test_mathtext_to_png(tmpdir): mt = mathtext.MathTextParser('bitmap') mt.to_png(str(tmpdir.join('example.png')), '$x^2$') mt.to_png(io.BytesIO(), '$x^2$') + + +@image_comparison(baseline_images=['mathtext_fontset_image.png'], + savefig_kwarg={'dpi': 40}) +def test_math_fontfamily(): + fig = plt.figure(figsize=(10, 3)) + fig.text(0.2, 0.7, r"$This\ text\ should\ have\ one\ font$", + size=24, math_fontfamily='dejavusans') + fig.text(0.2, 0.3, r"$This\ text\ should\ have\ another$", + size=24, math_fontfamily='cm') diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 75ffafe1a0b3..a1d475c1b948 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1061,6 +1061,40 @@ def set_fontsize(self, fontsize): self._fontproperties.set_size(fontsize) self.stale = True + def get_math_fontfamily(self): + """ + Return the font family name for math text rendered by Matplotlib. + + The default value is :rc:`mathtext.fontset`. + + See Also + -------- + set_math_fontfamily + """ + return self._fontproperties.get_math_fontfamily() + + def set_math_fontfamily(self, fontfamily): + """ + Set the font family for math text rendered by Matplotlib. + + This does only affect Matplotlib's own math renderer. It has no effect + when rendering with TeX (``usetex=True``). + + Parameters + ---------- + fontfamily : str + The name of the font family. + + Available font families are defined in the + :ref:`matplotlibrc.template file + `. + + See Also + -------- + get_math_fontfamily + """ + self._fontproperties.set_math_fontfamily(fontfamily) + def set_fontweight(self, weight): """ Set the font weight. From 6fd3a7518186a07a5db090496e3e63d6397e3dd7 Mon Sep 17 00:00:00 2001 From: Diego Leal Date: Mon, 24 Aug 2020 22:11:37 -0300 Subject: [PATCH 2/2] Added new fonts to the test function 'test_math_fontfamily'. The reason for this is to avoid a bug that occurs in testing where the math text will 'wiggle'. This is an old bug in matplotlib not related to the changes done in this PR. --- .../test_mathtext/math_fontfamily_image.png | Bin 0 -> 5542 bytes .../test_mathtext/mathtext_fontset_image.png | Bin 5637 -> 0 bytes lib/matplotlib/tests/test_mathtext.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/math_fontfamily_image.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/math_fontfamily_image.png b/lib/matplotlib/tests/baseline_images/test_mathtext/math_fontfamily_image.png new file mode 100644 index 0000000000000000000000000000000000000000..feb34b1793dbfd8f56a38c2a570db7ce63ca8fa4 GIT binary patch literal 5542 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_fontset_image.png deleted file mode 100644 index d34e6d5d28d58434bc3e0db47cb1d20ae00f1b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5637 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 diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index 8e4ddf5b66e1..1b4d3336f19e 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -366,11 +366,11 @@ def test_mathtext_to_png(tmpdir): mt.to_png(io.BytesIO(), '$x^2$') -@image_comparison(baseline_images=['mathtext_fontset_image.png'], +@image_comparison(baseline_images=['math_fontfamily_image.png'], savefig_kwarg={'dpi': 40}) def test_math_fontfamily(): fig = plt.figure(figsize=(10, 3)) fig.text(0.2, 0.7, r"$This\ text\ should\ have\ one\ font$", size=24, math_fontfamily='dejavusans') fig.text(0.2, 0.3, r"$This\ text\ should\ have\ another$", - size=24, math_fontfamily='cm') + size=24, math_fontfamily='stix')