Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何修复检测到错误字体权重的matplotlib?_Python 2.7_Matplotlib - Fatal编程技术网

Python 2.7 如何修复检测到错误字体权重的matplotlib?

Python 2.7 如何修复检测到错误字体权重的matplotlib?,python-2.7,matplotlib,Python 2.7,Matplotlib,我从谷歌字体下载了字体,我想用于我的论文和所有情节,即Alegreya字体系列。在将字体安装到$HOME/.fonts后,我删除了.cache/matplotlib/fontList.cache,并在rcParams中创建了一个带有新font.family='Alegreya Sans'的绘图。不幸的是,matplotlib将Alegreya Sans的薄字体检测为常规字体。以下最小示例说明了错误检测: import matplotlib.font_manager weights = ['ul

我从谷歌字体下载了字体,我想用于我的论文和所有情节,即Alegreya字体系列。在将字体安装到$HOME/.fonts后,我删除了.cache/matplotlib/fontList.cache,并在rcParams中创建了一个带有新font.family='Alegreya Sans'的绘图。不幸的是,matplotlib将Alegreya Sans的薄字体检测为常规字体。以下最小示例说明了错误检测:

import matplotlib.font_manager

weights = ['ultralight', 'light', 'normal', 'regular', 'book', 'medium', 
           'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 
           'extra bold', 'black']

print 'weight'+6*' ', 'file name', '\n'+70*'-'
for weight in weights:
    fprops = matplotlib.font_manager.FontProperties(family='Alegreya Sans', 
                                                    weight=weight)
    print weight+(12-len(weight))*' ', matplotlib.font_manager.findfont(fprops)
输出:

weight       file name 
----------------------------------------------------------------------
ultralight   /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Light.ttf
light        /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Light.ttf
normal       /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
regular      /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
book         /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
medium       /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Medium.ttf
roman        /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Medium.ttf
semibold     /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
demibold     /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
demi         /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
bold         /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
heavy        /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
extra bold   /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
black        /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Black.ttf
如何解决这个问题?为什么会发生这种情况?提前谢谢

编辑: 当然,在/hmi/kme/.fonts/Alegreya_Sans文件夹中还有更多文件/

完整列表

import matplotlib.font_manager

weights = ['ultralight', 'light', 'normal', 'regular', 'book', 'medium', 
           'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 
           'extra bold', 'black']

print 'weight'+6*' ', 'file name', '\n'+70*'-'
for weight in weights:
    fprops = matplotlib.font_manager.FontProperties(family='Alegreya Sans', 
                                                    weight=weight)
    print weight+(12-len(weight))*' ', matplotlib.font_manager.findfont(fprops)
  • AlegreyaSans-BlackItalic.ttf
  • AlegreyaSans-BoldItalic.ttf
  • AlegreyaSans-ExtraBoldItalic.ttf
  • AlegreyaSans-Italic.ttf
  • AlegreyaSans-Light.ttf
  • AlegreyaSans-Medium.ttf
  • AlegreyaSans-ThinItalic.ttf
  • AlegreyaSans-Black.ttf
  • AlegreyaSans-Bold.ttf
  • AlegreyaSans-ExtraBold.ttf
  • AlegreyaSans-LightItalic.ttf
  • AlegreyaSans-MediumItalic.ttf
  • AlegreyaSans-Regular.ttf
  • AlegreyaSans-Thin.ttf
我的系统
  • OpenSuse 13.1
  • python 2.7
  • matplotlib版本1.4.3

我通过解决方法手动修复了该问题。无论如何,这似乎是一个错误。正如tom提到的,我将所有字体复制到$HOME/.fonts中,没有子目录。这改变了我在问题中给出的脚本的输出。为了找出问题所在,我尝试以以下方式打印Alegreya和Alegreya Sans的所有重量和样式组合:

import matplotlib
matplotlib.use('Qt4Agg')
print matplotlib.get_backend()
import matplotlib.pyplot as plt

alignment = {'horizontalalignment':'center', 'verticalalignment':'baseline'}
alegreya_weights = { 'Alegreya': ['regular', 'bold', 'black'],
                     'Alegreya Sans': ['ultralight', 'light', 'regular', 
                                       'medium', 'bold', 'extra bold', 
                                       'black'] }
styles = ['normal', 'italic']

combinations = []
for family in alegreya_weights.keys():
    for style in styles:
        for weight in alegreya_weights[family]:
            combinations.append((family, weight, style))
N = len(combinations)

def textPlot(ax, i, N, family, weight, style):
    y = 1.-(1./float(N)) -float(i)/(float(N)+1)
    ax.text(0.5, y, family+' '+weight+' '+style, 
            family=family, weight=weight, style = style, 
            fontsize = 30, **alignment)

fig = plt.figure(figsize=(8, .7*N), frameon=False)
ax = plt.gca()
ax.axis('off')
plt.xlim((0.,1.))
plt.ylim((0.,1.))

for i,c in enumerate(combinations):
    textPlot(ax, i, N, c[0], c[1], c[2])

plt.show()
结果表明,只有AlegreyaSans-Regular.ttf被AlegreyaSans-Thin.ttf所取代。我无法确定这是否是由于单词“Thin”造成的,在matplotlib语法中它被称为“ultralight”。我在$HOME/.cache/matplotlib/fontList.cache中将“AlegreyaSans Thin.ttf”替换为“AlegreyaSans Regular.ttf”,以解决该问题

现在,下图是上面脚本的结果。未检测到薄(超轻)


感谢tom的帮助。

感谢您发布此消息-我在尝试安装Fira SAN字体以使用matplotlib时遇到了类似的问题,即无法显示正确的字体大小。将字体权重与文件名关联的诊断非常有用

在Mac电脑上,我修复了删除电脑上所有Fira Sans.ttf文件并通过字体手册从头开始重新安装的问题。事实证明,在我不知道自己在做什么的时候,我曾经在其他字体目录中放置过几个Fira Sans字体文件(包括FiraSans Regular)。随后,当我试图使用Font Book安装Fira SAN时,
常规
字体未能正确安装,导致fontmanager选择了奇怪的字体


tl;dr-如果您运行上面的诊断,但在给定的权重旁边没有看到预期的文件名,请检查字体是否正确安装在字体库中。

使用相同版本的matplotlib和python,但在mac(10.10.5)上,我会得到不同的结果。如果你得到的是
AlegreyaSans Thin.ttf
,我得到的是
AlegreyaSans Regular.ttf
,如果你得到的是
AlegreyaSans ExtraBold.ttf
,我得到的是
AlegreyaSans Bold.ttf
。其他一切都一样。不确定这是否有帮助,但它至少添加了一个数据点!嗯,事实上,这很奇怪。如果字体直接位于
$HOME/.fonts
中,我在上面评论中的结果是正确的。如果我将它们移动到子目录
$HOME/.fonts/Alegreya_Sans
,我会得到与您相同的结果you@tom这听起来很奇怪。这怎么可能?我想知道matplotlib是用什么来检测字体大小的。显然,他们没有解析文件名:)遗憾的是,我不理解fontList.cache中的语法,所以即使是手动修复也无法完成。还有什么想法吗?@tom我现在用没有子目录的.font中的所有.ttf文件检查了它。这甚至更奇怪:我现在得到的输出和你一样,也就是说,用普通字体代替了精简字体等等,但它仍然在输出pdf中使用精简字体。感谢您的帮助。您是否再次清除字体缓存?很抱歉,我不太了解font_manager的工作原理,但希望不久会有更了解font_manager的人出现:)Matplotlib目前有一个。不幸的是,在matplotlib中添加字体时,必须删除所有“精简”文件!