我想允许轴自动缩放(所以不想设置axis equal=true
),并且能够在线上手动选择的点上放置标签。当然,如果是axis equal=true
,那么我只需将节点旋转 45 度,一切就都正常了。由于我手动指定了 x 轴和 y 轴的长度,我尝试使用arctan(\YAxisMax/\XAxisMax)
,但这并不完全正确。我需要的是应用于每个轴的比例因子的比率。
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\newcommand*{\XAxisMin}{-7.0}
\newcommand*{\XAxisMax}{7.0}
\newcommand*{\YAxisMin}{-2.0}
\newcommand*{\YAxisMax}{2.0}
% Determine angle of rotation
\pgfmathsetmacro{\Angle}{atan(\YAxisMax/\XAxisMax)}%
\begin{axis}[
axis y line=center, %axis equal=true,
axis x line=middle,
axis on top=true,
xmin=\XAxisMin,
xmax=\XAxisMax,
ymin=\YAxisMin,
ymax=\YAxisMax,
]
addplot[mark=none, domain=\XAxisMin:\XAxisMax, red, thick] ({x},{x});%
% This works fine if axis equal=true above is uncommented.
addplot [mark=none] coordinates{(-1,-1)} node [green, above, rotate=45] {$k=0$};%
\addplot [mark=none] coordinates{(1,1)} node [blue, above, rotate=\Angle] {$k=0$};%
\end{axis}
\end{tikzpicture}
\end{document}
以下是产生的输出:
我以为我找到了解决方案这里因此尝试了这个,但也没有用:
\makeatletter
\pgfpointxy{1}{1}%
\pgfmathsetmacro{\Angle}{atan(\pgf@y/\pgf@x)}%
\makeatother
答案1
node [pos=<value>] {...}
从 1.5.1 版开始,您可以通过向命令中添加选项将节点放置在绘图上\addplot
。如果您sloped
向节点选项添加选项,则节点将旋转以匹配绘图:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis y line=center,
axis x line=middle,
axis on top=true,
xmin=-7,
xmax=7,
ymin=-4,
ymax=4
]
\addplot[
mark=none,
domain=-4:6,
samples=80,
red,
thick
] {(x<-2)*-2 + (!(x<-2) && (x<3))*x + (!(x<3)) * 3}
node [pos=0.0, above, sloped] {$f(x)=-2$}
node [pos=0.6, above, sloped, blue] {$f(x)=x$}
node [pos=0.9, above, sloped, green!70!black] {$f(x)=3$}
;%
\end{axis}
\end{tikzpicture}
\end{document}
对于旧版本,一种可能性是使用装饰来放置节点。该decorations.markings
库允许您将(正确旋转的)节点放置在路径上的某个位置。要在 中使用该库\addplot
,您必须通过every path/.style
,这会导致将装饰应用于其自身时出现问题。值得庆幸的是,这个问题已经解决了:对 TikZ 中的每个路径应用后动作。
此外,PGFplots 似乎在使用装饰中的 TikZ 节点时存在问题。可以使用 来避免此问题\pgfnode
,它的作用与 完全相同\node
,但看起来有点不寻常。
下面是一个例子plotlabel
(基于 Altermundus 的想法如何使用 \draw plot 标记使用 tikz 绘制的路径?,并针对所述问题进行了调整)。您可以使用 指定标签plotlabel={<rel pos along path>}{<label text>}
。要更改标签的颜色,可以使用\color{<color name>}<label text>
。plotlabel
可以多次使用该选项,以向同一张图添加不同的标签。
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings}
\makeatletter
\tikzset{
nomorepostaction/.code={\let\tikz@postactions\pgfutil@empty},
plotlabel/.style 2 args={
every path/.append style={
postaction={
nomorepostaction,
decorate,
decoration={
markings,
mark=at position #1 with {
\pgfnode{rectangle}{south}{#2}{}{}
}
}
}
}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis y line=center,
axis x line=middle,
axis on top=true,
xmin=-7,
xmax=7,
ymin=-4,
ymax=4
]
\addplot[
mark=none,
domain=-4:6,
samples=80,
red,
thick,
plotlabel={0.0}{\color{purple}$f(x)=-2$},
plotlabel={0.6}{\color{blue}$f(x)=x$},
plotlabel={0.9}{\color{green!70!black}$f(x)=3$}
] {(x<-2)*-2 + (!(x<-2) && (x<3))*x + (!(x<3)) * 3};%
\end{axis}
\end{tikzpicture}
\end{document}
回答原始问题:您可以使用 Martin Scharrer 的方法来确定 PGFplots 中直线的斜率,但只能在轴完成后才能使用(否则单位向量尚未定义)——您无法在启动轴之前计算斜率。因此,您必须将计算包含\Angle
在命令中\pgfplotsextra
,该命令将在绘图结束时执行。然后必须使用\node
s 放置标签,使用 定位(axis cs:x,y)
,而不是使用\addplot
命令:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\newcommand*{\XAxisMin}{-7.0}
\newcommand*{\XAxisMax}{7.0}
\newcommand*{\YAxisMin}{-2.0}
\newcommand*{\YAxisMax}{2.0}
\begin{axis}[
axis y line=center, %axis equal=true,
axis x line=middle,
axis on top=true,
xmin=\XAxisMin,
xmax=\XAxisMax,
ymin=\YAxisMin,
ymax=\YAxisMax,
]
addplot[mark=none, domain=\XAxisMin:\XAxisMax, red, thick] ({x},{x});%
\makeatletter
\pgfplotsextra{
\pgfpointxy{1}{1}%
\pgfmathsetmacro{\Angle}{atan(\pgf@y/\pgf@x)}%
\node at (axis cs:-1,-1) [green, above, rotate=\Angle] {$k=0$};
}
\makeatother
\end{axis}
\end{tikzpicture}
\end{document}