1
votes

I am trying to plot latex with matplotlib. I've installed latex with pip. this example works well

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.plot(t,s)
plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
         fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

while matplotlib.rcParams['text.usetex'] = True encounters latex error.

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.plot(t,s)
plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
         fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

which produces this stack

--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) ~/anaconda3/envs/tf11/lib/python3.6/site-packages/IPython/core/formatters.py in call(self, obj) 330 pass 331 else: --> 332 return printer(obj) 333 # Finally look for special method names 334 method = get_real_method(obj, self.print_method)

~/anaconda3/envs/tf11/lib/python3.6/site-packages/IPython/core/pylabtools.py in (fig) 235 236 if 'png' in formats: --> 237 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs)) 238 if 'retina' in formats or 'png2x' in formats: 239 png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))

~/anaconda3/envs/tf11/lib/python3.6/site-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs) 119 120 bytes_io = BytesIO() --> 121 fig.canvas.print_figure(bytes_io, **kw) 122 data = bytes_io.getvalue() 123 if fmt == 'svg':

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, **kwargs) 2047
orientation=orientation, 2048 dryrun=True, -> 2049 **kwargs) 2050 renderer = self.figure._cachedRenderer 2051
bbox_artists = kwargs.pop("bbox_extra_artists", None)

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs) 508 509 """ --> 510 FigureCanvasAgg.draw(self) 511 renderer = self.get_renderer() 512

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py in draw(self) 400 toolbar = self.toolbar 401 try: --> 402 self.figure.draw(self.renderer) 403 # A GUI class may be need to update a window using this draw, so 404 # don't forget to call the superclass.

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 48 renderer.start_filter() 49 ---> 50 return draw(artist, renderer, *args, **kwargs) 51 finally: 52 if artist.get_agg_filter() is not None:

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/figure.py in draw(self, renderer) 1650 1651
mimage._draw_list_compositing_images( -> 1652 renderer, self, artists, self.suppressComposite) 1653 1654
renderer.close_group('figure')

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite) 136 if not_composite or not has_images: 137 for a in artists: --> 138 a.draw(renderer) 139 else: 140 # Composite any adjacent images together

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 48 renderer.start_filter() 49 ---> 50 return draw(artist, renderer, *args, **kwargs) 51 finally: 52 if artist.get_agg_filter() is not None:

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe) 2602
renderer.stop_rasterizing() 2603 -> 2604 mimage._draw_list_compositing_images(renderer, self, artists) 2605 2606 renderer.close_group('axes')

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite) 136 if not_composite or not has_images: 137 for a in artists: --> 138 a.draw(renderer) 139 else: 140 # Composite any adjacent images together

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 48 renderer.start_filter() 49 ---> 50 return draw(artist, renderer, *args, **kwargs) 51 finally: 52 if artist.get_agg_filter() is not None:

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/axis.py in draw(self, renderer, *args, **kwargs) 1185 ticks_to_draw = self._update_ticks(renderer) 1186 ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, -> 1187 renderer) 1188 1189 for tick in ticks_to_draw:

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/axis.py in _get_tick_bboxes(self, ticks, renderer) 1123 for tick in ticks: 1124 if tick.label1On and tick.label1.get_visible(): -> 1125 extent = tick.label1.get_window_extent(renderer) 1126
ticklabelBoxes.append(extent) 1127 if tick.label2On and tick.label2.get_visible():

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/text.py in get_window_extent(self, renderer, dpi) 927 raise RuntimeError('Cannot get window extent w/o renderer') 928 --> 929 bbox, info, descent = self._get_layout(self._renderer) 930 x, y = self.get_unitless_position() 931 x, y = self.get_transform().transform_point((x, y))

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/text.py in _get_layout(self, renderer) 311 w, h, d = renderer.get_text_width_height_descent(clean_line, 312 self._fontproperties, --> 313 ismath=ismath) 314 else: 315 w, h, d = 0, 0, 0

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/backends/backend_agg.py in get_text_width_height_descent(self, s, prop, ismath) 207 fontsize = prop.get_size_in_points() 208 w, h, d = texmanager.get_text_width_height_descent( --> 209 s, fontsize, renderer=self) 210 return w, h, d 211

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/texmanager.py in get_text_width_height_descent(self, tex, fontsize, renderer) 462 else: 463 # use dviread. It sometimes returns a wrong descent. --> 464 dvifile = self.make_dvi(tex, fontsize) 465 with dviread.Dvi(dvifile, 72 * dpi_fraction) as dvi: 466 page = next(iter(dvi))

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/texmanager.py in make_dvi(self, tex, fontsize) 326 self._run_checked_subprocess( 327 ["latex", "-interaction=nonstopmode", "--halt-on-error", --> 328 texfile], tex) 329 for fname in glob.glob(basefile + '*'): 330 if not fname.endswith(('dvi', 'tex')):

~/anaconda3/envs/tf11/lib/python3.6/site-packages/matplotlib/texmanager.py in _run_checked_subprocess(self, command, tex) 296 report = subprocess.check_output(command, 297 cwd=self.texcache, --> 298 stderr=subprocess.STDOUT) 299 except subprocess.CalledProcessError as exc: 300 raise RuntimeError(

~/anaconda3/envs/tf11/lib/python3.6/subprocess.py in check_output(timeout, *popenargs, **kwargs) 334 335 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, --> 336 **kwargs).stdout 337 338

~/anaconda3/envs/tf11/lib/python3.6/subprocess.py in run(input, timeout, check, *popenargs, **kwargs) 401 kwargs['stdin'] = PIPE 402 --> 403 with Popen(*popenargs, **kwargs) as process: 404 try: 405 stdout, stderr = process.communicate(input, timeout=timeout)

~/anaconda3/envs/tf11/lib/python3.6/subprocess.py in 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, encoding, errors) 705 c2pread, c2pwrite, 706 errread, errwrite, --> 707 restore_signals, start_new_session) 708 except: 709 # Cleanup if the child failed starting.

~/anaconda3/envs/tf11/lib/python3.6/subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session) 1331 else: 1332
err_msg += ': ' + repr(orig_executable) -> 1333 raise child_exception_type(errno_num, err_msg) 1334 raise child_exception_type(err_msg)
1335

FileNotFoundError: [Errno 2] No such file or directory: 'latex'

1

1 Answers

1
votes

The latex PyPI project which you have installed with pip is not a full latex distro, it instead "allows calling LaTeX from Python without leaving a mess."

The reason your first example works is there is no call to LaTeX. Instead, matplotlib uses its own TeX expression parser, layout engine and fonts: mathtext. In the second example you really are trying to call LaTeX, but you're getting an error since you don't have a tex distro installed!

You will need to ensure you have a tex distribution installed on your system. Either TeXLive or MikTex will do the trick. Also, the matplotlib documentation on text rendering with LaTeX is very good and I'd recommend you give it a read.