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

时间:2016-05-25 21:55:47

标签: python matplotlib tex

我已经看到这个问题在这里和那里出现,但还没有找到合适的答案。

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

光子/平方公分/秒/埃

我必须做以下事情:

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

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

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

我已经看到其他解决方案告诉用户通过使用\ mathrm {}手动使图中的所有文本相同,但这是非常繁琐的。我也看到了改变matplotlib默认字体的解决方案,以匹配TeX,这似乎完全倒退了。

2 个答案:

答案 0 :(得分:0)

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

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

来自matplotlib docs

  

请注意,您不需要安装TeX,因为matplotlib附带了自己的TeX表达式解析器,布局引擎和字体。

  

常规文本和mathtext可以在同一个字符串中交错。 Mathtext可以使用计算机现代字体(来自(La)TeX),STIX字体(设计为与Times完美融合)或您提供的Unicode字体。可以使用自定义变量mathtext.fontset

选择mathtext字体

读到这一点,听起来设置mathtext.fontset和matplotlib使用相同的常规字体可以解决问题,如果你不使用TeX。

答案 1 :(得分:0)

事实证明解决方案相当简单,我的同事有解决方案。

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

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

结果将是“ H 2 来自GJ832的发射”,这是我所遇到的问题的一个例子。但是,事实证明,$$内部的任何内容都转换为数学类型,因此指定了斜体。

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

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

然后结果是“没有斜体的来自GJ832的H 2 发射”。所以这是一个例子,我们可以将数学类型约束为仅包含文本的数学部分,即创建2的下标。

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

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

结果将是“H 两个 GJ832的排放”,它再次引入斜体。在这种情况下,对于您必须在美元符号中包含文本(或创建单位符号)的任何情况,您可以通过以下方式轻松删除斜体:

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

或在创建符号的情况下:

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

前者导致“来自GJ832的H 2 排放”

和后者的“波长(A)” 其中A是Angstrom符号。

通过在美元符号中的文本或符号之前调用\ rm,这两个都产生了所需的结果,没有任何斜体。结果没有任何斜体,包括由\ AA创建的Angstrom符号。

虽然这不会改变TeX格式的默认值,但它是解决问题的简单方法,不需要任何新包。无论如何,谢谢罗兰史密斯的建议。我希望这能帮助那些一直在努力解决同一问题的人。