在matplotlib中更改字体

ia2d9nvy  于 2023-05-01  发布在  其他
关注(0)|答案(4)|浏览(199)

所以我尝试了几乎所有我能在stackoverflow上找到的东西(以及任何谷歌能引导我的地方);我就是改不了这该死的字体
以下是我迄今为止尝试过的非详尽列表:
按照this question中的建议尝试:

import matplotlib.pyplot as plt
csfont = {'fontname':'Times New Roman'}
x = [1,2,3]
y = x

plt.plot(x,y)

plt.title('Please be Times >__<',**csfont)

plt.show()

给了我这个错误日志:

>>> (executing file "<tmp 1>")
Note on using QApplication.exec_():
The GUI event loop is already running in the pyzo kernel, and exec_()
does not block. In most cases your app should run fine without the need
for modifications. For clarity, this is what the pyzo kernel does:
- Prevent deletion of objects in the local scope of functions leading to exec_()
- Prevent system exit right after the exec_() call
/home/antoine/miniconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['Times New Roman'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

>>>

这个答案也没有帮到我:

import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Times New Roman"
x = [1,2,3]
y = x

plt.plot(x,y)

plt.title('Please be Times >__<',**csfont)

plt.show()

没有显示错误;但这不是时代杂志..

对我来说,第一次尝试给出错误日志也有点奇怪,因为这样做表明Times New Roman确实是我应该能够使用的字体:

>>> set([f.name for f in matplotlib.font_manager.fontManager.afmlist])
{'Courier', 'Times', 'URW Bookman L', 'Nimbus Mono L', 'ITC Bookman', 'ZapfDingbats', 'Century Schoolbook L', 'New Century Schoolbook', 'Helvetica', 'Standard Symbols L', 'Utopia', 'Palatino', 'URW Gothic L', 'Courier 10 Pitch', 'Symbol', 'Computer Modern', 'Bitstream Charter', 'ITC Avant Garde Gothic', 'Nimbus Roman No9 L', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'URW Chancery L', 'Nimbus Sans L', 'Dingbats', 'URW Palladio L'}

所以...我还能做什么?

6yoyoihd

6yoyoihd1#

为了查看哪些字体可用,您应该使用this method

import  matplotlib.font_manager
flist = matplotlib.font_manager.get_fontconfig_fonts()
names = [matplotlib.font_manager.FontProperties(fname=fname).get_name() for fname in flist]
print(names)

然后看看《时代新罗马人》是否在那里。

if "Times New Roman" in names:
    print("Yes")
else:
    print("font not available")

如果不是,你不能使用它。如果是,则以下内容将按预期工作。

import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Times New Roman"

plt.plot([1,2,3])

plt.title('Please be Times New Roman')

plt.show()

请注意,您可以指定几种字体。将选择实际可用的第一个。在列表中最后添加"serif"至少可以确保在其他字体都不存在的情况下回退到serif字体。

plt.rcParams["font.family"] = "Gulasch", "Times", "Times New Roman", "serif"
h6my8fg2

h6my8fg22#

我在Python 3上遇到了同样的问题。9、Anaconda on Pop!_OS 20.04 Linux。
所有专有的MS字体都是使用sudo apt install ttf-mscorefonts-installer安装的,但根本没有帮助。
安装一个包含MS字体的CONDA包也没有帮助matplotlib!:(
还有,我的fontmanager抱怨没有重建这样的东西!
AttributeError: module 'matplotlib.font_manager' has no attribute '__rebuild'

解决方案:

我已经将MS字体从/home/dracid/anaconda3/fonts复制到Matplotlib的OWN字体文件夹中。在我的系统里是:
/home/dracid/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf
在此之后,需要删除matplotlib字体/home/dracid/.cache/matplotlib/fontlist-v330.json,然后在下一次启动Python会话时,它将重建缓存。
然后,VIOLA我的IEEE论文情节终于工作了:)现在我可以继续with my academic work on LINUX <3

js81xvg6

js81xvg63#

同样的问题,同样的警告:

UserWarning: findfont: Font family ['Times New Roman'] not found. Falling back to DejaVu Sans

我读了很多Stack Overflow的帖子,直到我找到了this
现在我可以在matplotlib中使用“Times New Roman”了。
在我的例子中,我不得不使用sudo,因为我没有使用虚拟环境,所以我会这样做:

sudo cp /usr/share/fonts/truetype/msttcorefonts/Times_New_Roman* /usr/local/lib/python2.7/dist-packages/matplotlib/mpl-data/fonts/ttf

另一件事,我会查找的是帖子的最后一个建议,我。例如,
注意:如果字体没有呈现,可能是因为matplotlib需要刷新它的字体缓存(参见Kevin的评论):
导入matplotlib
matplotlib.font_manager._rebuild()
对我没用。相反,我使用:

import matplotlib.font_manager as fm

fm._rebuild()
1zmg4dgp

1zmg4dgp4#

我使用这段ipython代码来确保Georgia安装在virtualenv中。显然,matplotlib.font_manager找到它是不够的。

import os.path
import matplotlib
import matplotlib.font_manager

destination = os.path.join(os.path.dirname(matplotlib.__file__), 'mpl-data/fonts/ttf')
for font_filename in matplotlib.font_manager.get_fontconfig_fonts():
    try:
        if matplotlib.font_manager.FontProperties(fname=fname).get_name() == 'Georgia':
            !cp '{font_filename}' '{destination}'
            matplotlib.font_manager.rebuild()
            print('Installed ' font_filename)
            break
    except:
        pass

相关问题