Latex, Labels and PDF

Hi,

I ran into some troubles when trying to do the following with
matplotlib:
  - plotting a figure
  - using latex for axis labels
  - (getting acceptable fonts)
  - getting a pdf in the end
I've not been able to solve this.

In the documentation I found 2 ways to do this. First, when a string is
enclosed in $ signs, matplotlib has its own way of rendering latex code.
Thats ok for mathematical expressions, but I can't print normal text at
all. The documentation says that \rm{} should be used, but

"$\rm{some label text} (\mu V)$" becomes "somelabeltext\muV"

so I searched again and found another documentation, telling me to
enable 'text.usetex' so all text is handled by latex. This way, the text
is rendered correctly, but then the font used for the tick numbers
switches to some ugly looking font.

Because Latex mode does not seem to work with the pdf output, I saved
these figures as EPS, using epstopdf in oder to get a pdf. Normally this
process gives me perfect results, but the ugly-font-ticks problem is
getting even worse, because in the pdf some of them are just missing.

I upped the eps and pdf files here:
http://www.staff.uni-mainz.de/wuertz/matplotlib/
There is also a png file with a screenshot from the "ugly" and missing
ticks.

Plotting a reasonable figure seems to be hard, is there any chance of
solving this problem?

Thanks in advance,
Peter

Hoi Peter,

"\\rm\{some label text\} \(\\mu V\)" becomes "somelabeltext\muV"

You could try
r"\\rm\{some\\ label\\ text\} \(\\mu V\)"
instead. (Note the backslashes and the 'raw' r in front of the string.)
This way the string should be interpreted fine. You can use the '\ ' to
force a space, but whether it's necessary depends on the string you want
to display, of course.

Possible statements in the head of your programs might be:
from matplotlib import rcParams
rcParams['text.fontname'] = 'cmr10'
rcParams['lines.markerfacecolor'] = None
from matplotlib import rc
rc('text', usetex=True)
rc('axes', hold=True)

(From a current program of mine. Of course, some statements have nothing
to do with your problem, but they might illustrate some options you
have.)

The wiki/Cookbook has some info (on pitfalls, too):
http://www.scipy.org/Cookbook/Matplotlib/UsingTex
http://www.scipy.org/Cookbook/Matplotlib/LaTeX_Examples

You probably know the mathtex module:
http://matplotlib.sourceforge.net/matplotlib.mathtext.html
the wheeler_demo:
http://matplotlib.sourceforge.net/screenshots/wheeler_demo.py
and the tex_demo:
http://matplotlib.sourceforge.net/screenshots/tex_demo.py
?

As for your eps2pdf-problem:
I don't know any straightforward solution (one that always gives a
pleasant output) for it, but had a similar problem lately. It seems that
MPLs eps-output is not well read in by many viewers / converters (that
statement correct?). Correcting the eps with eps2eps or trying to
convert the eps with some other software did not work well for me. My
solution was:
Producing plots in formats other then eps/ps (e. g. png), with
sufficient resolution and converting to the format the publisher wanted
with other software (e.g. gimp or see what's on our terminal
server :wink: ).
Currently I'm only using eps figures for import into LaTeX - works fine.

HTH
Christian

Hi,

I ran into some troubles when trying to do the following with
matplotlib:
  - plotting a figure
  - using latex for axis labels
  - (getting acceptable fonts)
  - getting a pdf in the end
I've not been able to solve this.

In the documentation I found 2 ways to do this. First, when a string is
enclosed in $ signs, matplotlib has its own way of rendering latex code.
Thats ok for mathematical expressions, but I can't print normal text at
all. The documentation says that \rm{} should be used, but

"\\rm\{some label text\} \(\\mu V\)" becomes "somelabeltext\muV"

I think you need to use raw strings so your \'s are interpretted as \'s and
not as special characters (like \n is newline). We know it is inconvenient
that you cant do something like r'This example: a=e^\{i\\pi\}' with the
existing mathtext, but it is a difficult problem and remains unsolved.

