关于 pgfplotsunitxlength 宏的实际含义(来自 pgfplots 包)

关于 pgfplotsunitxlength 宏的实际含义(来自 pgfplots 包)

摘自pgfplots手册(第 8.4 节):

\pgfplotsunitxlength,,,...扩展为相应单位向量 x i的 向量长度 ||x \pgfplotsunitylengthi ||宏...\pgfplotsunitzlength

没有关于测量单位的信息,但我猜它是pt来自其他地方的点 ()。
我的理解是,如果我从点 (0,0) 到点 (1,0) 画一条线段,它的长度是\pgfplotsunitxlength,如果我从点 (1,0) 到点 (1,1) 画一条线段,它的长度是\pgfplotsunitylength。但事实并非如此。请参见以下示例:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot+ [no marks] coordinates {(0,0) (1,0) (1,1)};
\draw [<->, dashed] (axis cs:0,0.5) -- +(0:\pgfplotsunitxlength pt);
\draw [<->, dashed] (axis cs:0.8,0) -- +(90:\pgfplotsunitylength pt);
\end{axis}
\end{tikzpicture}
\end{document}

很奇怪的是,如果我将这两个量都乘以 100,我会得到实际的单位向量长度,如下例所示:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot+ [no marks] coordinates {(0,0) (1,0) (1,1)};
\draw [<->, dashed] (axis cs:0,0.5) -- +(0:100*\pgfplotsunitxlength pt); %<--
\draw [<->, dashed] (axis cs:0.8,0) -- +(90:100*\pgfplotsunitylength pt); %<--
\end{axis}
\end{tikzpicture}
\end{document}

此外,如果轴长度大于 10 个单位且小于 100 个单位,我只需要乘以 10 即可得到实际的单位向量长度,如下例所示:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\begin{tikzpicture}
\begin{axis} [ymax=11] %<--
\addplot+ [no marks] coordinates {(0,0) (1,0) (1,1)};
\draw [<->, dashed] (axis cs:0,0.5) -- +(0:100*\pgfplotsunitxlength pt);
\draw [<->, dashed] (axis cs:0.8,0) -- +(90:10*\pgfplotsunitylength pt); %<--
\end{axis}
\end{tikzpicture}
\end{document}

因此问题是:

  1. 该宏的实际含义是什么\pgfplotsunit[...]length
  2. 我如何才能获得实际的单位向量长度,即单位段的长度?

编辑

问题 2 的建议答案

\pgfmathresult我发现可以通过将from\pgfplotstransformcoordinatex{1}\pgfplotstransformdirectionx{1}乘以 来获得正确的单位向量长度\pgfplotsunitxlength。请参见以下示例:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\begin{tikzpicture}
\begin{axis}
\addplot+ [no marks] coordinates {(0,0) (1,0) (1,1)};
\pgfplotsextra{
  \pgfplotstransformdirectionx{1}
  \pgfmathsetlengthmacro{\ex}{\pgfmathresult*\pgfplotsunitxlength}
  \pgfplotstransformdirectiony{1}
  \pgfmathsetlengthmacro{\ey}{\pgfmathresult*\pgfplotsunitylength}
}
\draw [<->, dashed] (axis cs:0,0.5) --  +(0:\ex);
\draw [<->, dashed] (axis cs:0.8,0) --  +(90:\ey);
\end{axis}
\end{tikzpicture}
\end{document}

来自开发页面错误部分的更新 2015-01-22

感谢您的反馈。这些宏确实看起来没什么用,但我要告诉您我使用它们的目的是什么。

假设我有一个坐标系,其中两个轴的单位长度不同。我想通过arcTi 提供的指令在两条线之间画一个圆弧Z。所以我需要计算两条线之间的角度。我不能直接使用这两个斜率,因为两个测量单位不同,所以我必须使用两个单位向量长度来缩放它们。如果我\pgfplotsunit[xy]length按现在的方式使用宏,结果会不正确,因为我在第一篇文章中告诉过您的行为。

最后,我认为这些宏在极少数情况下还是有用的,应该改进。例如,我会将它们转换为长度宏。

答案1

这是 pgfplots 1.11 版及之前的版本的弱点。

版本 1.12(将在撰写本文时在接下来的几周内发布)将导致

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}
\begin{tikzpicture}
\begin{axis} [ymax=11]
\addplot+ [no marks] coordinates {(0,0) (1,0) (1,1)};
\draw [<->, dashed] (0,0.5) --  +(0:1);
\draw [<->, dashed] (0.8,0) --  +(90:1);
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容