# Problems with sans-serif fonts and tick labels with TeX

Hey folks,

I’m having trouble getting a consistent sans-serif font in my figures:

https://gist.github.com/phobson/5503195 (see attached output)

This is pretty much the same issue as this Stack Overflow post:

http://stackoverflow.com/questions/12322738/how-do-i-change-the-axis-tick-font-in-a-matplotlib-plot-when-rendering-using-lat

But, the end result I’m looking for is to process the whole figure through latex and have sans-serif fonts everywhere, even in math text.

The accepted solution on SO is to manually set the font properties of the ticks for the figure prior to saving.

Is there a configuration-based work around for this? I’d like to avoid having to pick through everywhere that I call fig.savefig and manually set tick font properties if possible.

Thanks,

-Paul

Sorry for the confusion. The prior attachment was generated with the solution on SO. (Though you can still see the serif math fonts.)

Here’s the correct output from the Gist I included (purely-configuration based).

-Paul

···

Hey folks,

I’m having trouble getting a consistent sans-serif font in my figures:

https://gist.github.com/phobson/5503195 (see attached output)

This is pretty much the same issue as this Stack Overflow post:

http://stackoverflow.com/questions/12322738/how-do-i-change-the-axis-tick-font-in-a-matplotlib-plot-when-rendering-using-lat

But, the end result I’m looking for is to process the whole figure through latex and have sans-serif fonts everywhere, even in math text.

The accepted solution on SO is to manually set the font properties of the ticks for the figure prior to saving.

Is there a configuration-based work around for this? I’d like to avoid having to pick through everywhere that I call fig.savefig and manually set tick font properties if possible.

Thanks,

-Paul

I think the confusion here stems from the fact that you're mixing TeX and non-TeX font commands.

This turns on TeX mode, so all of the text is rendered with an external TeX installation:

rc('text', usetex=True)

In this line, setting it to sans-serif will get passed along to TeX, but a specific ttf font name can not be used by TeX, so the second part (involving Helvetica) is ignored. And setting the default body text in TeX does not (by default) change the math font. This is (unfortunately standard TeX behavior).

rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})

This affects the font set used by matplotlib's internal mathtext renderer, and has no effect on TeX:

rc('mathtext', fontset='stixsans')

The solution I use when I want all sans-serif out of TeX is to use the cmbright package, which can be turned on by adding:

rc('text.latex', preamble=r'\usepackage{cmbright}')

That may require installing the cmbright LaTeX package if you don't already have it.

I know all this stuff is confusing, but providing a flat interface over both the internal text rendering and the TeX rendering isn't really possible -- they have different views of the world -- and I'm actually not sure it's desirable. Though I wonder if we couldn't make it more obvious (somehow) when the user is mixing configuration that applies to the different contexts.

Mike

···

On 05/02/2013 11:58 AM, Paul Hobson wrote:

Hey folks,

I'm having trouble getting a consistent sans-serif font in my figures:
https://gist.github.com/phobson/5503195 (see attached output)

This is pretty much the same issue as this Stack Overflow post:
http://stackoverflow.com/questions/12322738/how-do-i-change-the-axis-tick-font-in-a-matplotlib-plot-when-rendering-using-lat

But, the end result I'm looking for is to process the whole figure through latex and have sans-serif fonts everywhere, even in math text.

The accepted solution on SO is to manually set the font properties of the ticks for the figure prior to saving.

Is there a configuration-based work around for this? I'd like to avoid having to pick through everywhere that I call fig.savefig and manually set tick font properties if possible.

Thanks,
-Paul

------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
http://p.sf.net/sfu/appdyn_d2d_ap1

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Mike,

Thanks for the guidance. I know this stuff is complicated and the work
everyone has put into it to make it work is fantastic.

I now see that this was more of TeX issue than an MPL configuration issue.
Your help prompted me to find this solution (similar to yours):
mpl.rcParams['text.latex.preamble'] = [
r'\usepackage{siunitx}', # i need upright \micro symbols, but you
need...
r'\sisetup{detect-all}', # ...this to force siunitx to actually
r'\usepackage{helvet}', # set the normal font here
r'\usepackage{sansmath}', # load up the sansmath so that math ->
helvet
r'\sansmath'] # <- tricky! -- gotta actually tell tex to use!

Thanks again!
-paul

···

On Thu, May 2, 2013 at 11:19 AM, Michael Droettboom <mdroe@...86...> wrote:

I think the confusion here stems from the fact that you're mixing TeX
and non-TeX font commands.

This turns on TeX mode, so all of the text is rendered with an external
TeX installation:

rc('text', usetex=True)

In this line, setting it to sans-serif will get passed along to TeX, but
a specific ttf font name can not be used by TeX, so the second part
(involving Helvetica) is ignored. And setting the default body text in TeX
does not (by default) change the math font. This is (unfortunately
standard TeX behavior).

rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})

This affects the font set used by matplotlib's internal mathtext renderer,
and has no effect on TeX:

rc('mathtext', fontset='stixsans')

The solution I use when I want all sans-serif out of TeX is to use the
cmbright package, which can be turned on by adding:

rc('text.latex', preamble=r'\usepackage{cmbright}')

That may require installing the cmbright LaTeX package if you don't

I know all this stuff is confusing, but providing a flat interface over
both the internal text rendering and the TeX rendering isn't really
possible -- they have different views of the world -- and I'm actually not
sure it's desirable. Though I wonder if we couldn't make it more obvious
(somehow) when the user is mixing configuration that applies to the
different contexts.

Mike

Wow. That’s some serious TeX voodoo magic! Want to work that into
an example that we could include in the docs?
Cheers,
Mike

···

On 05/02/2013 03:16 PM, Paul Hobson
wrote:

``````        On Thu, May 2, 2013 at 11:19 AM,
``````

Michael Droettboom <mdroe@…86…> wrote:

``````              I think the confusion here stems from the fact that
``````

you’re mixing TeX and non-TeX font commands.

``````              This turns on TeX mode, so all of the text is rendered
``````

with an external TeX installation:

rc(‘text’,
usetex=True)

``````              In this line, setting it to sans-serif will get passed
``````

along to TeX, but a specific ttf font name can not be
used by TeX, so the second part (involving Helvetica)
is ignored. And setting the default body text in TeX
does not (by default) change the math font. This is
(unfortunately standard TeX behavior).

rc(‘font’,**{‘family’:‘sans-serif’,‘sans-serif’:[‘Helvetica’]})

``````                This affects the font set used by matplotlib's
``````

internal mathtext renderer, and has no effect on
TeX:

``````                rc('mathtext',
fontset='stixsans')

The solution I use when I want all sans-serif out of
``````

TeX is to use the cmbright package, which can be

``````              rc('text.latex', preamble=r'\usepackage{cmbright}')

That may require installing the cmbright LaTeX package
``````

if you don’t already have it.

``````              I know all this stuff is confusing, but providing a
``````

flat interface over both the internal text rendering
and the TeX rendering isn’t really possible – they
have different views of the world – and I’m actually
not sure it’s desirable. Though I wonder if we
couldn’t make it more obvious (somehow) when the user
is mixing configuration that applies to the different
contexts.

``````              Mike
``````

Mike,

``````          Thanks for the guidance. I know this stuff is
``````

complicated and the work everyone has put into it to make
it work is fantastic.

``````          I now see that this was more of TeX issue than
``````

an MPL configuration issue. Your help prompted me to find
this solution (similar to yours):

mpl.rcParams[‘text.latex.preamble’] = [

``````                 r'\usepackage{siunitx}',   # i need upright \micro
``````

symbols, but you need…

``````                 r'\sisetup{detect-all}',   # ...this to force
``````

siunitx to actually use your fonts

``````                 r'\usepackage{helvet}',    # set the normal font
``````

here

``````                 r'\usepackage{sansmath}',  # load up the sansmath
``````

so that math -> helvet

``````                 r'\sansmath']  # <- tricky! -- gotta actually
``````

tell tex to use!

The solution I use when I want all sans-serif out of TeX is to use the cmbright package, which can be turned on by adding:

rc('text.latex', preamble=r'\usepackage{cmbright}')

That may require installing the cmbright LaTeX package if you don't already have it.

I am using the sfmath package for this purpose.

There is a nice comparision of the different approaches to get sans-serif math fonts at the bottom of the sfmath page: http://dtrx.de/od/tex/sfmath.html

Gladly. I'll try to find time to cook up PR building off of the existing
example over the weekend.
-paul

···

On Fri, May 3, 2013 at 6:17 AM, Michael Droettboom <mdroe@...86...> wrote:

On 05/02/2013 03:16 PM, Paul Hobson wrote

I now see that this was more of TeX issue than an MPL configuration
issue. Your help prompted me to find this solution (similar to yours):
mpl.rcParams['text.latex.preamble'] = [
r'\usepackage{siunitx}', # i need upright \micro symbols, but you
need...
r'\sisetup{detect-all}', # ...this to force siunitx to actually
r'\usepackage{helvet}', # set the normal font here
r'\usepackage{sansmath}', # load up the sansmath so that math ->
helvet
r'\sansmath'] # <- tricky! -- gotta actually tell tex to use!

Wow. That's some serious TeX voodoo magic! Want to work that into an
example that we could include in the docs?

Cheers,
Mike

H, I'm using sfmath, too. I actually wrote a helper function to switch fonts. The preambles are the result of long-term trial and error. Normally, my preambles include some more custom commands which I left out here because they would be distracting. I always wondered why matplotlib doesn't do this kind of font switching out of the box.

