我希望文本看起来就像写在 3D tikz 图的其中一面墙上一样。MWE:
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
view={60}{30},
%axis equal,
clip=false,
xmin=0,xmax=1,
ymin=0,ymax=1,
zmin=0,zmax=1,
]
%\addplot3 (1,1,1);
\path (axis cs:0,0,0) -- (axis cs:0,1,0) node[midway,above, sloped,xslant=0.2] {Text};
\end{axis}
\end{tikzpicture}
\end{document}
在这种情况下,让我不满意的是我需要xslant
手动设置。我可以根据几何图形计算它,但 pgfplots 角度似乎并不总是如您所期望的那样。示例:
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
view={45}{90},
%axis equal,
clip=false,
xmin=0,xmax=1,
ymin=0,ymax=1,
zmin=0,zmax=1,
]
%\addplot3 (1,1,1);
\path (axis cs:0,0,0) -- (axis cs:0,1,0) node[midway,above, sloped,xslant=0.2] {Text};
\end{axis}
\end{tikzpicture}
\end{document}
[这与上一个示例完全相同,只是我改变了视图]。这给出了从正上方看到的图,显示 x 轴和 y 轴不垂直。我认为这可以用axis equal
或来改变axis equal image
,但我宁愿不使用它们,因为它们有副作用。
我假设 pgfplots 已经在内部计算了 x、y 和 z 方向向量如何映射到二维页面……有没有办法提取这些信息?如果我有这个,那么使用三角函数很容易找到合适的斜率。这在没有axis equal
或的情况下也可以工作axis equal image
答案1
我不确定您想要的是平面字母还是垂直字母,所以我两者都选了。请注意 [scale mode=scale uniformly] 的使用。还请注意,yscale 是 xslant 的分母,xscale 是 yslant 的分母。
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\def\h{80}% horizontaql viewing angle
\def\v{10}% vertical viewing angle
\begin{axis}[
scale mode=scale uniformly,
view={\h}{\v},
clip=false,
xmin=0,xmax=1,
ymin=0,ymax=1,
zmin=0,zmax=1,
]
\pgfmathparse{atan(tan(\h)*sin(\v))}
\let\a=\pgfmathresult
\pgfmathparse{atan(tan(90-\h)*sin(\v))}
\let\b=\pgfmathresult
\path (axis cs:0,0,0) -- (axis cs:0,1,0) node[color=blue,midway,above,sloped,
xslant=tan(\a+\b+90),yscale=sin(\a+\b)] {Text};
\path (axis cs:0,0,0) -- (axis cs:0,1,0) node[color=red,midway,above,
yslant=tan(\b),xscale=cos(\b)] {Text};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
您应该切换到PST-solides3d
,它可以产生令人满意的文本和图形投影。请参阅以下示例文档:
答案3
基于 John 的解决方案,这里有一个 MWE,它使用选项cm
明确设置每个节点的转换矩阵:
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\newcommand{\viewa}{30}
\newcommand{\viewb}{30}
\begin{axis}[scale mode=scale uniformly,% needed for text
view={\viewa}{\viewb},
clip=false,
xmin=0,xmax=1,
ymin=0,ymax=1,
zmin=0,zmax=1,
]
\node[color=red,
cm={sin(\viewa),cos(\viewa)*sin(\viewb),
0,cos(\viewb),
(0,0)}
]
at (axis cs:0,0.5,0.5) {$x$ plane};
\node[color=blue,
cm={cos(\viewa),-sin(\viewa)*sin(\viewb),
sin(\viewa),cos(\viewa)*sin(\viewb),
(0,0)}
]
at (axis cs:0.5,0.5,0) {$z$ plane};
\node[color=black,
cm={cos(\viewa),-sin(\viewa)*sin(\viewb),
0,cos(\viewb),
(0,0)}
]
at (axis cs:0.5,1,0.5) {$y$ plane};
\end{axis}
\end{tikzpicture}
\end{document}
一般来说,要使节点看起来好像悬挂在方向向量 u = (u_x,u_y,u_z) 和 v = (v_z,v_y,v_z) 的平面上
- 定义 a = u_x * cos(a) + u_y * sin(a),其中 a 和 b 是上面 LaTeX 代码中定义的视角
- 定义 b = - u_x * sin(a)sin(b) + u_y * cos(a)sin(b) + u_z * cos(b)
- 定义 c = v_x * cos(a) + v_y * sin(a)
- 定义 d = - v_x * sin(a)sin(b) + v_y * cos(a)sin(b) + v_z * cos(b)
- 放置带有选项的节点
cm={a,b,c,d,(0,0)}
,其中 ad 代表上述表达式。
在 MWE 中,我使用了
- 蓝色文字:u = (1,0,0),v = (0,1,0)
- 红色文字:u = (0,1,0),v = (0,0,1)
- 黑色文字:u = (1,0,0),v = (0,0,1)