我想保持 TikZ 和 PGFplots 之间的一致性,但遇到了很多困难。以下是其中两个示例:
我希望能够
\coordinate
在 PGF 中使用类似于 TikZ 的东西。因此,理想情况下,我希望注释掉第二张图中的行并将其替换为未注释的行。即,能够使用定义的坐标,而不必输入特定坐标。我希望两个圆的大小相同,而与我如何绘制图表无关。在第二个示例中,我将 乘以
\Radius
20,但圆点的大小仍然相差甚远。
也许有更好的方法可以做到这一点,但我对这些还很陌生......
\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}
答案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
通常是必要的。