【问题标题】:Upright mu in plot label: retaining original tick fonts绘图标签中的竖立 mu:保留原始刻度字体
【发布时间】:2014-04-16 10:11:03
【问题描述】:

我有一个我认为会发生的问题。但是,在互联网上搜索了一段时间后,我一直无法找到解决问题的方法。就这样吧:

对于使用 matplotlib.pyplot 创建的绘图,我想将 SI 单位千分尺合并到我的 xlabel 中。然而,单位微米需要是直立的。经过一番摆弄,我实现了所需的 xlabel。

我必须生成的代码是:

import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
params = {'text.latex.preamble': [r'\usepackage{siunitx}', r'\usepackage{cmbright}']}
plt.rcParams.update(params)


fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.set_xlabel('$\si{\micro \meter}$', fontsize = 16)
ax.set_ylabel("hi", fontsize = 16)

plt.savefig("test.png")

结果如下图: 千分尺正是我想要的。然而问题是 x 和 y 刻度的字体被改变了。这是因为:

matplotlib.rc('text', usetex = True)

如何将字体值重置为其原始值?或者我如何确保在引入 tex 时字体不会改变?

作为参考,我所指的原始值如下所示: 除了尝试将字体恢复为原始值之外,我还尝试了将千分尺合并到我的 xlabel 中的不同方法。这里出现的问题是它仍然是斜体或者它有一个粗体设置。我正在寻找的千分尺是第一个图中给出的那个。

希望有人能帮我解决这个问题。

提前感谢

【问题讨论】:

    标签: python fonts matplotlib tex rc


    【解决方案1】:

    对我有用的不是usetex,而是使用Unicode:

    ax.set_xlabel(u'\u03bc')
    

    将标签设置为单个竖直mu

    这需要在加载matplotlib时进行以下设置:

    import matplotlib
    matplotlib.rcParams['mathtext.fontset'] = 'cm'
    matplotlib.rc('font', family='serif', serif='CMU Serif')
    import matplotlib.pyplot as plt
    

    这里我使用的是 Sourceforge 的“Computer Modern Unicode”字体(如果您想与在 LaTeX 中编写排版及其默认的 Computer Modern 字体保持一致,强烈推荐)。

    但是任何带有 mu 字形的 unicode 字体都可以使用。实际上,CMU Serif 的 mu 不如 SIunitx 的 mu 美观,但它是正确的。

    需要重启 Python 才能生效。

    【讨论】:

      【解决方案2】:

      我也在努力解决这样的问题,即当 text.usetex = True 时,让刻度标签和轴标签保持一致。我设法找到的解决方案并不理想,但它目前有效。

      您需要做的是将字体系列设置为“sans-serif”,并添加一个使用 sans-serif 数学字体的乳胶包(sfmath -- 确保它在您的 tex 路径中!)

      import matplotlib
      import matplotlib.pyplot as plt
      
      matplotlib.rc('text', usetex = True)
      matplotlib.rc('font', **{'family':"sans-serif"})
      params = {'text.latex.preamble': [r'\usepackage{siunitx}', 
          r'\usepackage{sfmath}', r'\sisetup{detect-family = true}',
          r'\usepackage{amsmath}']}   
      plt.rcParams.update(params)   
      
      fig = plt.figure(figsize = (4,4))
      ax = fig.add_subplot(1,1,1)
      ax.set_xlabel('$\si{\um} detection$')
      ax.set_ylabel(r"$\mu \boldsymbol{\mu}$")
      plt.show()                              
      

      此外,我必须告诉 siunitx 包来检测字体系列,并且我还必须在 x-label 中添加一些额外的文本才能真正进行检测(您可以稍后删除此文本,然后之后标签仍然有效)。

      对我来说,这会导致: 更一般地说,我有以下我的 ~/.matplotlib/matploblibrc 文件,用于衬线字体:

      font.family    : serif 
      text.latex.preamble    :   \usepackage{mathptmx}
      

      对于无衬线字体:

      font.family : sans-serif 
      text.latex.preamble :   \usepackage{sfmath}
      

      【讨论】:

      • 非常感谢。仍在寻找“正确”的标签,但现在肯定会这样做。再次感谢!
      • “正确”是指示例中的无衬线字体吗?我不知道为什么,但是当我运行您的示例时(重置所有 matplotlibrc 设置),我得到了千分尺标签的衬线字体(使用衬线设置时不会改变)。但是既然你似乎可以自动获得无衬线,如果你使用我建议的无衬线设置会发生什么?
      • 我设法让它与 sans-serif 一起使用,请参阅我对帖子的编辑!
      • 谢谢!这让我离想要的结果又近了一步! mu现在完美了!我所说的“正确”是用于“1.0”的字体系列,当使用 usetex = True 时会发生变化。
      • 嗨,我现在想使用amsmath 包。当我结合sfmath 执行此操作时,amsmath 没有响应。当我删除sfmath 包时,轴的刻度很难看,因为我猜它不再是sans-serif。结合amsmath 包,有什么想法可以让你的答案看起来像蜱虫吗?
      【解决方案3】:

      我遇到了同样的问题,这解决了它:

      在你的 ma​​tplotlibrc 文件更改

      mathtext.default : it
      

      mathtext.default : regular
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 2012-01-21
        • 2023-02-05
        • 1970-01-01
        相关资源
        最近更新 更多