如何与 TikZ 和 Pgfplots 保持一致性?

如何与 TikZ 和 Pgfplots 保持一致性?

我想保持 TikZ 和 PGFplots 之间的一致性,但遇到了很多困难。以下是其中两个示例:

  1. 我希望能够\coordinate在 PGF 中使用类似于 TikZ 的东西。因此,理想情况下,我希望注释掉第二张图中的行并将其替换为未注释的行。即,能够使用定义的坐标,而不必输入特定坐标。

  2. 我希望两个圆的大小相同,而与我如何绘制图表无关。在第二个示例中,我将 乘以\Radius20,但圆点的大小仍然相差甚远。

也许有更好的方法可以做到这一点,但我对这些还很陌生......

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}

\def\Radius{0.1}
\def\Label{$(1,1)$}

\begin{document}
\begin{tikzpicture}
    \coordinate (Point) at (1,1);

    \draw [gray] (0,0) grid (3,3);
    \draw [blue,fill] (Point) circle (\Radius) node [right] {\Label};
\end{tikzpicture}


\begin{tikzpicture}
    \coordinate (Point) at (1,1);

    \begin{axis}[xmin=0,xmax=3, ymin=0,ymax=3] 
        \addplot  [blue,fill] coordinates{ (1,1) } 
            circle (20*\Radius) node [right] {\Label};

        % would prefer to use this instead:
        %\addplot  [blue,fill] coordinates{ (Point) } 
        %   circle (20*\Radius) node [right] {\Label};
    \end{axis}
\end{tikzpicture}
\end{document}

答案1

引用节点的原始无量纲坐标很困难,因为只保存了带单位的绝对坐标。为了获得无量纲值,需要将点的绝对坐标除以单位向量的绝对长度。

由于应用了变换,这些单位向量可以在不同范围内(例如轴内)发生变化。因此,我们需要在创建原始节点时保存单位向量。

以下代码执行两项操作:它向样式附加一个选项,以便在用户每次调用时every coordinate node创建一个额外的选项;并且它提供了一个宏,通过创建同名的新坐标将这样的坐标/单位向量对“导入”到轴环境中。\coordinate (Unit <node name>) at (1,1)\coordinate (<node name>) at (<x>,<y>)

有很多缺点:原始节点将被覆盖;以完整节点的形式保存两个值(单位向量)是浪费的,特别是因为如果您用相同的单位向量定义大量坐标,这将创建许多不必要的节点;由于坐标系,\importcoordinate宏仅在 pgfplots 轴内有效。axis cs

\documentclass{article}
\usepackage{pgfplots}

\def\Radius{2pt}
\def\Label{$(1,2)$}

\begin{document}

\newcommand{\importcoordinate}[1]{
  \pgfpointanchor{Unit #1}{center}
  \pgfgetlastxy{\xunit}{\yunit}
  \pgfpointanchor{#1}{center}
  \pgfgetlastxy{\xpoint}{\ypoint}
  \pgfmathsetmacro\x{\xpoint/\xunit}
  \pgfmathsetmacro\y{\ypoint/\yunit}
  \coordinate (#1) at (axis cs:\x,\y);
}

\begin{tikzpicture}[every coordinate node/.append style={
      append after command={node (Unit \tikzlastnode) at (1,1) {}}}
    ]

    \draw [gray] (0,0) grid (3,3);
    \coordinate (Point) at (1,2);
    \draw [blue,fill] (Point) circle (\Radius) node [right] {\Label};
\end{tikzpicture}


\begin{tikzpicture}
    \begin{axis}[xmin=0,xmax=3, ymin=0,ymax=3,grid=both] 
    \importcoordinate{Point}
    \draw [blue,fill] (Point) circle (\Radius) node [right] {\Label};
    \end{axis}
\end{tikzpicture}
\end{document}

正常 tikzpicture 中的点和轴中的点

答案2

我相信您可能想要将 pgfplots 轴的单位向量明确设置为与 TikZ 使用的相同的值。

但是,为了匹配 pgfplots 坐标处理和 tikz 坐标处理,需要设置几个键:


\documentclass{article}
\usepackage{pgfplots}

\def\Radius{2pt} \def\Label{$(1,2)$}

\begin{document} \thispagestyle{empty} \begin{tikzpicture} \coordinate (Point) at (1,2);

\draw [gray] (-1,-1) grid (3,3);
\draw [blue,fill] (Point) circle (\Radius) node [right] {\Label};

\end{tikzpicture}

\begin{tikzpicture} \coordinate (Point) at (1,2);

\begin{axis}[
    anchor=origin,      % tells pgfplots to "grab" the axis at its internal (0,0) coord
    disabledatascaling, % tells pgfplots to use the "natural" dimensions
    at={(0pt,0pt)},     % tells pgfplots to place its anchor (see above) at (0,0) (This is actually the default and can be omitted).
    %
    x=1cm,y=1cm,        % tells pgfplots to use the same unit vectors as tikz.
    %
    % this is just as usual in pgfplots. I guess it is only useful
    % if (0,0) is part of the range... try it out.
    xmin=-1,xmax=3, ymin=-1,ymax=3,grid=both] 
% this uses the point defined OUTSIDE of the axis
\draw [blue,fill] (Point) circle (\Radius) node [right] {\Label};

% this uses a TIKZ coordinate (2,0) inside of the axis:
\draw [blue,fill] (2,0) circle (\Radius) node [right] {(2,0)};

% this here will always work inside of an axis:
\draw [blue,fill] (axis cs:-1,0) circle (\Radius) node [right] {(-1,0)};
\end{axis}

\end{tikzpicture}

\end{document}

在此处输入图片描述

请注意,我将轴限制更改为(-1,-1)以证明anchor=origin通常是必要的。

相关内容