Matplotlib cannot find basic fonts
PythonMatplotlibTruetypeMinicondaPython Problem Overview
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!
Python Solutions
Solution 1 - Python
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
Solution 2 - Python
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.
Solution 3 - Python
This work for me::
$ sudo apt-get install msttcorefonts -qq
Solution 4 - Python
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]))
-
Delete the fonts located in matplotlib's cache.
Cache's location:import matplotlib as mpl; print(mpl.font_manager.get_cachedir())
-
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
-
Copy necessary fonts like Computer Modern to this directory.
The warning may persist, but your plots' font should change appropriately.
Solution 5 - Python
There is a conda package for it[1].
So, you don't really need sudo
to fix this!
conda install -c conda-forge -y mscorefonts
UPDATE: the below functionality is broken in recent matplotlib (no longer works on v3.4.3)
>>Also, if you dont want to restart jupyter, you can force rebuild matplotlib font cache
import matplotlib
matplotlib.font_manager._rebuild()
Solution 6 - Python
I actually solved by
import matplotlib.font_manager
Solution 7 - Python
I had this problem with anaconda env (it could be useful in other related situations as well). For example, for base env, I have checked the following directory: /home/***/anaconda3/pkgs/matplotlib-base-3.1.3-py37hef1b27d_0/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
and noticed that I have DejaVuSerif.ttf intalled there, so instead of using plt.rcParams['font.family'] = 'Serif' I used plt.rcParams['font.family'] = 'DeJavu Serif' ( there is a space between "DeJavu and serif" ). i worked for me.
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'DeJavu Serif'
plt.rcParams['font.serif'] = ['Times New Roman']
Solution 8 - Python
It took me many hours to finally figure out that I needed to update matplotlib.
My original version of 3.0.3
(which came with my jupyter-datascience docker image) would give me this error, but updating to 3.1.1
fixed it.
In the end, my docker script:
RUN pip install matplotlib==3.1.1
COPY fonts /usr/share/fonts/truetype/
RUN fc-cache -fv
RUN rm /home/jovyan/.cache/matplotlib -rf
is what did it for me.
Solution 9 - Python
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.
Solution 10 - Python
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.
Solution 11 - Python
I am in macOS with jupyter notebook, I solved with the following, first close your jupyter notebook. Then find out the font path by doing the following in Python
import matplotlib
print(matplotlib.matplotlib_fname())
it prints /Users/zyy/anaconda2/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
for me, notice matplotlibrc
is a file, not a directory.
Then download font SimHei, and copy it to the directory fonts/ttf
under the mpl-data/
directory above.
Delete directory ~/.cache/matplotlib
and restart your jupyter notebook, everything should be good.
Solution 12 - Python
For windows users
- Just go to the cache dir of matplotlib by using
import matplotlib as mpl
print(mpl.font_manager.get_cachedir())
-
Clear the entire cache file
-
Lastly again import matplotlib
Hopefully u will also find it helpful as it worked for me
P:S - If you wish you can restart your jupyter/ide (optional) after this
Solution 13 - Python
None of the above worked for me. I had to combine the provided solutions.
I run Jupyter from PyCharm in Windows 10. Here is my workaround. Before doing these steps, import the font manager via import matplotlib.font_manager
:
- Find font directory =>
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
- Put your font file (ttf. file) to that directory.
- Find font config file:
matplotlib.matplotlib_fname()
- Edit to set font type:
pdf.fonttype: 42 # Output Type 3 (Type3) or Type 42 (TrueType)
- Run PyCharm.
- After you start kernel, cache files will be generated. Clean
\matplotlib\__pycache__
folder. - Set the font you want to use via:
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Lin Libertine']
- Run the code to generate plots.
If you restart your kernel, if will generate cache files, hence you need to remove them again.