2016-10-27 79 views
1

我希望能夠將.ttf文件放置在本地文件夾中,並將Matplotlib配置爲在該文件夾中查找字體,如果在正常系統文件夾中找不到它們。 This previous answer顯示瞭如何指向任何目錄中的特定字體。下面是答案代碼:如何配置matplotlib能夠從本地路徑讀取字體?

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.font_manager as font_manager 

path = '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf' 
prop = font_manager.FontProperties(fname=path) 
mpl.rcParams['font.family'] = prop.get_name() 
fig, ax = plt.subplots() 
ax.set_title('Text in a cool font', size=40) 
plt.show() 

這樣做的問題是,我想有這樣我想要的Helvetica每次做(或在這種情況下,Comic Sans字體)在我的陰謀。我相信另一種解決方案是將ttf文件複製到類似~/anaconda/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf的東西中,但我不希望觸摸這些東西並將文件放置在本地,以便在更新matplotlib時它們不會消失,因此更容易將配置跨同步機器。我覺得應該有一些方法來在我的~/.matplotlib/matplotlibrc文件中配置matplotlib,這樣如果我使用Helvetica,我不必每次都提供路徑。如何將.ttf文件放置在自定義目錄中(或者至少有一個對python或matplotlib更新是安全的),並且每次繪圖時都不必重新輸入文件路徑?

獎勵積分,如果解決方案允許我到一個相對路徑使用由import matplotlib; matplotlib.get_configdir()返回的目錄,因爲我的一些機器,是~/.config/matplotlib;以及一些它的~/.matplotlib

+0

嗯,這是MATLAB和Python,所以爲什麼不把一個叫做'loadfonts.py'文件,它爲需要的時候從一個共同的位置加載任意字體的功能,然後在你正在做的任何工作中使用它,就像你已經(無疑)導入其他工具包一樣? –

回答

1

如果有人關心,我決定將.ttf文件複製到類似~/anaconda/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf的目錄中是最方便的。更新matplotlib後,這些文件仍然存在,所以至少可能需要一段時間才能重複這個過程,這樣我就不需要在每次繪圖時都指向一個目錄或調用一個腳本。如果您在matplotlibrc文件中執行此操作和/或更改您的默認字體列表(兩者都是我所做的),則可能需要刪除位於~/.matplotlib/fontList.cache或〜/ .cache/matplotlib/fontList.cache`之類的緩存文件。 Matplotlib會在你下一次繪圖時重新生成。

+1

感謝您發佈此信息。超級討厭matplotlib不包括一些基本的字體管理工具,我們必須做這個晦澀的黑客。你也可以安裝系統字體和matplotlib應該自動檢測它們,但我並不總是有我安裝anaconda的sudo權限。 –

+0

@LukeDavis是的我同意,如果有更多的用戶友好的字體控制可用 –

1

要添加到@ Ben的答案,我寫了一個shell腳本,它可以自動爲任何python發行版自動執行此操作。您需要在該腳本的同一目錄中有一個fonts文件夾,其中包含.ttf文件。我把這個文件和fonts文件夾放在一個dotfiles文件夾中,我可以在git之間同步發行。

不管怎麼說,那就是:

#!/bin/bash 
# This function sets up any .ttf fonts contained in the <fonts> directory to be detected by matplotlib 
# Normally matplotlib just includes a couple open-source .ttf files, but this way we can carry many more 
# options across different systems. 
# See: https://olgabotvinnik.com/blog/2012-11-15-how-to-set-helvetica-as-the-default-sans-serif-font-in/ 

# We want empty loops if nothing available, so turn on null-globbing 
shopt -s nullglob 

# Add the fonts 
mpldir="$(python -c "import matplotlib; print(matplotlib.matplotlib_fname())")" # this is the location of matplotlib's default "matplotlibrc" file 
mfontdir="${mpldir%matplotlibrc}/fonts/ttf" # the same directory should contain a "fonts" folder 
echo "Transfering .ttf files in \"fonts\" folder to \"$mfontdir\"..." 
for font in fonts/*.ttf; do 
    if [ ! -r "$mfontdir/${font##*/}" ]; then # only copy if not already present 
    echo "Adding font \"${font##*/}\"..." 
    cp "$font" "$mfontdir/" 
    fi 
done 

# Then delete the font cache(s) so fonts are loaded on next startup 
# For get_cachedir see: https://stackoverflow.com/a/24196416/4970632 
cachedir=$(python -c "import matplotlib; print(matplotlib.get_cachedir())") 
caches=($cachedir/*.cache) # array listing of all font caches 
for cache in "${caches[@]}"; do 
    if [ ! -d "$cache" ]; then # ignore the tex.cache folder 
    echo "Deleting cache \"$cache\"..." 
    rm "$cache" 
    fi 
done 
+0

好!感謝分享! –