【问题标题】:How to set Matplotlib to render greek letters in sans-serif font如何设置 Matplotlib 以无衬线字体呈现希腊字母
【发布时间】:2018-07-05 09:21:25
【问题描述】:

我正在使用 Python (2.7) 和 Matplotlib (1.4.3) 生成一些图,并且希望我的图中的 所有 文本采用无衬线字体。我使用外部 LaTeX 和 sfmath 包所能达到的最好效果,无法在 sans-serif 中设置希腊字母。这在以下 MWE 中得到了证明:

import matplotlib.pyplot as plt
from matplotlib import rc

rc('text', usetex=True)
rc('text.latex', preamble=r'\usepackage{sfmath}')

fig, ax = plt.subplots()
ax.plot([0,1,2], [2,5,9]) #arbitrary data
ax.set_xlabel(r'$x$ (m)', fontsize=16)
ax.set_ylabel(r'$y = \alpha(x)x^2 - 2\mu$', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16, pad=8)
fig.tight_layout()
fig.show()

[Output of above code (.png)]

我对示例轴标​​签感到满意,但 α 和 μ 以默认 LaTeX 衬线字体呈现。

我看过的一些其他问题的答案,涉及更改各种 rc 设置,但不能解决我的问题:

我见过的唯一一个似乎可以满足我要求的例子是here(比较第一个和最后一个数字),但这需要修改 matplotlibrc 文件。这不适合我的目的;无论如何,如果不能根据需要在代码中简单地设置它,我会感到惊讶。

(1) 如何修改上述代码,使希腊字母以与图中其余文本相同的无衬线字体显示?*

(2) 是否可以使用 Matplotlib 的内置 mathtext 而不是依赖外部 LaTeX 安装来完成所有这些工作?

非常感谢您的任何建议。

【问题讨论】:

  • matplotlib 页面上的example 确实包含无衬线字体的所有内容。也许是时候更新你的 matplotlib 版本了。
  • 有趣,谢谢。我很乐意更新我的 matplotlib,问题是我的代码将与拥有上面列出的版本的人共享,并且结果必须仅通过运行代码才能重现(即没有额外/手动修改它们的结尾;它是安全的假设安装了 LaTeX;假设 sfmath 包的安全性稍差一些,这只是我迄今为止发现的最好的折衷方案)。无论如何,我认为这个问题仍然存在。

标签: python matplotlib tex


【解决方案1】:

好吧,在玩了一段时间的 rcParams 之后,我偶然发现了一种实现我想要的方法

  • 不需要外部 LaTeX 安装
  • 不需要手动编辑 matplotlibrc 文件
  • 默认以斜体无衬线字体呈现数学文本,包括希腊字母
  • 使用\mathrm{} 以非斜体无衬线呈现包括希腊字母在内的数学文本

rcParams 设置改为:

import matplotlib as mpl
import matploblit.pyplot as plt

mpl.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.sans-serif'] = 'Arial'
mpl.rcParams['mathtext.fontset'] = 'custom'
mpl.rcParams['mathtext.rm'] = 'sans'
mpl.rcParams['mathtext.it'] = 'sans:italic'
mpl.rcParams['mathtext.default'] = 'it'

fig, ax = plt.subplots()
ax.plot([0,1,2], [2,5,9])
ax.set_xlabel(r'$x$ (m)', fontsize=16)
ax.set_ylabel(r'$y = \alpha$($x$)$x^2-$ $2\mu$', fontsize=16)
ax.set_title(r'Some non-italics: $\mathrm{\alpha, \beta, \gamma}$', fontsize=20)
ax.tick_params(axis='both', which='major', labelsize=16, pad=8)
fig.tight_layout()
fig.show()

[Output of above code (.png)]

请注意,在这个特定示例中,我确实必须使用 y 轴标签才能使间距均匀。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 2015-03-11
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多