期望的结果
我正在尝试创建一个绘图,其中下部 x 轴上有xticks
和,上部 x 轴上有 。期望的结果 (几乎) 是这样的:xtick labels
extra x tick
平均能量损失
\documentclass[margin=2mm,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
extra x ticks={-0.0012},
extra x tick labels={IMPORTANT},
extra x tick style={
grid=major,
tick label style={
rotate=90,
anchor=west,
},
tick pos = right,
ticklabel pos = right,
},
width=120mm,
height=80mm,
xlabel=Time,
ylabel=Amplitude,
]
\addplot+[
ycomb,
domain=-3e-3:3e-3,
samples=11,
every mark/.style={fill=white},
]
{exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\end{axis}
\end{tikzpicture}
\end{document}
不幸的是,这导致 x 轴和其标签之间出现了一个难看的间隙(时间),如下所示:
我设法找到了一种解决方法,通过手动定位 x 轴标签并添加以下代码来获得所需的结果:
xlabel style={at={(0.5,-2ex)}},
这导致了我发布的第一张图片。然而,这对我来说似乎相当不雅。首先,我还没有找到默认的垂直偏移量应该是多少,以便通过这种方法创建的图的 x 轴标签的垂直偏移量与所有其他图相同,而无需手动干预(以便所有图在这方面看起来相同),其次,手动执行此操作似乎……是错误的(是的,我知道,听起来有点傻)。
实际问题
所以,我的问题可以归结为以下两点:
- 有没有办法避免这种额外的垂直间隙并自动
pgfplots
做“正确”的事情,或者 - 如果我必须手动执行此操作,那么正确的(默认)垂直偏移量是多少,以便自动放置轴标签的图和手动放置的图的轴标签位于同一位置(我认为这是有记录的某处,但我在搜索中还没有偶然发现它)?
显然,对第一个问题给出适当的解决方案会更好。
我已经搜索过pgfplots
、等的各种排列,但到目前为止还没有找到gap
。axis label
答案1
到目前为止,我想不出 100% 自动的解决方案。“问题”在于, 的位置xlabel
也考虑到了extra x ticks
。不幸的是,它没有考虑到样式修改ticklabel pos=right
,所以我们必须以某种方式撤消它。
我使用了TikZ 的width
和height
函数来相应地移动标签,但当然必须为上述函数提供一些值,这是此解决方案的“非 100% 自动”部分。当然,在多个情况下,extra x ticks
您必须为函数提供最宽的文本width
才能使其工作。
为了证明这能得到所需的结果,我将此解决方案与另一个解决方案重叠,并extra x tick labels
通过另一种方法添加了。如您所见,这两个解决方案之间只剩下很小的偏移,我认为这是可以接受的。
% used PGFPlots v1.14
\documentclass[margin=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
extra x ticks={-0.0012},
extra x tick labels={IMPORTANT},
extra x tick style={
grid=major,
tick label style={
rotate=90,
anchor=west,
},
tick pos=right,
ticklabel pos=right,
},
width=120mm,
height=80mm,
xlabel=Time,
ylabel=Amplitude,
% Because also the `extra x ticks' are taken into account for the
% position of the `xlabel' (but not the fact that
% `ticklabel pos=right' is used) this has to be "undone". To do so
% we can use the `width' and `height' functions ...
xlabel style={
yshift = {width("IMPORTANT") - height("0") },
},
]
\addplot+[
ycomb,
domain=-3e-3:3e-3,
samples=11,
every mark/.style={fill=white},
] {exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\end{axis}
% -------------------------------------------------------------------------
% for debugging purposes only
% ---------------------------------
% here I produce the desired result with a different approach to "know" where
% the `xlabel' would be placed without the `extra x ticks'.
\begin{axis}[
extra x ticks={-0.0012},
extra x tick labels={},
extra x tick style={
grid=major,
},
width=120mm,
height=80mm,
xlabel=Time,
ylabel=Amplitude,
xlabel style={
red,
},
clip mode=individual,
]
\addplot+[
ycomb,
domain=-3e-3:3e-3,
samples=11,
every mark/.style={fill=white},
] {exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
\node [rotate=90,anchor=west] at ( {axis description cs:0,1} -| -0.0012,0 ) {IMPORTANT};
\end{axis}
% -------------------------------------------------------------------------
\end{tikzpicture}
\end{document}