坐标变换:PGFPlots 与 PGF 之间的转换

坐标变换:PGFPlots 与 PGF 之间的转换

如何将计算的长度缩放到适当的轴比例?在此示例中,我期望2

见下文。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}
    \begin{axis}

    % Random plot
    \addplot {x};

    \coordinate (point1) at (axis cs:0,0);
    \coordinate (point2) at (axis cs:2,-4);

    \draw[red] (point1) -- (point2);

    \draw[black]
    let
    \p1 = (point1),
    \p2 = (point2),
    \n1={abs(\x{2}-\x{1})}
    in
    node at (axis cs:-2,4) {some x distance=\n1};    

    \end{axis}
\end{tikzpicture}   
\end{document}

图片

\pgfplotsunitxlength我尝试使用(在此示例中为)重新缩放长度0.4,但这似乎不是正确的转换。

答案1

这里有两个不同的变换:一个是 PGF 的单位向量长度(表示为\pgfplotsunitxlength)。另一个是仿射线性映射,它将输入坐标重新调整到 PGF 的范围内(即 -16384 到 16384 的范围)。

第二个正在打你这里。

处理它们基本上有两种方法:第一种方法是简单地添加disabledatascaling到轴上。顾名思义,这是第二张地图的转折点,您的方法\pgfplotsunitxlength是正确的。第二种方法是@John 的底部评论:手动计算缩放偏移量(我的意思是他的\unitx变量)。

我建议使用有disabledatascaling两个原因:

  1. 它相对简单
  2. 另一个解决方案听起来似乎更通用,但不幸的是,它遇到了意想不到的问题:一旦你真的有一个巨大的数据范围(1e4例如,用 缩放所有内容),它就会崩溃。PGF 数学解析器根本无法处理超出此范围的任何内容。

例子变成

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}

    \begin{axis}[
        disabledatascaling,
    ]


    % Random plot
    \addplot {x};

    \coordinate (point1) at (axis cs:0,0);
    \coordinate (point2) at (axis cs:2,-4);

    \draw[red] (point1) -- (point2);

    \draw[black]
    let
    \p1 = (point1),
    \p2 = (point2),
    \n1={abs(\x{2}-\x{1})/\pgfplotsunitxlength}
    in
    node at (axis cs:-2,4) {some x distance=\n1};    


    \end{axis}

\end{tikzpicture}   
\end{document}

在此处输入图片描述

使用的影响disabledatascaling是,您的数据范围被限制在 -16384 .. +16384 范围内的数字,并且它们不能小于 0.001。此外,一旦数字变小(例如:小于 0.01),算术精度就会迅速下降。根据经验,disabledatascaling如果您的数字是“小自然数”,您可以放心使用。一旦您的数字很大或非常小,解决方案就不够了。

您真正需要的是一种将 TikZ/PGF 坐标转换回原始 pgfplots 点并对其进行一些算术运算的通用方法(使用高级数字范围,如 PGF 的浮点单元)。Pgfplots 目前没有用于此逆变换的公共 API(它将涉及的逆transformdirectionx)。反过来,这将是 pgfplots 的功能请求。

答案2

它看上去偏离了 100 倍。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\begin{document}

\newlength{\dist}

\begin{tikzpicture}

    \begin{axis}


    % Random plot
    \addplot {x};

    \coordinate (point1) at (axis cs:0,0);
    \coordinate (point2) at (axis cs:2,-4);

    \draw[red] (point1) -- (point2);

    \pgfplotsextra{
      \pgfextractx{\dist}{\pgfpointdiff{\pgfpointanchor{point1}{center}}{\pgfpointanchor{point2}{center}}}
      \pgfmathparse{0.01\dist/\pgfplotsunitxlength}
      \global\let\text=\pgfmathresult
    }
    \end{axis}
   \node[above right] {\text};

\end{tikzpicture}   
\end{document}

我一直直接计算值:

\newlength{\unitx}

\pgfplotsextra{% delay until \end{axis}
  \pgfextractx{\unitx}{\pgfpointdiff{\pgfplotspointaxisxy{0}{0}}{\pgfplotspointaxisxy{1}{1}}}
  \global\unitx=\unitx
}

答案3

随着 PGFPlots v1.16 的发布,现在可以将 (轴) 坐标存储\pgfplotspointgetcoordinates在 中data point,然后可以通过\pgfkeysvalueof或调用\pgfkeysgetvalue。这样就可以添加您想要的标签。

有关详细信息,请查看代码中的注释。

% PGFPlots v1.16
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
    \begin{axis}

        % Random plot
        \addplot {x};

        \coordinate (point1) at (axis cs:0,0);
        \coordinate (point2) at (axis cs:2,-4);

        \draw [red] (point1) -- (point2);

        \node [align=left,anchor=north west] at (axis cs:-6,4) {
            the $x$ distance \\ (in axis coordinates) is
            % -----------------------------------------------------------------
            % using `\pgfplotspointgetcoordinates' stores the (axis)
            % coordinates in `data point' which then can be called by
            % `\pgfkeysvalueof'
                \pgfplotspointgetcoordinates{(point1)}
                    \pgfkeysgetvalue{/data point/x}{\xOne}%
                \pgfplotspointgetcoordinates{(point2)}
                    \pgfkeysgetvalue{/data point/x}{\xTwo}%
                \pgfmathparse{\xTwo-\xOne}
                $\pgfmathprintnumber{\pgfmathresult}$
            % -----------------------------------------------------------------
        };

    \end{axis}
\end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容