如何确定 PGF 图中直线的斜率(轴自动缩放)

如何确定 PGF 图中直线的斜率(轴自动缩放)

我想允许轴自动缩放(所以不想设置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}

以下是产生的输出:

pgfplots 中的标签旋转不正确

我以为我找到了解决方案这里因此尝试了这个,但也没有用:

\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,该命令将在绘图结束时执行。然后必须使用\nodes 放置标签,使用 定位(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}

相关内容