matplotlib选择错误的字体样式/重量

时间:2016-10-04 14:37:01

标签: python matplotlib fonts

我想将matplotlib图中使用的默认字体更改为Windows下的Segoe UI。我可以通过改变rcParams来实现这一目标

import matplotlib
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['Segoe UI'] + matplotlib.rcParams['font.sans-serif']
matplotlib.rcParams['font.weight'] = 'normal'

这样可行,但字体的重量似乎是错误的。使用以下代码,我可以确认matplotlib正在接收“Semibold”'版本的字体而不是' Regular'设置matplotlib.rcParams['font.weight'] = 'normal'时我期望的变体。

from matplotlib.font_manager import findfont, FontProperties
font = findfont(FontProperties(family=['sans-serif']))
print font

>>> c:\windows\fonts\seguisb.ttf

如何强制matplotlib使用' Regular'变种?这可能是rcParams吗?

2 个答案:

答案 0 :(得分:1)

我想出了一个修复Segoe UI问题的黑客,而不需要每次都设置kwargs ......

出于某种原因,tf2font模块(.pyd)将字体权重归因于Segoe UI Black,Ultralight,Light和Semi-bold字体,其字体权重应为1000,100,分别为200和500。

首先删除你的fontList.json文件。(对我而言,它位于.matplotlib \ fontList.json中)。

然后,就在font_manager.py中的这一行之前:

return FontEntry(font.fname, name, style, variant, weight, stretch, size) 

插入以下代码:

switch = lambda x: {
    #Correct the font-weight for these fonts
    'seguibl.ttf': 1000,
    'segouisl.ttf': 100,
    'seguisb.ttf':500,
    'segoeuil.ttf':200
}[x]

f =  os.path.split(font.fname)[1]
if f in ['seguibl.ttf', 'segouisl.ttf', 'seguisb.ttf', 'segoeuil.ttf']:
    weight = switch(f)

最终结果如下:

switch = lambda x: {
    #Correct the font-weight for these fonts
    'seguibl.ttf': 1000,
    'segouisl.ttf': 100,
    'seguisb.ttf':500,
    'segoeuil.ttf':200
}[x]

f =  os.path.split(font.fname)[1]
if f in ['seguibl.ttf', 'segouisl.ttf', 'seguisb.ttf', 'segoeuil.ttf']:
    weight = switch(f)
return FontEntry(font.fname, name, style, variant, weight, stretch, size)

答案 1 :(得分:0)

似乎matplotlib无缘无故地从所有“Segoe UI”字体中选择粗体字体。我担心你在rcParams级别上对此无能为力。

如果有人找到解决此问题的方法,我也非常感谢。

在此之前,这是一个使用fontproperties kwarg的解决方法。

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

fig, ax = plt.subplots()
path = r'C:\Windows\Fonts\segoeui.ttf'
path1 = r'C:\Windows\Fonts\seguisb.ttf'
path2 = r'C:\Windows\Fonts\arial.ttf'
for i, p in enumerate([path,path1,path2]):
    prop = font_manager.FontProperties(fname=p)
    tx = 'Text in {font},\n{path}\nweight {weight}\nvariant {var}'
    tx = tx.format(font=prop.get_name(), weight=prop.get_weight(), var=prop.get_variant(), path=p)
    ax.text(0.1,0.1+i*0.3,tx, fontproperties=prop, size=18)
plt.show()

显然缺点是你需要手动将它放在任何地方,而不是把它放在标题中。

相关问题