I am trying to make a simple plot using matplotlib with LaTeX text in the plot but I keep getting the same error. I am working in Jupyter Notebooks installed via Anaconda and my code is the following:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams.update(plt.rcParamsDefault)
plt.rcParams.update({
'text.usetex' : True,
"font.family": "Times New Roman",
"font.monospace": 'Computer Modern'
})
x = np.linspace(0,5,100)
figure = plt.figure()
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.title('$y=x^2$')
plt.plot(x, x**2)
plt.show()
I know this is a double question but I have probably read all of the proposed solutions and nothing seems to work...
The error that pops up when running the code above is the following:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
File ~\anaconda3\lib\site-packages\matplotlib\texmanager.py:255, in TexManager._run_checked_subprocess(cls, command, tex, cwd)
254 try:
--> 255 report = subprocess.check_output(
256 command, cwd=cwd if cwd is not None else cls.texcache,
257 stderr=subprocess.STDOUT)
258 except FileNotFoundError as exc:
File ~\anaconda3\lib\subprocess.py:421, in check_output(timeout, *popenargs, **kwargs)
419 kwargs['input'] = empty
--> 421 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
422 **kwargs).stdout
File ~\anaconda3\lib\subprocess.py:503, in run(input, capture_output, timeout, check, *popenargs, **kwargs)
501 kwargs['stderr'] = PIPE
--> 503 with Popen(*popenargs, **kwargs) as process:
504 try:
File ~\anaconda3\lib\subprocess.py:971, in Popen.__init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize)
968 self.stderr = io.TextIOWrapper(self.stderr,
969 encoding=encoding, errors=errors)
--> 971 self._execute_child(args, executable, preexec_fn, close_fds,
972 pass_fds, cwd, env,
973 startupinfo, creationflags, shell,
974 p2cread, p2cwrite,
975 c2pread, c2pwrite,
976 errread, errwrite,
977 restore_signals,
978 gid, gids, uid, umask,
979 start_new_session)
980 except:
981 # Cleanup if the child failed starting.
File ~\anaconda3\lib\subprocess.py:1440, in Popen._execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_gid, unused_gids, unused_uid, unused_umask, unused_start_new_session)
1439 try:
-> 1440 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
1441 # no special security
1442 None, None,
1443 int(not close_fds),
1444 creationflags,
1445 env,
1446 cwd,
1447 startupinfo)
1448 finally:
1449 # Child is launched. Close the parent's copy of those pipe
1450 # handles that only the child should have open. You need
(...)
1453 # pipe will not close when the child process exits and the
1454 # ReadFile will hang.
FileNotFoundError: [WinError 2] Het systeem kan het opgegeven bestand niet vinden
The above exception was the direct cause of the following exception:
RuntimeError Traceback (most recent call last)
File ~\anaconda3\lib\site-packages\IPython\core\formatters.py:338, in BaseFormatter.__call__(self, obj)
336 pass
337 else:
--> 338 return printer(obj)
339 # Finally look for special method names
340 method = get_real_method(obj, self.print_method)
File ~\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152, in print_figure(fig, fmt, bbox_inches, base64, **kwargs)
149 from matplotlib.backend_bases import FigureCanvasBase
150 FigureCanvasBase(fig)
--> 152 fig.canvas.print_figure(bytes_io, **kw)
153 data = bytes_io.getvalue()
154 if fmt == 'svg':
File ~\anaconda3\lib\site-packages\matplotlib\backend_bases.py:2338, in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
2332 renderer = _get_renderer(
2333 self.figure,
2334 functools.partial(
2335 print_method, orientation=orientation)
2336 )
2337 with getattr(renderer, "_draw_disabled", nullcontext)():
-> 2338 self.figure.draw(renderer)
2340 if bbox_inches:
2341 if bbox_inches == "tight":
File ~\anaconda3\lib\site-packages\matplotlib\artist.py:95, in _finalize_rasterization.<locals>.draw_wrapper(artist, renderer, *args, **kwargs)
93 @wraps(draw)
94 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 95 result = draw(artist, renderer, *args, **kwargs)
96 if renderer._rasterizing:
97 renderer.stop_rasterizing()
File ~\anaconda3\lib\site-packages\matplotlib\artist.py:72, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
69 if artist.get_agg_filter() is not None:
70 renderer.start_filter()
---> 72 return draw(artist, renderer)
73 finally:
74 if artist.get_agg_filter() is not None:
File ~\anaconda3\lib\site-packages\matplotlib\figure.py:3125, in Figure.draw(self, renderer)
3122 # ValueError can occur when resizing a window.
3124 self.patch.draw(renderer)
-> 3125 mimage._draw_list_compositing_images(
3126 renderer, self, artists, self.suppressComposite)
3128 for sfig in self.subfigs:
3129 sfig.draw(renderer)
File ~\anaconda3\lib\site-packages\matplotlib\image.py:131, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
129 if not_composite or not has_images:
130 for a in artists:
--> 131 a.draw(renderer)
132 else:
133 # Composite any adjacent images together
134 image_group = []
File ~\anaconda3\lib\site-packages\matplotlib\artist.py:72, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
69 if artist.get_agg_filter() is not None:
70 renderer.start_filter()
---> 72 return draw(artist, renderer)
73 finally:
74 if artist.get_agg_filter() is not None:
File ~\anaconda3\lib\site-packages\matplotlib\axes\_base.py:3030, in _AxesBase.draw(self, renderer)
3027 for spine in self.spines.values():
3028 artists.remove(spine)
-> 3030 self._update_title_position(renderer)
3032 if not self.axison:
3033 for _axis in self._axis_map.values():
File ~\anaconda3\lib\site-packages\matplotlib\axes\_base.py:2974, in _AxesBase._update_title_position(self, renderer)
2972 top = max(top, bb.ymax)
2973 if title.get_text():
-> 2974 ax.yaxis.get_tightbbox(renderer) # update offsetText
2975 if ax.yaxis.offsetText.get_text():
2976 bb = ax.yaxis.offsetText.get_tightbbox(renderer)
File ~\anaconda3\lib\site-packages\matplotlib\axis.py:1320, in Axis.get_tightbbox(self, renderer, for_layout_only)
1317 renderer = self.figure._get_renderer()
1318 ticks_to_draw = self._update_ticks()
-> 1320 self._update_label_position(renderer)
1322 # go back to just this axis's tick labels
1323 tlb1, tlb2 = self._get_ticklabel_bboxes(ticks_to_draw, renderer)
File ~\anaconda3\lib\site-packages\matplotlib\axis.py:2569, in YAxis._update_label_position(self, renderer)
2565 return
2567 # get bounding boxes for this axis and any siblings
2568 # that have been set by `fig.align_ylabels()`
-> 2569 bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer)
2570 x, y = self.label.get_position()
2571 if self.label_position == 'left':
File ~\anaconda3\lib\site-packages\matplotlib\axis.py:2104, in Axis._get_tick_boxes_siblings(self, renderer)
2102 axis = getattr(ax, f"{axis_name}axis")
2103 ticks_to_draw = axis._update_ticks()
-> 2104 tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer)
2105 bboxes.extend(tlb)
2106 bboxes2.extend(tlb2)
File ~\anaconda3\lib\site-packages\matplotlib\axis.py:1299, in Axis._get_ticklabel_bboxes(self, ticks, renderer)
1297 if renderer is None:
1298 renderer = self.figure._get_renderer()
-> 1299 return ([tick.label1.get_window_extent(renderer)
1300 for tick in ticks if tick.label1.get_visible()],
1301 [tick.label2.get_window_extent(renderer)
1302 for tick in ticks if tick.label2.get_visible()])
File ~\anaconda3\lib\site-packages\matplotlib\axis.py:1299, in <listcomp>(.0)
1297 if renderer is None:
1298 renderer = self.figure._get_renderer()
-> 1299 return ([tick.label1.get_window_extent(renderer)
1300 for tick in ticks if tick.label1.get_visible()],
1301 [tick.label2.get_window_extent(renderer)
1302 for tick in ticks if tick.label2.get_visible()])
File ~\anaconda3\lib\site-packages\matplotlib\text.py:959, in Text.get_window_extent(self, renderer, dpi)
954 raise RuntimeError(
955 "Cannot get window extent of text w/o renderer. You likely "
956 "want to call 'figure.draw_without_rendering()' first.")
958 with cbook._setattr_cm(self.figure, dpi=dpi):
--> 959 bbox, info, descent = self._get_layout(self._renderer)
960 x, y = self.get_unitless_position()
961 x, y = self.get_transform().transform((x, y))
File ~\anaconda3\lib\site-packages\matplotlib\text.py:378, in Text._get_layout(self, renderer)
375 ys = []
377 # Full vertical extent of font, including ascenders and descenders:
--> 378 _, lp_h, lp_d = _get_text_metrics_with_cache(
379 renderer, "lp", self._fontproperties,
380 ismath="TeX" if self.get_usetex() else False, dpi=self.figure.dpi)
381 min_dy = (lp_h - lp_d) * self._linespacing
383 for i, line in enumerate(lines):
File ~\anaconda3\lib\site-packages\matplotlib\text.py:97, in _get_text_metrics_with_cache(renderer, text, fontprop, ismath, dpi)
94 """Call ``renderer.get_text_width_height_descent``, caching the results."""
95 # Cached based on a copy of fontprop so that later in-place mutations of
96 # the passed-in argument do not mess up the cache.
---> 97 return _get_text_metrics_with_cache_impl(
98 weakref.ref(renderer), text, fontprop.copy(), ismath, dpi)
File ~\anaconda3\lib\site-packages\matplotlib\text.py:105, in _get_text_metrics_with_cache_impl(renderer_ref, text, fontprop, ismath, dpi)
101 @functools.lru_cache(4096)
102 def _get_text_metrics_with_cache_impl(
103 renderer_ref, text, fontprop, ismath, dpi):
104 # dpi is unused, but participates in cache invalidation (via the renderer).
--> 105 return renderer_ref().get_text_width_height_descent(text, fontprop, ismath)
File ~\anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:226, in RendererAgg.get_text_width_height_descent(self, s, prop, ismath)
224 _api.check_in_list(["TeX", True, False], ismath=ismath)
225 if ismath == "TeX":
--> 226 return super().get_text_width_height_descent(s, prop, ismath)
228 if ismath:
229 ox, oy, width, height, descent, font_image = \
230 self.mathtext_parser.parse(s, self.dpi, prop)
File ~\anaconda3\lib\site-packages\matplotlib\backend_bases.py:641, in RendererBase.get_text_width_height_descent(self, s, prop, ismath)
637 fontsize = prop.get_size_in_points()
639 if ismath == 'TeX':
640 # todo: handle properties
--> 641 return self.get_texmanager().get_text_width_height_descent(
642 s, fontsize, renderer=self)
644 dpi = self.points_to_pixels(72)
645 if ismath:
File ~\anaconda3\lib\site-packages\matplotlib\texmanager.py:368, in TexManager.get_text_width_height_descent(cls, tex, fontsize, renderer)
366 if tex.strip() == '':
367 return 0, 0, 0
--> 368 dvifile = cls.make_dvi(tex, fontsize)
369 dpi_fraction = renderer.points_to_pixels(1.) if renderer else 1
370 with dviread.Dvi(dvifile, 72 * dpi_fraction) as dvi:
File ~\anaconda3\lib\site-packages\matplotlib\texmanager.py:300, in TexManager.make_dvi(cls, tex, fontsize)
298 with TemporaryDirectory(dir=cwd) as tmpdir:
299 tmppath = Path(tmpdir)
--> 300 cls._run_checked_subprocess(
301 ["latex", "-interaction=nonstopmode", "--halt-on-error",
302 f"--output-directory={tmppath.name}",
303 f"{texfile.name}"], tex, cwd=cwd)
304 (tmppath / Path(dvifile).name).replace(dvifile)
305 return dvifile
File ~\anaconda3\lib\site-packages\matplotlib\texmanager.py:259, in TexManager._run_checked_subprocess(cls, command, tex, cwd)
255 report = subprocess.check_output(
256 command, cwd=cwd if cwd is not None else cls.texcache,
257 stderr=subprocess.STDOUT)
258 except FileNotFoundError as exc:
--> 259 raise RuntimeError(
260 'Failed to process string with tex because {} could not be '
261 'found'.format(command[0])) from exc
262 except subprocess.CalledProcessError as exc:
263 raise RuntimeError(
264 '{prog} was not able to process the following string:\n'
265 '{tex!r}\n\n'
(...)
272 exc=exc.output.decode('utf-8', 'backslashreplace'))
273 ) from None
RuntimeError: Failed to process string with tex because latex could not be found
I am working on Windows 11 andhave the latest version of Miktex installed (and everything in my LaTeX interpreter works just fine). I have also added the correct directory for Miktex to my systems PATH such that python can find it.
What is also strange is that, when accessing python via a terminal (either my systems command prompt or the anaconda command prompt) the above code works just fine. It is only when trying to run the code is Jupyter Notebooks or VS Code that I keep getting the error above.
On suggestion of @TrentonMcKinney 's comment, I opened Jupyter Notebook outside of the Anaconda environment and there everything seems to run just fine... I then opened Jupyter in the Anaconda environment and suddenly the code seems to work there as well... However, when I run Jupyter Notebook via a shortcut I created, that just runs the command "jupyter notebook" from the regular command prompt I get a different error: "FileNotFoundError: Matplotlib's TeX implementation searched for a file named 'cmr10.tfm' in your texmf tree, but could not find it"
So typing in the command "jupyter notebook" either within or outside of the Anaconda environment seems to work for now and is a temporary solution. However there still seems to be a problem that remains unsolved...
Any help is welcome!