在顶部和轴之间填充导致标题位于网格线后面

在顶部和轴之间填充导致标题位于网格线后面

我想使用 fillbetween 库为两个图之间的区域着色。此外,我希望网格线位于图的顶部(即“轴在顶部”,就像 pgfplots 的区域样式一样;我不能使用区域样式,因为我的图不会延伸到零 :/)

无论如何,我已经设置好了一切,但现在情节标题(我将其向下移动)不知何故在后面情节的网格线(我不想要)。

好的,我想我已经清楚我想要什么了。下面是我简化的 NWME:

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\usepgfplotslibrary{fillbetween}

\pgfplotsset{
    compat = 1.16,
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis on top, % I want grid lines on top of the plot, but the title in front of the grid lines
    title = {XXXXXXXXXXXXXXXXXXXXX},
    grid = major,
    major grid style = {
        blue, line width = 5pt,
    },
    every axis title shift = {-10ex}, % shift title into plot area
]
\addplot[name path = A, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot[name path = B, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot fill between[of = A and B];
\end{axis}


\end{tikzpicture}
\end{document}

我尝试定义自己的图层,设置title style = { /pgfplots/on layer = },将网格图层设置为我定义的新图层,即最前景图层,但没有任何效果。

我认为标题没有设置为正确的层。pgfplots 手册第 4.27 章(第 410 页)title style = { /pgfplots/on layer = axis descriptions }建议

  1. 标题设置在axis descriptions-layer 上,
  2. 该图层实际上可以通过标题样式来设置。

但是,即使我将标题样式层设置为一些无意义的不存在的层,如下所示:title style = { /pgfplots/on layer = herebedragons },Latex 不会抱怨该层不存在,它通常会这样做;例如,如果我在中设置了那个无效的层major grid style

嗯。我的 Latex/PGF/…-Foo 已经用完了 :/ 我可能忽略了一些显而易见的东西。你们有什么想法吗,在使用时,我怎样才能将网格放在图的前面,将标题放在网格线的前面fill between(顺便说一下,没有 一切都能正常工作fill between)?

编辑:为了澄清我所期望的堆叠如下(从下到上,图层名称在括号中):

填充区域(“预主”)、绘图(“主”)、网格线(“轴网格”)、标题(“轴描述”)

我尝试声明自己的层并按照 pgfplots 手册第 4.27 章中的说明更改层堆栈。结果总是

  • 网格位于图的前面(期望的)和标题的前面(不想要的)或
  • 标题在网格前面(希望如此),但情节也在网格前面(不希望如此)

我希望这有助于更好地理解我的问题。

我有第二个示例,其中我在axis descriptions图层上手动设置了一个节点。在这种情况下,它设置在网格线上方(预期结果)。根据文档,标题也应该设置在图层上axis descriptions,但它不起作用 :'(

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\usepgfplotslibrary{fillbetween}

\pgfplotsset{
    compat = 1.16,
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis on top, % I want grid lines on top of the plot, but the title in front of the grid lines
    title = {XXXXXXXXXXXXXXXXXXXXX},
    grid = major,
    major grid style = {
        blue, line width = 5pt,
    },
    every axis title shift = {-10ex}, % shift title into plot area
]
\addplot[name path = A, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot[name path = B, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot fill between[of = A and B];
\begin{pgfonlayer}{axis descriptions}
      \node[anchor = north] at (axis description cs: 0.5,0.7) {FAKE TITLE ABOVE GRID};
\end{pgfonlayer}

\end{axis}


\end{tikzpicture}
\end{document}

为了好玩和刺激,我还在情节中添加了以下一行:

title style = {/pgfplots/on layer = {thislayerdoesnotexist}},

PGF 抱怨不存在的层,但在本例中,它没有抱怨。这让我相信标题样式中的层集被 pgfplots 忽略了,因此这就是 @marmot 的答案也不起作用的原因。

答案1

好吧,你改变了你的问题(并且做了一些我认为不合适的陈述)。然而,标题也确实不受层的影响,这可以通过查找在中添加标题的代码来验证pgfplots.code.tex。它由以下公式给出:

\long\def\pgfplots@show@title#1{%
    \node%
            [/pgfplots/every axis title]
            {#1};
}

如您所见,它没有设置任何层。您可以按如下方式修复此问题。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}

\usepgfplotslibrary{fillbetween}

\pgfplotsset{
    compat = 1.16,
}
\makeatletter
\long\def\pgfplots@show@title#1{%
\begin{pgfonlayer}{axis foreground}
        \node%
                [/pgfplots/every axis title]
                {#1};
\end{pgfonlayer}
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis on top, % I want grid lines on top of the plot, but the title in front of the grid lines
    title = {XXXXXXXXXXXXXXXXXXXXX},
    grid = major,
    major grid style = {
        blue, line width = 5pt,
    },
    every axis title shift = {-10ex}, % shift title into plot area
]
\addplot[name path = A, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot[name path = B, line width = 5pt, color=red] table {
        x y 
        1 1 
        2 2
        3 3
    };
\addplot fill between[of = A and B];
\begin{pgfonlayer}{axis descriptions}
      \node[anchor = north] at (axis description cs: 0.5,0.7) {FAKE TITLE ABOVE GRID};
\end{pgfonlayer}

\end{axis}


\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容