Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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 如何使用mpl.rcParams在matplotlib中加载.ttf文件?_Python_Fonts_Matplotlib - Fatal编程技术网

Python 如何使用mpl.rcParams在matplotlib中加载.ttf文件?

Python 如何使用mpl.rcParams在matplotlib中加载.ttf文件?,python,fonts,matplotlib,Python,Fonts,Matplotlib,我有一个matplotlib脚本,它开始于 import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.font_manager as fm mpl.rcParams['xtick.labelsize']=16 ... 我已经使用了命令 fm.findSystemFonts() 获取我的系统上的字体列表。我找到了一个.ttf文件的完整路径 '/usr/share/fonts/truetype/ano

我有一个matplotlib脚本,它开始于

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

mpl.rcParams['xtick.labelsize']=16 
...
我已经使用了命令

fm.findSystemFonts()
获取我的系统上的字体列表。我找到了一个.ttf文件的完整路径

'/usr/share/fonts/truetype/anonymous-pro/Anonymous Pro BI.ttf'
我尝试使用以下命令使用这种字体,但没有成功

mpl.rcParams['font.family'] = 'anonymous-pro'  

它们都返回类似于

/usr/lib/pymodules/python2.7/matplotlib/font_manager.py:1218: UserWarning: findfont: Font family ['anonymous-pro'] not found. Falling back to Bitstream Vera Sans
我可以使用mpl.rcParams字典在绘图中设置此字体吗

编辑

在阅读了更多内容后,这似乎是从.ttf文件确定字体系列名称的一般问题。这在linux或python中容易做到吗

此外,我还尝试添加

mpl.use['agg']
mpl.rcParams['text.usetex'] = False

没有任何成功

指定字体系列:

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)
fig, ax = plt.subplots()
ax.set_title('Text in a cool font', fontproperties=prop, size=40)
plt.show()
如果您只知道ttf的路径,则可以使用
get\u name
方法查找字体系列名称:

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()

按路径指定字体:

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)
fig, ax = plt.subplots()
ax.set_title('Text in a cool font', fontproperties=prop, size=40)
plt.show()

您可以使用fc query myfile.ttf命令根据Linux字体系统(fontconfig)检查字体的元数据信息。它应该打印matplotlib将接受的名称。但是,matplotlib fontconfig集成目前还相当不完整,因此我担心您很可能会遇到其他Linux应用程序中不存在的相同字体的错误和限制


(这种可悲的状态被matplotlib默认配置中所有硬编码的字体名称所隐藏,一旦你开始尝试更改它们,你就进入了危险地带)

当我在100行以下时,@nim这也更详细地解释了它有多危险,某些修改完全改变了字体属性和字体大小的行为

前提条件:Matplotlib和与包含ttf字体文件calibri.ttf的脚本处于同一级别的字体文件夹

但这是我给你的复活节彩蛋:

import os
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib import ft2font
from matplotlib.font_manager import ttfFontProperty

__font_dir__ = os.path.join(os.path.dirname(__file__),"font")
fpath = os.path.join(__font_dir__,'calibri.ttf')

font = ft2font.FT2Font(fpath)
fprop = fm.FontProperties(fname=fpath)

ttfFontProp = ttfFontProperty(font)

fontsize=18

fontprop = fm.FontProperties(family='sans-serif',
                            #name=ap.fontprop.name,
                            fname=ttfFontProp.fname,
                            size=fontsize,
                            stretch=ttfFontProp.stretch,
                            style=ttfFontProp.style,
                            variant=ttfFontProp.variant,
                            weight=ttfFontProp.weight)

matplotlib.rcParams.update({'font.size': fontsize,
                        'font.family': 'sans-serif'})

fig, axis = plt.subplots()

axis.set_title('Text in a cool font',fontsize=fontsize,fontproperties=fontprop)

ax_right = axis.twinx()

axis.set_xlabel("some Unit",fontsize=fontsize,fontproperties=fontprop)

leftAxesName,rightAxesName = "left Unit", "right Unit"

axis.set_ylabel(leftAxesName,fontsize=fontsize,fontproperties=fontprop)
if rightAxesName:
    ax_right.set_ylabel(rightAxesName,fontsize=fontsize,fontproperties=fontprop)

for xLabel in axis.get_xticklabels():
    xLabel.set_fontproperties(fontprop)
    xLabel.set_fontsize(fontsize)

for yLabel in axis.get_yticklabels():
    yLabel.set_fontproperties(fontprop)
    yLabel.set_fontsize(fontsize)    

yTickLabelLeft = ax_right.get_yticklabels()

for yLabel in yTickLabelLeft:
    yLabel.set_fontproperties(fontprop)
    yLabel.set_fontsize(fontsize)

axis.plot([0,1],[0,1],label="test")

nrow,ncol=1,1
handels,labels= axis.get_legend_handles_labels()

propsLeft=axis.properties()

propsRight=ax_right.properties()

print(propsLeft['title'],propsLeft['xlabel'],propsLeft['ylabel'])
print(propsRight['ylabel'])

fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 0.05, 'h_pad': 1.5})
fig.tight_layout()
fig.set_alpha(True)

leg_fig = plt.figure()

leg = leg_fig.legend(handels, labels, #labels = tuple(bar_names)
   ncol=ncol, mode=None, 
   borderaxespad=0.,
   loc='center',        # the location of the legend handles
   handleheight=None,   # the height of the legend handles
   #fontsize=9,         # prop beats fontsize
   markerscale=None,
   frameon=False,
   prop=fontprop)

plt.show()

谢谢我在[这个]()帖子中看到了这个解决方案。但是,我希望更改绘图上所有文本的字体,而不更新生成文本的每个命令和/或添加更改轴标签文本的命令。这就是为什么我喜欢使用mpl.rcParams,如果可能的话。酷。谢谢你的详细回答。帮助很大!是否有办法将此路径或包含多个.ttf文件的本地目录的路径添加到matplotlibrc文件或其他文件中的变量中,这样我就不必每次使用matplotlib无法找到的字体时都重新键入路径?