当前位置:   article > 正文

Matplotlib 如何输出各种字体

matplotlib字体

matplotlib 默认输出的是无衬线字体,因此,修改无衬线字体的配置即可正确输出中文:

  1. import matplotlib.pyplot as plt
  2. plt.rcParams["font.sans-serif"] = ["STSong"]

一般来说, matplotlib 会将字体的配置保存在 ~/.matplotlib/fontlist.json 里,比如随便找一个 entry 是这样结构的:

  1. {
  2. "fname": "fonts/afm/phvro8an.afm",
  3. "name": "Helvetica",
  4. "style": "italic",
  5. "variant": "normal",
  6. "weight": "medium",
  7. "stretch": "condensed",
  8. "size": "scalable",
  9. "__class__": "FontEntry"
  10. }

name 就表示字体的名称,fname 是该字体的目录,可以在该 json 文件里添加新字体。

在 matplotlib 中,plt.titleplt.xlabelplt.ylabelplt.textplt.legend 这几个函数是涉及添加文字内容的。

修改字体类型或大小的方式,plt.titleplt.xlabelplt.ylabelplt.text 相同,使用 fontdict 参数;plt.legend 可以使用

fontdict 是一个字典,见:https://www.tutorialexample.com/understand-matplotlib-fontdict-a-beginner-guide-matplotlib-tutorial/

KeyValue
familysuch as serif, fantasy, Tahoma, monospace,’Times New Roman’ et al. You should notice: you can set font-family or font in this key.
colordarkred, red, black
weight‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’
size10, 12, ....
style‘normal’, ‘italic’, ‘oblique’

此外,还可以用其它关键词参数,如 fontsizefontfamilyfontstyle 来修改字体相关参数。

例:

  1. plt.plot([1, 2, 3, 4])
  2. plt.title("中文字体")
  3. plt.xlabel("English Italic",
  4. fontdict={"family": "Times New Roman", "style": "italic"})
  5. plt.ylabel("English Regular",
  6. fontdict={"family": "Times New Roman", "style": "normal"})
  7. plt.text(x=0.1, y=1.9, s="Random Text",
  8. fontsize=16, fontstyle="italic", fontfamily="Times New Roman")
  9. plt.text(x=1.9, y=2.5, s="\it{Tex Text} $a^2 + b^2$", usetex=True, fontsize=14)
  10. plt.legend(["$\Gamma, \mathit{\Gamma}$ 中文"])

结果如图:

plt.legend 只提供了 prop 参数接受一个 matplotlib.font_manager.FontProperties 来指定字体,或者是一个类似的字典。

  1. import matplotlib.font_manager.FontProperties as FontProperties
  2. FontProperties(family=None,
  3. style=None,
  4. variant=None,
  5. weight=None,
  6. stretch=None,
  7. size=None,
  8. fname=None,
  9. math_fontfamily=None)
  10. plt.legend(["$\Gamma, \mathit{\Gamma}$ 123abc"],
  11. prop={"family": "Times New Roman", "size": 16})

但这样的问题是,$$ 符号输出的时候,用的是 matplotlib 自带的对 LaTex 的支持,它支持不是特别完整,不能输出一些很专门的符号,比如 \mathit{\Gamma}\mathbb{E},这时候可以用 plt.rc('text', usetex=True) 设置全局 LaTex 输出,程序会调用 LaTex 来渲染这句话,甚至可以调用宏包来输出更复杂的数学公式!

默认使用 PDFLaTex,可以调整参数改成 XeLaTex 来获得对中文的支持!甚至可以添加导言区。

  1. import matplotlib as mpl
  2. mpl.use("pgf")
  3. plt.rcParams.update({
  4. "pgf.texsystem": "xelatex",
  5. "pgf.preamble": "\n".join([
  6. r"\usepackage{amsfonts}",
  7. r"\usepackage{xeCJK}",
  8. r"\usepackage[utf8x]{inputenc}",
  9. r"\usepackage[T1]{fontenc}",
  10. r"\usepackage{fontspec}",
  11. r"\setmainfont{Times New Roman}",
  12. r"\usepackage{amsmath}",
  13. # r"\setCJKmainfont{STSong}",
  14. ]),
  15. })

如果不是要在一句话里同时输出中文和复杂的公式,那么用 PDFLaTex 也足够了。

比如加入 url 宏包,可以生成带超链接的 pdf 图片:

  1. plt.figure()
  2. plt.plot([1, 2, 3, 4])
  3. plt.title("中文标题", usetex=False, fontfamily="STSong")
  4. plt.xlabel(r"$\mathbb{E}[X] = \frac{1}{n^2+1}$, \url{http://baidu.com}", usetex=True)
  5. plt.ylabel("\\textrm{English Regular}, $mc^2, \mathrm{VaR}$")
  6. plt.text(1.5,2.5, "\\textit{Tex Text} \\texttt{monospace} $a^2 + b^2 \mathit{A} \Rightarrow + \mathscr{A}$", usetex=True)
  7. # plt.legend(["$\Gamma, \mathit{\Gamma}$"])
  8. plt.savefig('ex3.pdf', bbox_inches="tight")
  9. # plt.show()

效果如下:

推荐阅读:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/423144
推荐阅读
相关标签
  

闽ICP备14008679号