![坐标变换:PGFPlots 与 PGF 之间的转换](https://linux22.com/image/310900/%E5%9D%90%E6%A0%87%E5%8F%98%E6%8D%A2%EF%BC%9APGFPlots%20%E4%B8%8E%20PGF%20%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2.png)
如何将计算的长度缩放到适当的轴比例?在此示例中,我期望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
两个原因:
- 它相对简单
- 另一个解决方案听起来似乎更通用,但不幸的是,它遇到了意想不到的问题:一旦你真的有一个巨大的数据范围(
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}