我经常需要绘制一条穿过轴原点的水平线或垂直线,该线跨越绘图区域的整个宽度或高度。我不想使用axis lines=middle
,因为刻度标签会使绘图区域变得杂乱。到目前为止,我一直在使用类似的方法\addplot [black, no markers] coordinates (-5,0) (5,0);
来绘制水平线,但这种方法感觉不对,而且不太灵活:如果我更改轴范围,线条可能会太短,我必须明确设置xmin
和xmax
,否则线条会影响绘图限制。
添加一条穿过某个点(通常是轴原点)并跨越整个图高度/宽度的垂直线或水平线的正确方法是什么?
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=-6,xmax=6
]
\addplot {rand};
\addplot [red, no markers] coordinates {(-7,0) (7,0)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
pgfplots
将轴限制信息存储在xmin,ymin,xmax,xmin
键中(Jake 提醒说早期版本并非如此),我们可以通过\pgfkeysvalueof{}
命令访问这些键值。
这样做的好处是坐标会捕捉到原点的位置,更重要的是,如果原点在特定图中不可见,它不会干扰边界框。如果必须经常这样做,可以创建一个样式,将附加命令放入
after end axis/.append code={
\draw[ultra thin] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0) -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0);
\draw[ultra thin] (axis cs:0,\pgfkeysvalueof{/pgfplots/ymin}) -- (axis cs:0,\pgfkeysvalueof{/pgfplots/ymax});
}
当轴处理完成时,这会将这些命令添加到指令列表中。
该方法的缺点是它不适用于对数图。在这种情况下,您可以使用
\draw ({rel axis cs:0,0}|-{axis cs:0,0}) -- ({rel axis cs:1,0}|-{axis cs:0,0});
\draw ({rel axis cs:0,0}-|{axis cs:0,0}) -- ({rel axis cs:0,1}-|{axis cs:0,0});
画出线条。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot {rand};
\draw[ultra thin] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0) -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0);
\draw[ultra thin] (axis cs:0,\pgfkeysvalueof{/pgfplots/ymin}) -- (axis cs:0,\pgfkeysvalueof{/pgfplots/ymax});
\end{axis}
\end{tikzpicture}
\end{document}
答案2
我使用额外的滴答机制来实现这一点:
\begin{axis}
[
extra y ticks = 0,
extra y tick labels = ,
extra y tick style = { grid = major },
...
这样会生成一条相对“浅”的线条,且采用标准设置:在我的图中,适当的样式可以引导视线,但又不会太过沉重。我猜想,可以通过正确的样式选择使用类似的方法来创建彩色线条。
答案3
在轴内绘制一条线:
\addplot[color=red] coordinates {(-6,0) (6,0)};
答案4
另一种方法是在主情节后添加新情节:
\addplot [color=gray, dashed,line width=0.4pt]
table[row sep=crcr]{%
0.0 0\\\
1 0\\\
100 0\\\
};
根据您自己的数据选择 x 轴值。