通过自定义变换矩阵调整多个轴的 pgfplots 中的 3D 视图

通过自定义变换矩阵调整多个轴的 pgfplots 中的 3D 视图

我正在尝试在 tikzpicture 中叠加两个轴环境以获得可调整的视图。

原则上这不是什么大问题 - 但我想使用这种技术来投影例如 xy 平面内的文本或标签没有倾斜的,有坡度的等等

通过使用厘米键投影工作正常,但轴内的每个 3D 图都将被压平。现在的简单想法是,覆盖一个普通的通过预计轴(内置 pgfplots 视图与自定义旋转矩阵)。我的麻烦就从这里开始......我无法针对所有视图调整这两个不同的轴。

附件的 MWE 显示了我的(失败的)尝试......

在此处输入图片描述

\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}

\def\azimuth{60}
\def\elevation{40}

\def\RotX{90}
\def\Sc{1/(sin(\azimuth) + cos(\azimuth))}

\def\myplot{\addplot3[surf,domain=-3:3]{exp(-x^2-y^2)};}

\def\mywidth{8cm}
\def\myheight{8cm}

\tikzset{
    xyprojection/.estyle={
        /pgfplots/view={0}{\RotX},
        xscale=\Sc,
        yscale=\Sc,
        yshift=(\myheight/2)*cos(\elevation),
        cm={
            cos(\azimuth),sin(\azimuth)*sin(-\elevation),
            sin(\azimuth)*sin(\RotX),cos(\RotX)*cos(-\elevation)-sin(\RotX)*cos(\azimuth)*sin(-\elevation),
            (0,0)},
        opacity=0.5,
        },
    normalview/.style={
        /pgfplots/view={\azimuth}{\elevation},
        opacity=0.5,
    },
}
\pgfplotsset{
    myaxis/.style={
        width=\mywidth,
        height=\myheight,
        enlargelimits=0,
        scale only axis,
    },
}

\begin{document}

    \begin{tikzpicture}

    % *** projected plot based on cm ***
    \begin{scope}[xyprojection]
        \begin{axis}[myaxis]
            \myplot
        \end{axis}
    \end{scope}

    % *** normal plot based on view ***
    \begin{scope}[normalview]
        \begin{axis}[myaxis,hide axis]
            \myplot
        \end{axis}
    \end{scope}


\end{tikzpicture}

\end{document}

答案1

所以你试图将 pgfplots cm 与 tikz 同步,但在某些地方失败了?如果我们设法避免这个挑战并通过稍微不同的方法获得所需的效果会怎么样?

我的想法是将倾斜应用于刻度标签仅有的并依靠标准格式来pgfplots计算CM。

我通过修改你的方法实现了这个想法;也许它可以帮助你将结果调整到适合你的需求:

\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\def\azimuth{60}
\def\elevation{40}

\def\RotX{90}
\def\Sc{1/(sin(\azimuth) + cos(\azimuth))}

\def\myplot{\addplot3[surf,domain=-3:3]{exp(-x^2-y^2)};}

\def\mywidth{8cm}
\def\myheight{8cm}

\def\ZMAX{1.5}

\pgfplotsset{
    xyprojection/.estyle={
        view={\azimuth}{\elevation},
        z filter/.expression=-1,
        point meta=rawz,
        zmin=-1,
        zmax=\ZMAX,
        hide z axis,
        axis lines*=left,
        ticklabel style={
            cm={
                cos(\azimuth),sin(\azimuth)*sin(-\elevation),
                sin(\azimuth)*sin(\RotX),cos(\RotX)*cos(-\elevation)-sin(\RotX)*cos(\azimuth)*sin(-\elevation),
                (0,0)},
        },
        opacity=0.5,
    },
    normalview/.style={
        view={\azimuth}{\elevation},
        zmin=-1,
        zmax=\ZMAX,
        opacity=0.5,
    },
}
\pgfplotsset{
    myaxis/.style={
        width=\mywidth,
        height=\myheight,
        enlargelimits=0,
        scale only axis,
    },
}

\begin{document}

    \begin{tikzpicture}

    % *** projected plot based on cm ***
        \begin{axis}[xyprojection,myaxis,anchor=origin]
            \myplot
        \end{axis}

    % *** normal plot based on view ***
        \begin{axis}[normalview,myaxis,hide axis,anchor=origin]
            \myplot
        \end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

我所做的是叠加两个轴。我确保它们在所有方向上都有相同的限制,并在更高的抽象级别上“模拟”了 XY 投影(即通过将冲浪图的 Z 坐标映射到 -1)。我还添加了point meta=rawz这样一种功能:它使用“原始”z 值而不是转换后的 z 值来导出颜色。

结果是:CM 已同步,刻度标签看起来与您的示例一样。有几个关于刻度标签锚点的警告;我暂时忽略了它们。

相关内容