Latex \ phantom没有在matplotlib中创建空格

时间:2015-05-03 21:30:31

标签: python matplotlib latex spacing

我有71个蜱需要放在一个图上(它是一个蛋白质的序列)所以蜱需要交错,有些用星号突出显示:

________________________________
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.rc('text', usetex=True)以便我可以向上移动星号(它们在轴上看得太远,除非我减少它们的\vspace

问题在于,交错不起作用,任何将空白放在标签顶部的尝试都会被LaTeX吃掉。这是最小的情况(使每个标签相同):

tickX = r'\noindent x\\\vspace{0.5cm}\\y\\ \vspace{-0.5cm}\\z'

这很好用,我得到了我想要的间距。但是,我只希望xy出现在情节中,所以我\phantom出了我不想要的那个:

tickX = r'\noindent \phantom{x}\\\vspace{0.5cm}\\y\\ \vspace{-0.5cm}\\z'

(在此示例中,tickX的列表已提供给ax.set_xticklabels。在实际代码中,每个刻度都不同。)

但是现在新线消失了,y出现在x s的位置!我找到了\vspace*{},但我也没有运气。我还尝试了\null\mbox{}

如果我放弃LaTeX并且只使用' \ny\nz',我会得到所需的行为,除了z显得太低而且我回到了我开始的地方。

所以,我的问题是:如何在LaTeX处理的刻度标签顶部插入一个空行?或者,等效地,如何在LaTeX中创建一个可以在文档开头单独占用一行的幻像字符?

1 个答案:

答案 0 :(得分:0)

好的,这是一个奇怪的。没有多少搜索导致matplotlib实际上在开头插入一个空格。所以,我在每个标签的顶部放了一个句号,因此:

________________________________
................................
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
*   *   * **   *       * *

并在每个句点后插入\vspace

def xTickString(index, sequence, decorations):
    ret = r"\noindent "
    if(index % 2 == 0): #Put the tick at the top...
        ret += r'.\\\vspace{29.1em}\\\makebox[0pt]{'
        ret += sequence[index]
        ret += r'}\\\vspace{0.2em}\\'
        ret += '\makebox[0pt]{\**}' if decorations[index] == '*' else ''
    else:
        ret += r'.\\\vspace{30em}\\\makebox[0pt]{'
        ret += sequence[index]
        ret += r'}\\ \vspace{-0.7em}\\'
        ret += '\makebox[0pt]{\**}' if decorations[index] == '*' else ''
    return ret 

当然使用`\ vspace {30em}时,时间段会出现在刻度线旁边,而实际标签会在页面外运行。因此,现在您在配置轴时相对于刻度线偏移了标签:

ax.tick_params(axis='x', pad=-494)

运行绘图顶部的句点并将标签放在正确的位置。

零宽度框使字母与标签中的星号保持一致,否则间距会变得不稳定。