我想使用 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 }
建议
- 标题设置在
axis descriptions
-layer 上, - 该图层实际上可以通过标题样式来设置。
但是,即使我将标题样式层设置为一些无意义的不存在的层,如下所示: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}