Matplotlib cannot find basic fonts

2019-01-22 02:07发布

问题:

I am using matplotlib version 2.0.0 on Python 3 in a miniconda virtual environment. I am working on a unix scientific computing cluster where I don't have root privileges. I am generally executing python code through an ipython notebook. If I do a basic command such as:

import matplotlib.pyplot as plt
plt.scatter([1,5], [1,5])

I get an error message:

path_to_miniconda/miniconda3/envs/conda34/lib/python3.4/site-
packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family
['sans-serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

I would like to be able to use a Times New Roman font but even after deleting the Font cache file (fontList.py3k.cache) which I find from here:

import matplotlib as mpl
fm = mpl.font_manager
fm.get_cachedir()

The commands:

mpl.rcParams['font.family'] = ['serif']
mpl.rcParams['font.serif'] = ['Times New Roman']

have no effect, I get the same error as above. The true type fonts directory:

path_to_miniconda/miniconda3/envs/conda34/lib/python3.4/site-packages/matplotlib/mpl-data/fonts/ttf/

only has 40 fonts in it of the type: DejaVuSerif,DejaVuSans,STIX,cmb, cmt, cmy

Any idea what could be going on and how I can add additional fonts? Thanks!

回答1:

This work for me::

$ sudo apt-get install msttcorefonts -qq


回答2:

I had this exact same problem on a Vagrant VM running Ubuntu Xenial 64-bit. No matter how many fonts I had already installed, matplotlib was having a problem with the "system" font name "sans-serif". I fixed it by:

  • Stopping Jupyter
  • Installing font-manager: sudo apt install font-manager
  • Cleaning the matplotlib cache directory: rm ~/.cache/matplotlib -fr
  • Restarting Jupyter.

No more error messages about sans-serif.



回答3:

To get it to work, I had to combine the two current top answers. Here's what worked for me:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf


回答4:

A solution for Windows users, when confronted with the warning:

UserWarning: findfont: Font family ['serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
  1. Delete the fonts located in matplotlib's cache.
    Cache's location: import matplotlib as mpl; print(mpl.font_manager.get_cachedir())

  2. Find matplotlib's font directory. The path might be similar to
    C:\Miniconda3\pkgs\matplotlib-2.2.2-py36_1\Lib\site-packages\matplotlib\mpl-data\fonts\ttf

  3. Copy necessary fonts like Computer Modern to this directory.

The warning may persist, but your plots' font should change appropriately.



回答5:

I was facing a similar issue in a Cloud Datalab docker image running on a gcloud VM. Executing the following fixed the issue for me:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf

Here is instructions on how to get to the docker image running on the gcloud VM containing the Datalab instance just in case.



回答6:

try all the methods above, not work for me.

my way to solve this is a little dirrent cause I'm using conda on ubuntu server running jupyter

locate -b '\mpl-data'

find a folder

/usr/share/matplotlib/mpl-data

then I add the simhei fonts into the font folder in mpl-data . then remove matplotlib fonts cache

rm -rf ~/.cache/matplotlib

restart jupyter notebook, and it works.