【问题标题】:Offset a character in matplotlib captions在 matplotlib 字幕中偏移一个字符
【发布时间】:2015-04-28 18:32:55
【问题描述】:

朋友们,

我有一个带有 70 个刻度的绘图轴,代表一个蛋白质序列。由于我无法在一行中放置那么多字母并使它们清晰易读,因此我必须错开它们,因此:

________________________________
P o A i I A o g e u n e f e t r
 l t x s s L n S q e c O L t e s

(实际图中字母之间的间距要小得多,如果在一行上,它们完全重叠。)

我想用星号之类的来强调其中的某些:

________________________________
P o A i I A o g e u n e f e t r
 l t x s s L n S q e c O L t e s
*   *   * **   *       * *

但是当我在 Matplotlib 中使用简单的换行符渲染它时,星号比它们需要的要低得多:

xLabels = [
        ['', '\n'][i%2]
        +sequence[i] 
        +['\n', ''][i%2] 
        +'\n' 
        +decorations[i]  
    for i in range(len(sequence))]

我知道 matplotlib 在其标签中支持 TeX,并且我知道我可以在 LaTex 中使用 \vspace{-1em} 或其他东西,但我就是无法让 matplotlib 服从我。它不断抛出解析错误,就像这样:

File "/usr/lib64/python3.3/site-packages/matplotlib/mathtext.py", line 2345, in parse
  str(err)]))
ValueError: 
$ $
^
Expected end of text (at char 0), (line:1, col:1)

(这是我尝试将装饰置于 TeX 数学模式,希望添加上标。一个可能的复杂情况是许多装饰都是 ' '。)

因此,我的问题是:有没有办法告诉 matplotlib 的文本渲染器将字符移动到换行符的一小部分?这需要简单地自动化,因为整个程序将生成近四十个图形,每个图形都有可能不同的装饰。

【问题讨论】:

  • 我将开始使用 ax.text 函数:“将字符串 s 中的文本添加到坐标轴位置 xy、数据坐标。”由于它位于数据坐标中,因此获得正确的 x 轴位置并不难(重复使用刻度位置)。将字体大小转换为 y 高度会很不错,但我敢打赌,您可以在没有太多麻烦的情况下到达那里。

标签: python matplotlib latex axis-labels tex


【解决方案1】:

...有没有办法告诉 matplotlib 的文本渲染器将字符向上移动一小部分换行符?

我认为你在正确的轨道上。您可以通过您提到的以下 Latex 命令更改 matplotlib 中的垂直间距;但是,我认为您将希望使用 xticksxlabel 来满足您的多行条件。另外,请记住 tex 中的换行符是 \\,而不是 \n

import numpy as np
x = np.arange(0, 5, 0.1);
y = np.sin(x)
plt.plot(x, y)
plt.ylim(plt.ylim()[::-1])
plt.xlabel(r"first line \\ \vspace{0.5cm}small space \\ \vspace{2cm}{more space}",fontsize=22)
plt.show() 

另外,请参阅Text rendering With LaTeX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    相关资源
    最近更新 更多