如何在Matplotlib中全局设置自定义OTF字体(Ubuntu 20.04环境)
可靠设置Helvetica Neue LT Pro Condensed为Matplotlib全局默认字体
我明白你遇到的麻烦——手动改字体缓存确实不是长久之计,毕竟Matplotlib随时可能重新生成缓存文件。下面是几个可靠的解决方案,从临时脚本配置到永久全局设置都有:
方法一:通过字体属性精准匹配(推荐用于脚本内临时全局设置)
因为你的字体缓存里有多个name为"Helvetica Neue LT Pro"的条目,我们可以通过**字体的拉伸(stretch)、权重(weight)和样式(style)**来精准定位你需要的 condensed 版本,而不是依赖容易冲突的name字段。
直接在脚本开头添加以下配置:
import matplotlib.pyplot as plt # 配置全局字体:指定sans-serif字体为目标字体,并设置对应的属性 plt.rcParams.update({ "font.sans-serif": ["Helvetica Neue LT Pro"], "font.weight": "normal", # 对应缓存里的weight:400 "font.stretch": "condensed", # 对应缓存里的stretch:"condensed" "font.style": "normal" # 对应缓存里的style:"normal" }) # 测试一下 fig, ax = plt.subplots() ax.plot([1,2,3]) ax.set_title("Helvetica Test") plt.show()
这样Matplotlib会自动从同名字体中筛选出符合condensed拉伸、normal权重和样式的版本,不用再担心缓存重置的问题。
方法二:直接指定字体文件路径到全局配置
如果上面的属性匹配还是有问题,你可以直接把字体文件路径全局绑定到sans-serif列表里,这样Matplotlib会优先加载这个路径的字体:
import matplotlib.pyplot as plt fpath = "/usr/share/fonts/opentype/Helvetica_Neue_LT_Pro/HelveticaNeueLTPro-Cn.otf" plt.rcParams["font.sans-serif"] = [fpath] plt.rcParams["font.family"] = "sans-serif" # 测试代码 fig, ax = plt.subplots() ax.plot([1,2,3]) ax.set_title("Helvetica Test") plt.show()
这种方式完全绕开了字体名称匹配的问题,直接指向你需要的字体文件,可靠性拉满。
方法三:永久全局设置(修改Matplotlib配置文件)
如果你希望所有Matplotlib脚本都默认使用这个字体,可以修改全局的matplotlibrc文件:
- 先找到Matplotlib配置文件的位置:
python -c "import matplotlib; print(matplotlib.matplotlib_fname())"
运行后会输出类似/usr/local/lib/python3.8/dist-packages/matplotlib/mpl-data/matplotlibrc的路径。
- 打开这个文件,找到以下字段并修改:
# font.family : sans-serif font.family : sans-serif # font.sans-serif : DejaVu Sans, ...(默认列表) font.sans-serif : /usr/share/fonts/opentype/Helvetica_Neue_LT_Pro/HelveticaNeueLTPro-Cn.otf, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif # 可选:如果需要匹配属性,也可以添加下面的配置 font.weight : normal font.stretch : condensed
修改后保存,以后所有Matplotlib会话都会默认使用这个字体。
必要步骤:清除Matplotlib字体缓存
不管用哪种方法,建议先清除旧的字体缓存,让Matplotlib重新扫描字体:
rm -rf ~/.cache/matplotlib/
之后运行Matplotlib脚本时,它会重新生成包含最新字体信息的缓存文件。
这样操作后,就不用再手动修改缓存文件,完全可以可靠地把目标字体设为全局默认啦!
内容的提问来源于stack exchange,提问作者smcs




