旧答案(略有修改)

旧答案(略有修改)

我想将 axis 范围之外但在 \tikzpicture 范围内绘制的图形与 \axis 环境内的图形结合起来。然而,它们似乎处于不同的参考空间中。我提供了一个最小的工作示例:

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{tikz-3dplot}
\usepackage{pgfplots}

\usetikzlibrary{calc,3d,shapes, pgfplots.external}

\begin{document}
\begin{tikzpicture}
  \def\R{1}
  \fill[ball color=white!10] (0,0) circle (\R); % 3D lighting effect
  \begin{axis}[axis lines=none,
      samples=50,domain=0:360,y domain=0:90,
      xmin=-1.2,xmax=1.2,ymin=-1.2,ymax=1.2,zmin=0,zmax=1.2]
    \pgfplotsset{
      colormap={blackwhite}{gray(0cm)=(0); gray(1cm)=(1)}
    }
    \addplot3[surf,opacity=0.6, shader=interp]
    ({cos(x)*cos(y)}, {sin(x)*cos(y)}, {sin(y)});
  \end{axis}
\end{tikzpicture}

\end{document}

如下图: 轴未对齐

由于我没有提到原点和比例,所以两个坐标系应该同步,但它们的原点和比例不同。为什么?

谢谢。

答案1

首先,轴上的坐标系pgfplots与周围的 完全分开tikzpicture。请记住,axis具有默认宽度(240pt),无论范围如何,它都将具有该大小。例如,如果您有两个axis环境,一个带有xmin=0,xmax=1,一个带有xmin=0,xmax=10,它们仍将具有相同的宽度。因此,当打印在纸上时,第一个轴上的 1 个单位长度将比第二个轴上的 10 倍长。

其次,我认为由于混合了 2D 和 3D,这可能会变得复杂。考虑以下图像,其中显示了轴框:

在此处输入图片描述

我认为,下面代码中的高度最终“正确”只是运气好而已。在 2D 参考系统中,轴上的单位向量将取决于viewwidth轴的限制,因此如何获得正确的宽度对我来说并不明显。

旧答案(略有修改)

一个axis将始终拥有自己的坐标系,我不确定为什么你希望它们相同。默认情况下,它的角(默认锚点)axis位于其中。如果你添加到选项中,然后添加例如,你会看到它位于阴影圆的中心。south west(0,0)name=theAxaxis\fill (theAx.south west) circle[radius=3pt];

如果您希望 的原点axis位于圆心,请添加anchor=originaxis选项中。要获得大致相同的比例,您需要确保axis坐标系中的 1 个单位与坐标系中的 1 个单位(默认情况下为 1 厘米)相同tikzpicture。我猜,使用您的xmin和设置xmax,添加scale only axis,width=2.4cm将使其大致正确。如上所述,缩放更为复杂,对此我并没有很好的解决方案。

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}
\begin{tikzpicture}
  \def\R{1}
  \fill[ball color=white!10] (0,0) circle (\R); % 3D lighting effect
  \begin{axis}[axis lines=none,name=theAx,anchor=origin,
      samples=10,domain=0:360,y domain=0:90,scale only axis,width=2.4cm,
      xmin=-1.2,xmax=1.2,ymin=-1.2,ymax=1.2,zmin=0,zmax=1.2]
    \pgfplotsset{
      colormap={blackwhite}{gray(0cm)=(0); gray(1cm)=(1)}
    }
    \addplot3[surf,opacity=0.6, shader=interp]
    ({cos(x)*cos(y)}, {sin(x)*cos(y)}, {sin(y)});
  \end{axis}
\draw [red] (theAx.south west) rectangle (theAx.north east);
\end{tikzpicture}

\end{document}

相关内容