强制 LaTeX 字体匹配默认的 matplotlib 字体

Force LaTeX font to match default matplotlib font

我看到这个问题时不时出现,但还没有找到合适的答案。

在 matplotlib 中绘图时,插入符号和数学函数(如分数、指数等)的唯一方法是使用 TeX 格式。但是,默认情况下,TeX 格式使用不同的字体并将文本设为斜体。因此,例如,如果我想要一个轴标签来表示以下内容:

photons/cm^2/s/Angstrom

我必须执行以下操作:

ax1.set_ylabel(r'Photons/$cm^2$/s/$\AA$')

这会产生一个非常难看的标签,它使用 2 种不同的字体,并且有一些斜体字。

如何永久更改 TeX (不是相反) 的字体,使其与使用的默认字体相匹配matplotlib?

我见过其他解决方案告诉用户通过使用 \mathrm{} 手动使绘图中的所有文本相同,但这是非常乏味的。我还看到了更改 matplotlib 的默认字体以匹配 TeX 的解决方案,这对我来说似乎完全倒退。

对于排版单位,使用 siunitx 包(带有 mode=text)而不是数学模式。

更新: 以上仅当你在你的rc设置中定义text.usetex : True时才有效。

来自matplotlib docs

Note that you do not need to have TeX installed, since matplotlib ships its own TeX expression parser, layout engine and fonts.

并且:

Regular text and mathtext can be interleaved within the same string. Mathtext can use the Computer Modern fonts (from (La)TeX), STIX fonts (with are designed to blend well with Times) or a Unicode font that you provide. The mathtext font can be selected with the customization variable mathtext.fontset

阅读本文,如果您不使用 TeX,听起来设置 mathtext.fontset 和 matplotlib 使用相同的常规字体可以解决问题。

事实证明解决方案相当简单,我的一位同事找到了解决方案。

如果我使用这行代码来创建标题:

fig.suptitle(r'$H_2$ Emission from GJ832')

结果将是“H2 Emission from GJ832”,这说明了我遇到的问题。然而,事实证明 $$ 内的任何内容都被转换为数学类型,因此分配了斜体。

如果我们将该行代码更改为以下内容:

fig.suptitle(r'H$_2$ Emission from GJ832')

那么结果是 "H2 Emission from GJ832" 没有斜体。所以这是一个例子,我们可以限制数学类型只包含文本的数学部分,即创建 2 的下标。

但是,如果我将代码更改为以下内容:

fig.suptitle(r'H$_{two}$ Emission from GJ832')

结果将是 "Htwo Emission from GJ832" 再次引入斜体。在这种情况下,以及在美元符号内必须有文本(或正在创建单位符号)的任何情况下,您可以通过以下方式轻松删除斜体:

fig.suptitle(r'H$_{\rm two}$ Emission from GJ832')

或者在创建交易品种的情况下:

ax2.set_xlabel(r'Wavelength ($\rm \AA$)')

前者的结果是 "Htwo Emission from GJ832"

后者在"Wavelength (A)" 其中 A 是埃符号。

通过在美元符号中的文本或符号之前调用 \rm,这两种方法都产生了预期的结果,没有任何斜体。结果没有斜体,包括由 \AA.

创建的埃符号

虽然这不会更改 TeX 格式的默认设置,但它是一个简单的问题解决方案,不需要任何新包。无论如何,谢谢 Roland Smith 的建议。我希望这可以帮助其他一直在为同一问题而苦苦挣扎的人。