32

I'm trying to change matplotlib's default font to Helvetica Neue. On my Mac with EPD/Canopy everything worked fine some time ago.

Trying to do the same on ubuntu now and it's not working.

This is what I did:

  1. Installed Helvetica Neue

    $ fc-match 'Helvetica Neue':Light
    HelveticaNeue-Light.otf: "Helvetica Neue" "細體"
    
  2. Converted the odt/dfont into ttf:

    fondu -show HelveticaNeue.dfont
    
  3. changed matplotlibrc to

    $ cat ~/.config/matplotlib/matplotlibrc
    ...
    font.family: Helvetica Neue
    

    I also tried with:

    font.family: sans-serif
    font.sans-serif: Helvetica Neue
    
  4. I removed the font cache

    rm ~/.config/matplotlib/fontList.cache
    

But none of these steps are working for me.

    $ python -c 'from  matplotlib import pyplot as plt; plt.plot(1); plt.savefig("/tmp/test.png")'
    /usr/local/lib/python2.7/dist-packages/matplotlib-1.3.0-py2.7-linux-x86_64.egg/matplotlib/font_manager.py:1236: 
    UserWarning: findfont: Font family ['Helvetica Neue'] not found. Falling back to Bitstream Vera Sans

(prop.get_family(), self.defaultFamily[fontext]))

Version is 1.3.0

    $ python -c 'import matplotlib; print  matplotlib.__version__'
    1.3.0

I also tried moving the fonts to ~/.config/matplotlib/fonts/ttf but it didn't work.


EDIT: As suggested I tried selecting a specific font for a specific text.

import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

path = '/home/<myusername>/.fonts/HelveticaNeue.ttf'

prop = font_manager.FontProperties(fname=path)
prop.set_weight = 'light'
mpl.rcParams['font.family'] = prop.get_name()
mpl.rcParams['font.weight'] = 'light'

fig, ax = plt.subplots()
ax.set_title('Text in a cool font', fontproperties=prop, size=40)
plt.savefig('/tmp/test2.png')

But it makes no difference.

/usr/local/lib/python2.7/dist-packages/matplotlib-1.3.0-py2.7-linux-x86_64.egg/matplotlib/font_manager.py:1236: 
UserWarning: findfont: Font family ['Helvetica Neue'] not found. Falling back to Bitstream Vera Sans

However I seem to experience this problem only with this Helvetica/Helvetica Neue font. (prop.get_family(), self.defaultFamily[fontext]))

6
  • 1
    Before trying to change the default, have you been able to use the new font directly/explicitly? stackoverflow.com/a/18821968/1643946 shows one way to list the fonts that python/mpl has available, and you could try using plt.text(1, 1, 'rattling', font_family="Helvetica Neue"). See also stackoverflow.com/a/16574948/1643946 Commented Jan 30, 2014 at 18:28
  • Fair point. I've tried now with no success. Edited the question accordingly. Commented Jan 30, 2014 at 19:39
  • Can you try this installing from the master branch? There has been a bunch of work recently related to font-lookup. It also looks like the font has non-ascii in the name, iirc there is a bug someplace upstream that makes that not work. Commented Jan 31, 2014 at 3:25
  • @tcaswell Tried with master ('1.4.x') and it's the same. Note that the same font (literally the same, I copied it across) works fine on my MacOS machine. Commented Jan 31, 2014 at 20:03
  • 1
    Please create an issue on github for this. It smells like a bug to me. Commented Jan 31, 2014 at 20:30

4 Answers 4

17

This will not change your font permanently, but it's worth a try.

matplotlib.rc('font', family='sans-serif') 
matplotlib.rc('font', serif='Helvetica Neue') 
matplotlib.rc('text', usetex='false') 
matplotlib.rcParams.update({'font.size': 22})
Sign up to request clarification or add additional context in comments.

4 Comments

I think the problem is not with the default behaviour, but more with the fact that it's not recognising my Helvetica Neue font. I filed a bug on github.
I'm using the EPD python version (enthought.com/products/epd) and Helvetica Neue is recognized there.
Great, thanks. On what OS? On my EPD (Canopy actually) for Mac it works too, but on Ubuntu it's not working.
I'm on Ubuntu 12.04. I hope this helps.
10

Ubuntu 14.04 LTS

Upload the fonts

sudo cp NotoSansKR-Regular.otf /usr/share/fonts/

Update the cache of font

sudo fc-cache -fv

You can check the font list

fc-list

Restart ipython, etc. Check the font list

[f.name for f in matplotlib.font_manager.fontManager.ttflist]

Take a your font name

import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'Noto Sans Korean'

Draw

plt.title(u'한글 제목')
plt.xlabel(u'한글 축 이름')
plt.plot(range(5))

4 Comments

Looks good, but does not work: [f.name for f in matplotlib.font_manager.fontManager.ttflist] gives AttributeError: 'module' object has no attribute 'font_manager'
Could you try this command import matplotlib.font_manager
sometimes matplotlib.font_manager._rebuild() is needed to use the new font
@Tobias when I try that, I get AttributeError: module 'matplotlib.font_manager' has no attribute '_rebuild'
2

Kim already introduced dynamic solution works perfectly, and here's two other ways doing the same in static.

First, you may put a line to rc file for matplotlib . Refer to this page for more information about locating the file and detailed settings.

font.family : NanumGothic

Second, if you are working with ipython, you can put some commands for font setting to a configuration file for the interactive shell. Find the file named ipython_config.py which usually located under ~/.ipython/somewhere. Then add two more lines to the list, c.InteractiveShellApp.exec_lines .

c.InteractiveShellApp.exec_lines = [
    "import matplotlib as mpl",
    "mpl.rcParams['font.family'] = 'NanumGothic'"
]

Former always works whatever environment you run your shell script on as it loads the font when your script imports matplotlib .

Comments

1

The font cache shows up in a different place for me (.cache/matplotlib/fontList.cache). And before I actually had three of them in different places somehow :/

maybe try searching for it in your home directory:

find ~/ -name fontList.cache -exec rm {} \;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.