如何用pgfplots在3D图形的平面上绘制嵌入的圆形标签?
解决3D网格矩形的贴合式带圈标签问题
你的问题核心出在两点:
- 用
circle[x={(...)}, y={(...)}]时,没给单位向量,而且向量长度太夸张(比如(0,0,16)),TikZ会用向量的实际长度来缩放椭圆半轴,导致圆形严重变形; - 数字节点没有跟着平面旋转,就算圆贴对了,文字还是歪的。
针对你的三个矩形,逐个调整标签的旋转和参数,下面是修改后的完整代码:
\tikzset{ label/.style={draw=gray, fill=white, circle, minimum size=0pt, inner sep=2pt, outer sep=0pt, font=\large} } \begin{tikzpicture} \begin{axis}[ view = {-18}{30}, axis lines = center, axis on top, axis line style = {thick, black}, xmin=0, xmax=20, ymin=0, ymax=20, zmin=0, zmax=20, ticks=none, ] % 红色平面(x=6,y-z平面) \addplot3[surf, red, opacity=0.7] coordinates { (6.0, 6.0, 0.0) (6.0, 20.0, 0.0) (6.0, 6.0, 20.0) (6.0, 20.0, 20.0) }; % 绿色平面(y=6,x-z平面) \addplot3[mesh, surf, green, opacity=0.7] coordinates { (6.0, 6.0, 0.0) (20.0, 6.0, 0.0) (6.0, 6.0, 20.0) (20.0, 6.0, 20.0) }; % 黄色平面(x=y,沿z轴延伸) \addplot3[surf, yellow, opacity=0.7] coordinates { (6.0, 6.0, 0.0) (6.0, 6.0, 20.0) (0.0, 0.0, 0.0) (0.0, 0.0, 20.0) }; % 标签1:红色平面(贴合y-z平面) \node[label, rotate around y=18, transform shape] at (6,13,10) {$1$}; % 标签2:绿色平面(贴合x-z平面) \node[label, rotate around x=-30, transform shape] at (13,6,10) {$2$}; % 标签3:黄色平面(贴合x=y平面) \node[label, rotate around z=45, rotate around y=18, rotate around x=-30, transform shape] at (3,3,10) {$3$}; \end{axis} \end{tikzpicture}
修改说明:
- 放弃手动画圆+节点的拆分方式,直接用你定义的
label样式,配合旋转+transform shape,让整个带圈标签跟着平面旋转,一步到位; - 每个标签的旋转参数对应平面方向,匹配你设置的
view={-18}{30}视角:- 红色平面是x固定的y-z平面,绕y轴旋转18度;
- 绿色平面是y固定的x-z平面,绕x轴旋转-30度;
- 黄色平面是x=y的平面,先绕z轴转45度对齐平面,再叠加视角的旋转参数;
- 所有旋转都加了
transform shape,确保节点的圆形边框和文字同步旋转,完美贴合对应平面。
如果坚持要手动画圆(比如需要更精细控制),记得把circle的x/y参数改成单位正交向量,比如绿色平面的圆应该写:
\draw[thick, fill=white] (13,6,10) circle[x={(1,0,0)}, y={(0,0,1)}, x radius=0.5,y radius=0.5];
两个向量都是单位长度,x/y半径设为相同值,就能在x-z平面上画出正圆。
内容的提问来源于stack exchange,提问作者grapher
相关产品推荐
相关产品推荐

