In prepping for a JWebbinar I found the specutils notebook no longer works. Looks like a problem with labelling axis in microns? Attached is a screen grab for context, long error below
Version is 1.4.2.dev37+gd7507aa2 which we got during the setup.
![image](https://user-images.githubusercontent.com/15331994/140878433-c590dcc4-3f00-4819-ae8b-24f512f2232a.png)
Totally reproducible
`/usr/local/lib/python3.8/dist-packages/pyparsing/core.py in parse_string(self, instring, parse_all, parseAll)
1106 # catch and re-raise exception from here, clearing out pyparsing internal stack trace
-> 1107 raise exc.with_traceback(None)
1108 else:
ParseFatalException: Unknown symbol: \mu, found '' (at char 8), (line:1, col:9)
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
/usr/local/lib/python3.8/dist-packages/matplotlib/pyplot.py in post_execute()
137 def post_execute():
138 if matplotlib.is_interactive():
--> 139 draw_all()
140
141 # IPython >= 2
/usr/local/lib/python3.8/dist-packages/matplotlib/_pylab_helpers.py in draw_all(cls, force)
135 for manager in cls.get_all_fig_managers():
136 if force or manager.canvas.figure.stale:
--> 137 manager.canvas.draw_idle()
138
139
/usr/local/lib/python3.8/dist-packages/matplotlib/backend_bases.py in draw_idle(self, *args, **kwargs)
2053 if not self._is_idle_drawing:
2054 with self._idle_draw_cntx():
-> 2055 self.draw(*args, **kwargs)
2056
2057 def get_width_height(self):
/usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py in draw(self)
404 (self.toolbar._wait_cursor_for_draw_cm() if self.toolbar
405 else nullcontext()):
--> 406 self.figure.draw(self.renderer)
407 # A GUI class may be need to update a window using this draw, so
408 # don't forget to call the superclass.
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
72 @wraps(draw)
73 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 74 result = draw(artist, renderer, *args, **kwargs)
75 if renderer._rasterizing:
76 renderer.stop_rasterizing()
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/figure.py in draw(self, renderer)
2788
2789 self.patch.draw(renderer)
-> 2790 mimage._draw_list_compositing_images(
2791 renderer, self, artists, self.suppressComposite)
2792
/usr/local/lib/python3.8/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
130 if not_composite or not has_images:
131 for a in artists:
--> 132 a.draw(renderer)
133 else:
134 # Composite any adjacent images together
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/_api/deprecation.py in wrapper(*inner_args, **inner_kwargs)
429 else deprecation_addendum,
430 **kwargs)
--> 431 return func(*inner_args, **inner_kwargs)
432
433 return wrapper
/usr/local/lib/python3.8/dist-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
2919 renderer.stop_rasterizing()
2920
-> 2921 mimage._draw_list_compositing_images(renderer, self, artists)
2922
2923 renderer.close_group('axes')
/usr/local/lib/python3.8/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
130 if not_composite or not has_images:
131 for a in artists:
--> 132 a.draw(renderer)
133 else:
134 # Composite any adjacent images together
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/axis.py in draw(self, renderer, *args, **kwargs)
1153 self._update_label_position(renderer)
1154
-> 1155 self.label.draw(renderer)
1156
1157 self._update_offset_text_position(ticklabelBoxes, ticklabelBoxes2)
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/text.py in draw(self, renderer)
677
678 with _wrap_text(self) as textobj:
--> 679 bbox, info, descent = textobj._get_layout(renderer)
680 trans = textobj.get_transform()
681
/usr/local/lib/python3.8/dist-packages/matplotlib/text.py in _get_layout(self, renderer)
312 clean_line, ismath = self._preprocess_math(line)
313 if clean_line:
--> 314 w, h, d = renderer.get_text_width_height_descent(
315 clean_line, self._fontproperties, ismath=ismath)
316 else:
/usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py in get_text_width_height_descent(self, s, prop, ismath)
233 if ismath:
234 ox, oy, width, height, descent, fonts, used_characters =
--> 235 self.mathtext_parser.parse(s, self.dpi, prop)
236 return width, height, descent
237
/usr/local/lib/python3.8/dist-packages/matplotlib/mathtext.py in parse(self, s, dpi, prop, _force_standard_ps_fonts)
450 # mathtext.fontset rcParams also affect the parse (e.g. by affecting
451 # the glyph metrics).
--> 452 return self._parse_cached(s, dpi, prop, _force_standard_ps_fonts)
453
454 @functools.lru_cache(50)
/usr/local/lib/python3.8/dist-packages/matplotlib/mathtext.py in _parse_cached(self, s, dpi, prop, force_standard_ps_fonts)
471 self.class._parser = _mathtext.Parser()
472
--> 473 box = self._parser.parse(s, font_output, fontsize, dpi)
474 font_output.set_canvas_size(box.width, box.height, box.depth)
475 return font_output.get_results(box)
/usr/local/lib/python3.8/dist-packages/matplotlib/_mathtext.py in parse(self, s, fonts_object, fontsize, dpi)
2277 result = self._expression.parseString(s)
2278 except ParseBaseException as err:
-> 2279 raise ValueError("\n".join(["",
2280 err.line,
2281 " " * (err.column - 1) + "^",
ValueError:
\mathrm{\mu m}
^
Unknown symbol: \mu, found '' (at char 8), (line:1, col:9)
ParseFatalException Traceback (most recent call last)
/usr/local/lib/python3.8/dist-packages/matplotlib/_mathtext.py in parse(self, s, fonts_object, fontsize, dpi)
2276 try:
-> 2277 result = self._expression.parseString(s)
2278 except ParseBaseException as err:
/usr/local/lib/python3.8/dist-packages/pyparsing/core.py in parse_string(self, instring, parse_all, parseAll)
1106 # catch and re-raise exception from here, clearing out pyparsing internal stack trace
-> 1107 raise exc.with_traceback(None)
1108 else:
ParseFatalException: Unknown symbol: \mu, found '' (at char 8), (line:1, col:9)
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
/usr/local/lib/python3.8/dist-packages/IPython/core/formatters.py in call(self, obj)
339 pass
340 else:
--> 341 return printer(obj)
342 # Finally look for special method names
343 method = get_real_method(obj, self.print_method)
/usr/local/lib/python3.8/dist-packages/IPython/core/pylabtools.py in (fig)
251
252 if 'png' in formats:
--> 253 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
254 if 'retina' in formats or 'png2x' in formats:
255 png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))
/usr/local/lib/python3.8/dist-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
135 FigureCanvasBase(fig)
136
--> 137 fig.canvas.print_figure(bytes_io, **kw)
138 data = bytes_io.getvalue()
139 if fmt == 'svg':
/usr/local/lib/python3.8/dist-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
2228 else suppress())
2229 with ctx:
-> 2230 self.figure.draw(renderer)
2231
2232 if bbox_inches:
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
72 @wraps(draw)
73 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 74 result = draw(artist, renderer, *args, **kwargs)
75 if renderer._rasterizing:
76 renderer.stop_rasterizing()
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/figure.py in draw(self, renderer)
2788
2789 self.patch.draw(renderer)
-> 2790 mimage._draw_list_compositing_images(
2791 renderer, self, artists, self.suppressComposite)
2792
/usr/local/lib/python3.8/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
130 if not_composite or not has_images:
131 for a in artists:
--> 132 a.draw(renderer)
133 else:
134 # Composite any adjacent images together
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/_api/deprecation.py in wrapper(*inner_args, **inner_kwargs)
429 else deprecation_addendum,
430 **kwargs)
--> 431 return func(*inner_args, **inner_kwargs)
432
433 return wrapper
/usr/local/lib/python3.8/dist-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
2919 renderer.stop_rasterizing()
2920
-> 2921 mimage._draw_list_compositing_images(renderer, self, artists)
2922
2923 renderer.close_group('axes')
/usr/local/lib/python3.8/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
130 if not_composite or not has_images:
131 for a in artists:
--> 132 a.draw(renderer)
133 else:
134 # Composite any adjacent images together
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/axis.py in draw(self, renderer, *args, **kwargs)
1153 self._update_label_position(renderer)
1154
-> 1155 self.label.draw(renderer)
1156
1157 self._update_offset_text_position(ticklabelBoxes, ticklabelBoxes2)
/usr/local/lib/python3.8/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
49 renderer.start_filter()
50
---> 51 return draw(artist, renderer, *args, **kwargs)
52 finally:
53 if artist.get_agg_filter() is not None:
/usr/local/lib/python3.8/dist-packages/matplotlib/text.py in draw(self, renderer)
677
678 with _wrap_text(self) as textobj:
--> 679 bbox, info, descent = textobj._get_layout(renderer)
680 trans = textobj.get_transform()
681
/usr/local/lib/python3.8/dist-packages/matplotlib/text.py in _get_layout(self, renderer)
312 clean_line, ismath = self._preprocess_math(line)
313 if clean_line:
--> 314 w, h, d = renderer.get_text_width_height_descent(
315 clean_line, self._fontproperties, ismath=ismath)
316 else:
/usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py in get_text_width_height_descent(self, s, prop, ismath)
233 if ismath:
234 ox, oy, width, height, descent, fonts, used_characters =
--> 235 self.mathtext_parser.parse(s, self.dpi, prop)
236 return width, height, descent
237
/usr/local/lib/python3.8/dist-packages/matplotlib/mathtext.py in parse(self, s, dpi, prop, _force_standard_ps_fonts)
450 # mathtext.fontset rcParams also affect the parse (e.g. by affecting
451 # the glyph metrics).
--> 452 return self._parse_cached(s, dpi, prop, _force_standard_ps_fonts)
453
454 @functools.lru_cache(50)
/usr/local/lib/python3.8/dist-packages/matplotlib/mathtext.py in _parse_cached(self, s, dpi, prop, force_standard_ps_fonts)
471 self.class._parser = _mathtext.Parser()
472
--> 473 box = self._parser.parse(s, font_output, fontsize, dpi)
474 font_output.set_canvas_size(box.width, box.height, box.depth)
475 return font_output.get_results(box)
/usr/local/lib/python3.8/dist-packages/matplotlib/_mathtext.py in parse(self, s, fonts_object, fontsize, dpi)
2277 result = self._expression.parseString(s)
2278 except ParseBaseException as err:
-> 2279 raise ValueError("\n".join(["",
2280 err.line,
2281 " " * (err.column - 1) + "^",
ValueError:
\mathrm{\mu m}
^
Unknown symbol: \mu, found '' (at char 8), (line:1, col:9)
`