def setfont(font=font_default,unicode=True):
r"""
Set Matplotlibs rcParams to use LaTeX for font rendering.
Revert all changes by calling rcdefault() from matplotlib.

Parameters:

···

-----------
font: string
"Helvetica"
"Times"
"Computer Modern"

usetex: Boolean
Use unicode. Default: False.
"""

# Use TeX for all figure text!
plt.rc('text', usetex=True)

font = font.lower().replace(" ","")
if font == 'times':
# Times
font = {'family':'serif', 'serif':['Times']}
preamble = r"""
\usepackage{color}
\usepackage{mathptmx}
"""
elif font == 'helvetica':
# Helvetica
# set serif, too. Otherwise setting to times and then
# Helvetica causes an error.
font = {'family':'sans-serif','sans-serif':['Helvetica'],
'serif':['cm10']}
preamble = r"""
\usepackage{color}
\usepackage[tx]{sfmath}
\usepackage{helvet}
"""
else:
# Computer modern serif
font = {'family':'serif', 'serif':['cm10']}
preamble = r"""
\usepackage{color}
"""

if unicode:
# Unicode for Tex
#preamble = r"""\usepackage[utf8]{inputenc}""" + preamble
# inputenc should be set automatically
plt.rcParams['text.latex.unicode']=True

#print font, preamble
plt.rc('font',**font)
plt.rcParams['text.latex.preamble'] = preamble

Am 03.05.2013 um 16:08 schrieb Juergen Hasch <python@...4224...>:

The solution I use when I want all sans-serif out of TeX is to use the cmbright package, which can be turned on by adding:

rc('text.latex', preamble=r'\usepackage{cmbright}')

That may require installing the cmbright LaTeX package if you don't already have it.

I am using the sfmath package for this purpose.

There is a nice comparision of the different approaches to get sans-serif math fonts at the bottom of the sfmath page:
http://dtrx.de/od/tex/sfmath.html

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite
It's a free troubleshooting tool designed for production
Get down to code-level detail for bottlenecks, with <2% overhead.
http://p.sf.net/sfu/appdyn_d2d_ap2
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Some output using the different settings in the functions I just sent. As you can see the only problem are greek letters and some math symbols. It may be possible to improve this situation using xetex (http://matplotlib.org/users/pgf.html), but I did not try this out yet.

···

Am 03.05.2013 um 17:38 schrieb Felix Patzelt <felix@…4098…>:

H, I’m using sfmath, too. I actually wrote a helper function to switch fonts. The preambles are the result of long-term trial and error. Normally, my preambles include some more custom commands which I left out here because they would be distracting. I always wondered why matplotlib doesn’t do this kind of font switching out of the box.

def setfont(font=font_default,unicode=True):
r"""
Set Matplotlibs rcParams to use LaTeX for font rendering.
Revert all changes by calling rcdefault() from matplotlib.

``````Parameters:
-----------
font: string
"Helvetica"
"Times"
"Computer Modern"

usetex: Boolean
Use unicode. Default: False.
"""

# Use TeX for all figure text!
plt.rc('text', usetex=True)

font = font.lower().replace(" ","")
if font == 'times':
# Times
font = {'family':'serif', 'serif':['Times']}
preamble  = r"""
\usepackage{color}
\usepackage{mathptmx}
"""
elif font == 'helvetica':
# Helvetica
# set serif, too. Otherwise setting to times and then
# Helvetica causes an error.
font = {'family':'sans-serif','sans-serif':['Helvetica'],
'serif':['cm10']}
preamble  = r"""
\usepackage{color}
\usepackage[tx]{sfmath}
\usepackage{helvet}
"""
else:
# Computer modern serif
font = {'family':'serif', 'serif':['cm10']}
preamble  = r"""
\usepackage{color}
"""

if unicode:
# Unicode for Tex
#preamble =  r"""\usepackage[utf8]{inputenc}""" + preamble
# inputenc should be set automatically
plt.rcParams['text.latex.unicode']=True

#print font, preamble
plt.rc('font',**font)
plt.rcParams['text.latex.preamble'] = preamble
``````

Am 03.05.2013 um 16:08 schrieb Juergen Hasch <python@…4224…>:

The solution I use when I want all sans-serif out of TeX is to use the cmbright package, which can be turned on by adding:

rc(‘text.latex’, preamble=r’\usepackage{cmbright}’)

That may require installing the cmbright LaTeX package if you don’t already have it.

I am using the sfmath package for this purpose.

There is a nice comparision of the different approaches to get sans-serif math fonts at the bottom of the sfmath page:
http://dtrx.de/od/tex/sfmath.html

Get 100% visibility into Java/.NET code with AppDynamics Lite
It’s a free troubleshooting tool designed for production
Get down to code-level detail for bottlenecks, with <2% overhead.