如何设置 Matplotlib 以无衬线字体呈现希腊字母
How to set Matplotlib to render greek letters in sans-serif font
我正在使用 Python (2.7) 和 Matplotlib (1.4.3) 生成一些图表,并希望我图表中的 所有 文本都在无衬线字体。使用外部 LaTeX 和 sfmath 包,我所能达到的最好结果无法在无衬线字体中设置希腊字母。这在以下 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 设置,但没有解决我的问题:
- Sans-serif math with latex in matplotlib
- Upright mu in plot label: retaining original tick fonts
- Typing Greek letters etc. in Python Plots
我看到的唯一一个似乎可以满足我要求的示例是 here(比较第一个和最后一个数字)但这需要修改 matplotlibrc 文件。这不适合我的目的;无论如何,如果无法根据需要简单地在代码中设置它,我会感到惊讶。
(1) 如何修改上述代码,使希腊字母与图中其余文本以相同的无衬线字体显示?*
(2) 是否可以使用 Matplotlib 的内置数学文本而不是依赖外部 LaTeX 安装来完成所有这些?
非常感谢您提出任何建议。
好吧,在使用 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-$ \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 轴标签来使间距均匀。
我正在使用 Python (2.7) 和 Matplotlib (1.4.3) 生成一些图表,并希望我图表中的 所有 文本都在无衬线字体。使用外部 LaTeX 和 sfmath 包,我所能达到的最好结果无法在无衬线字体中设置希腊字母。这在以下 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 设置,但没有解决我的问题:
- Sans-serif math with latex in matplotlib
- Upright mu in plot label: retaining original tick fonts
- Typing Greek letters etc. in Python Plots
我看到的唯一一个似乎可以满足我要求的示例是 here(比较第一个和最后一个数字)但这需要修改 matplotlibrc 文件。这不适合我的目的;无论如何,如果无法根据需要简单地在代码中设置它,我会感到惊讶。
(1) 如何修改上述代码,使希腊字母与图中其余文本以相同的无衬线字体显示?*
(2) 是否可以使用 Matplotlib 的内置数学文本而不是依赖外部 LaTeX 安装来完成所有这些?
非常感谢您提出任何建议。
好吧,在使用 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-$ \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 轴标签来使间距均匀。