so I searched again and found another documentation, telling me to
enable 'text.usetex' so all text is handled by latex. This way, the text
is rendered correctly, but then the font used for the tick numbers
switches to some ugly looking font.

For starters, see http://www.scipy.org/Cookbook/Matplotlib/UsingTex. I suggest
changing your serif rc settings to use the PSNFSS fonts described in that
link. Also, try deleting your ~/.matplotlib/tex.cache.

Because Latex mode does not seem to work with the pdf output,

It doesn't, not yet.

I saved
these figures as EPS, using epstopdf in oder to get a pdf. Normally this
process gives me perfect results, but the ugly-font-ticks problem is
getting even worse, because in the pdf some of them are just missing.

Try getting your system set up to use the xpdf distiller, that has always
given me excellent results.

I upped the eps and pdf files here:
http://www.staff.uni-mainz.de/wuertz/matplotlib/
There is also a png file with a screenshot from the "ugly" and missing
ticks.

Plotting a reasonable figure seems to be hard, is there any chance of
solving this problem?

There have been many problems reported on this mailing list that concern latex
markup. Most often, people have difficulty getting usetex to work because
matplotlib depends on latex, dvipng, ghostscript, and optionally xpdf (more
precisely, xpdf's pdftops utility). If those dependencies are not working
properly, or if you are missing latex packages or fonts, then it shows up in
mpl's output.

Darren

···

On Tuesday 24 July 2007 9:50:46 am Peter Würtz wrote:

Hi,

Try getting your system set up to use the xpdf distiller, that has always
given me excellent results.

Thanks alot! Using xpdf gives perfect results!
http://www.staff.uni-mainz.de/wuertz/matplotlib/xpdf_tof_spectrum_bec_500ns.eps
http://www.staff.uni-mainz.de/wuertz/matplotlib/xpdf_tof_spectrum_bec_500ns.pdf

There have been many problems reported on this mailing list that concern latex
markup. Most often, people have difficulty getting usetex to work because
matplotlib depends on latex, dvipng, ghostscript, and optionally xpdf (more
precisely, xpdf's pdftops utility).

The problem is, the whole plot/ps/eps/dvi/ghostscript/pdf/xpdf/distiller
process is totally obscure to a normal user. For example, i don't have
xpdf installed... but choosing the xpdf setting gives me perfect results
now. If I understand you correctly, I just need the "pdftops" utility
included in "poppler-utils".

Well, thanks again!

···

-
Peter

Hi,

> Try getting your system set up to use the xpdf distiller, that has always
> given me excellent results.

Thanks alot! Using xpdf gives perfect results!
http://www.staff.uni-mainz.de/wuertz/matplotlib/xpdf_tof_spectrum_bec_500ns
.eps
http://www.staff.uni-mainz.de/wuertz/matplotlib/xpdf_tof_spectrum_bec_500ns
.pdf

Good. If you insert those into another latex document and create a pdf, the
text in your figure will even be searchable!

> There have been many problems reported on this mailing list that concern
> latex markup. Most often, people have difficulty getting usetex to work
> because matplotlib depends on latex, dvipng, ghostscript, and optionally
> xpdf (more precisely, xpdf's pdftops utility).

The problem is, the whole plot/ps/eps/dvi/ghostscript/pdf/xpdf/distiller
process is totally obscure to a normal user.

We know, but it is the best we have been able to do so far. It is a difficult
problem to solve. We document what we have, as best we can, at the usetex
wiki page, but it sometimes gets overlooked. There has been some effort to
produce a utility to parse the dvi file and use that information directly,
which would cut the external deps back to only latex.

For example, i don't have
xpdf installed... but choosing the xpdf setting gives me perfect results
now. If I understand you correctly, I just need the "pdftops" utility
included in "poppler-utils".

Thats right. Maybe I should change the rc keyword, which was named when
pdftops was part of xpdf.

Darren

···

On Tuesday 24 July 2007 12:59:54 pm Peter Würtz wrote: