如何在 tikz 轴环境中使用 \pgftransformnonlinear?

如何在 tikz 轴环境中使用 \pgftransformnonlinear?

以下是我为测试\pgftransformnonlinearpgfplot 的使用而制作的 MWE(通过 TiZ 的axis环境)。 它使用以下映射:在此处输入图片描述。(基于此处的答案:根据函数对 tikzpicture 进行非线性变换

原则上,这种方法可以正常工作,但实际上并没有使用环境本身的坐标axis。例如,我们可以清楚地看到,变换并不像预期的那样在 y 轴上对称。我认为这是因为它\pgftransformnonlinear在与环境完全不同的坐标系中工作axis

所以我的问题是:有没有办法应用非线性变换,以便它们使用内部axis环境的坐标?

代码:

\documentclass[preview]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfmodule{nonlineartransformations}
\pgfplotsset{compat=1.16}
\pgfkeys{
    /pgfplots/vector plane/.style={
    },
}
\makeatletter
\def\mytransformation{%
    \pgfmathsetmacro{\myX}{\pgf@x}
    \pgfmathsetmacro{\myY}{0.001*\pgf@x*\pgf@x+\pgf@y}
    \setlength{\pgf@x}{\myX pt}
    \setlength{\pgf@y}{\myY pt}
}
\makeatother

\begin{document}
\begin{figure}
    \centering
    \begin{tikzpicture}
        \begin{scope}
            \pgftransformnonlinear{\mytransformation}
            \begin{axis}[
                width=10cm, height=10cm,
                axis x line=middle,
                axis y line=middle,
                xlabel=$x$,
                ylabel=$y$,
                every axis x label/.style={
                    at={(ticklabel* cs:1.02)},
                    anchor=west,
                },
                every axis y label/.style={
                    at={(ticklabel* cs:1.02)},
                    anchor=south,
                },
                axis line style={stealth-stealth, thick},
                label style={font=\large},
                tick label style={font=\large},
                xticklabels={,,},
                yticklabels={,,},
                samples=100,
                xmin=-10, xmax=10,
                ymin=-10, ymax=10,
                grid=both,
                major grid style={black!5},
                minor grid style={black!5},
                ]
            \end{axis}
        \end{scope}
    \end{tikzpicture}
\end{figure}
\end{document}

结果:

上述代码生成的图

答案1

您的变换似乎基于 (0,0) 处的轴原点,这可能与 pgf 原点(此处的左下角)不同。

一种解决方案是将轴放置在 pgf 的 (0,0) 处(这也是默认行为),但将轴的锚点更改为原点。原点是轴的特殊锚点。有关其他锚点选项,请参阅 pgfplots 手册。

\begin{axis}[
    at = {(0,0)},
    anchor = {origin},

当然,您可以省略at = {(0,0)},因为它是默认位置。

在此处输入图片描述

完整代码:

\documentclass[preview]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfmodule{nonlineartransformations}
\pgfplotsset{compat=1.16}
\pgfkeys{
    /pgfplots/vector plane/.style={
    },
}
\makeatletter
\def\mytransformation{%
    \pgfmathsetmacro{\myX}{\pgf@x}
    \pgfmathsetmacro{\myY}{0.001*\pgf@x*\pgf@x+\pgf@y}
    \setlength{\pgf@x}{\myX pt}
    \setlength{\pgf@y}{\myY pt}
}
\makeatother

\begin{document}
\begin{figure}
    \centering
    \begin{tikzpicture}
        \begin{scope}
            \pgftransformnonlinear{\mytransformation}
            \begin{axis}[
                at = {(0,0)},
                anchor = {origin},
                width=10cm, height=10cm,
                axis x line=middle,
                axis y line=middle,
                xlabel=$x$,
                ylabel=$y$,
                every axis x label/.style={
                    at={(ticklabel* cs:1.02)},
                    anchor=west,
                },
                every axis y label/.style={
                    at={(ticklabel* cs:1.02)},
                    anchor=south,
                },
                axis line style={stealth-stealth, thick},
                label style={font=\large},
                tick label style={font=\large},
                xticklabels={,,},
                yticklabels={,,},
                samples=100,
                xmin=-10, xmax=10,
                ymin=-10, ymax=10,
                grid=both,
                major grid style={black!5},
                minor grid style={black!5},
                ]
            \end{axis}
        \end{scope}
    \end{tikzpicture}
\end{figure}
\end{document}

相关内容