You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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文件:

  1. 先找到Matplotlib配置文件的位置:
python -c "import matplotlib; print(matplotlib.matplotlib_fname())"

运行后会输出类似/usr/local/lib/python3.8/dist-packages/matplotlib/mpl-data/matplotlibrc的路径。

  1. 打开这个文件,找到以下字段并修改:
# 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

火山引擎 最新活动