以下是我为测试\pgftransformnonlinear
pgfplot 的使用而制作的 MWE(通过 Ti钾Z 的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}