我有一个启动的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'
和
mpl.rcParams['font.family'] = 'Anonymous Pro BI'
都返回类似
的内容/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
没有任何成功
答案 0 :(得分:14)
指定字体系列:
如果您只知道ttf的路径,那么您可以使用get_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()
答案 1 :(得分:3)
您可以使用fc-query myfile.ttf命令根据Linux字体系统(fontconfig)检查字体的元数据信息。它应该打印你的名字matplotlib将接受。然而,matplotlib fontconfig集成现在相当偏袒,所以我担心你很可能会遇到其他Linux应用程序中相同字体不存在的错误和限制。
(matplotlib默认配置中的所有硬编码字体名称都隐藏了这种悲伤状态,一旦你开始尝试改变它们,你就处于危险的土地上)
答案 2 :(得分:1)
当我在100行以下制作它时,@ nim这也更详细地解释了它有多危险,一些修改完全改变了字体属性和字体大小的行为。
先决条件:Matplotlib和包含ttf font-file 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()