结合范围转移和 addplot 过滤器会产生意想不到的结果

结合范围转移和 addplot 过滤器会产生意想不到的结果

当我在轴环境中使用 shift TikZ 内容时,我得到了意外的结果\begin{scope}[shift=...]。请考虑以下示例。

\documentclass[]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \begin{scope}[shift={(1,1)}] % Using (1,1) shifts incorrectly, while using (2,2) shifts correctly, why?
      \draw[fill, gray!20] (0,0) rectangle (1,1);
    \end{scope}
    \addplot
    [
        x filter/.expression = {x+1},
        y filter/.expression = {y+1}
    ] 
    coordinates
    { 
    (0, 0)
    (1, 1)
    (1, 0)
    };
  \end{axis}

\end{tikzpicture}

\end{document}

这个问题是在 pgfplot 轴内移动 addplot 和 tikz 坐标

答案1

PGFPLOTS 的默认坐标系是axis cs。从PGFPLOTS 手册第353页:

结果axis cs始终是轴内的绝对位置。这意味着,具体来说添加两点产生了意想不到的效果:表达式(0,0) ++ (1,0)不一定与相同(1,0)。这种意外效果的背景是 pgfplots 应用了移位线性变换移动原点以支持其高精度和高数据范围(比较 disabledatascaling 的文档)。

为了表达相对的位置(或长度),您需要使用 axis direction cs

因此使用shift={(axis direction cs:1,1)}在此处输入图片描述

\documentclass[border=3mm]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \begin{scope}[shift={(axis direction cs:1,1)}] 
      \draw[fill, gray!20] (0,0) rectangle (1,1);
    \end{scope}
    \addplot
    [
        x filter/.expression = {x+1},
        y filter/.expression = {y+1}
    ] 
    coordinates
    { 
    (0, 0)
    (1, 1)
    (1, 0)
    };
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容