【问题标题】:What's the benefit of text.usetex : True in matplotlibtext.usetex 有什么好处:在 matplotlib 中为真
【发布时间】:2014-02-16 05:30:10
【问题描述】:

我打算写一篇论文,并开始设置一个标准的 Matplotlib 文件来控制绘图格式。但是,text.usetex : True 选项有问题。特别是,当我的所有图形都应该是无衬线字体时,刻度标签默认为衬线字体,这很烦人。确实 - 我在 rcParams 文件中将 font.family 设置为 sans-serif,但仍然看到问题,如 github here 中所述。

此外,当我打开或关闭 usetex 时,其他文本看起来会有所不同 - 这似乎令人惊讶,因为我告诉 matplotlib 每次都使用相同的字体。

因此,我想知道使用 LaTeX 渲染的实际好处是什么?由于 Matplotlib 已经可以处理 xlabel('\alpha') 等标签中的 LaTeX 命令,并且可以接受用户输入到 rcparams 文件中使用的字体,那么在文本上使用 LaTeX 有什么不同呢?

为了实现一致的无衬线字体的目标,我可以不只是将 matplotlib rcparams 文件中的 font.sans-serif 设置为我在 LaTeX 中设置为无衬线字体的字体吗?

感谢您的任何建议或提示!

【问题讨论】:

    标签: python matplotlib latex


    【解决方案1】:

    usetex 设置在您需要 matplotlib 的内置数学文本中不存在的 LaTeX 功能时特别有用。但它也提供了更好的排版,您不必担心数学文本中的非标准部分。

    如果您比较下面的两个示例(基于this page 末尾的示例),您会发现 LaTeX 版本在数学方面做得更好,尤其是求和。此外,mathtext 不知道 \displaystyle,但会自动使用这种布局样式,这在某些情况下可能是不可取的。

    就您对刻度标签字体的问题而言,我相信 matplotlib 正在使用默认的 LaTeX 数学字体作为标签。如果您尝试按照我在第二个示例中注释掉的代码行做一些事情,您应该能够得到您想要的。

    如果你只是制作相对简单的情节,你应该看看tikzplotlib。它允许您以tikz 格式保存图形,以便轻松调整大小。有关详细信息,请参阅我对this 问题的回答。


    数学文本版本

    import numpy as np
    import matplotlib.pyplot as plt
    
    t = np.arange(0.0, 2.0, 0.01)
    s = np.sin(2*np.pi*t)
    
    plt.plot(t,s)
    plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
    plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
    plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
             fontsize=20)
    plt.xlabel('time (s)')
    plt.ylabel('volts (mV)')
    plt.savefig('fig_mathtext.pdf')
    

    LaTeX 版本

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import rc
    rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
    rc('text', usetex=True)
    #rc('text.latex', preamble=r'\usepackage[eulergreek]{sansmath}\sansmath')
    
    t = np.arange(0.0, 2.0, 0.01)
    s = np.sin(2*np.pi*t)
    
    figure()
    
    plt.plot(t,s)
    plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
    plt.text(1, -0.6, r'$\displaystyle\sum_{i=0}^\infty x_i$', fontsize=20)
    plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
             fontsize=20)
    plt.xlabel('time (s)')
    plt.ylabel('volts (mV)')
    plt.savefig('fig_latex.pdf')
    

    【讨论】:

      【解决方案2】:

      使用 usetex 的好处包括排版 matplotlib 的内置引擎不支持的复杂公式,以及使用(官方不支持的)text.latex.preamble 设置包含任意序言的能力。如果您将 matplotlib 图形嵌入到 LaTeX 文档中并希望完全匹配字体,则后者可能很有用,例如因为日记样式表。但对于大多数用途,我会推荐内置的 mathtext 渲染器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-15
        • 2010-12-11
        • 2021-08-14
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        相关资源
        最近更新 更多