答案1
可以向图中添加注释,根据轴坐标放置它们,检索轴的、和xmin
值xmax
等。因此,需要稍微小心如何在环境中执行代码(参见 ymin
ymax
pgfplots
axis
实用命令在章节中实用程序和基础级命令的pgfplots 手册),就可以绘制这种自定义的二次刻度。
以下代码重现了您的情节,您似乎使用了是2 = 平方根(哎呀1)与A= 5.为了使用这个特定函数,我的代码指定了该函数及其倒数:
declare function={y2(\x) = sqrt(5*\x);
y1(\x) = \x^2/5;}
循环最大值是使用给定的表达式y2
和ymax
图的值自动确定的。可以做同样的事情来确定函数中的最小循环值ymin
,但我更喜欢手动将其设置为0
,否则如果ymin
低于 0,您将获得错误(尝试取负数的平方根)。
我在进行计算的地方使用 PGFfpu
库,以便该解决方案很有可能与其他函数一起工作,其中中间结果可能具有非常小或非常大的幅度。
完整示例:
\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\newif\ifmyInsideAxis
\begin{document}
\begin{tikzpicture}
\begin{axis}[ymin=0, ymax=10, clip=false, grid,
declare function={y2(\x) = sqrt(5*\x);
y1(\x) = \x^2/5;},
ylabel={$y_1$},
execute at end axis={
\edef\myYmin{\pgfkeysvalueof{/pgfplots/ymin}}
\edef\myYmax{\pgfkeysvalueof{/pgfplots/ymax}}
%
\begingroup
\pgfset{fpu=true}
% Two values given at the start → the pgfmath parser is used.
\pgfplotsinvokeforeach {0,1,...,{int(ceil(y2(\myYmax)))}} {
\pgfmathparse{y1(#1)} \pgfmathfloattofixed{\pgfmathresult}
\edef\currentY{\pgfmathresult}
%
\myInsideAxistrue
\ifdim \currentY pt>\myYmax pt \myInsideAxisfalse
\else \ifdim \currentY pt< \myYmin pt \myInsideAxisfalse \fi
\fi
%
\edef\temp{
\ifmyInsideAxis
\noexpand\path
(current axis.east |- 0,0) ++(axis direction cs:0,\currentY)
coordinate (m);
\noexpand\draw
(m) -- ([xshift=\pgfkeysvalueof{/pgfplots/minor tick length}]m)
node[font=\noexpand\tiny, right] {\noexpand\pgfmathprintnumber{#1}};
\fi
}
{\pgfset{fpu=false} \temp}
} % end of \pgfplotsinvokeforeach's body
\endgroup
}]
\addplot[blue, only marks, mark=square*]
coordinates { (2,5) (3,7) (4,6) (5,9) (6,8.5) };
\node[rotate=90] at ([xshift=2em]current axis.east) {$y_2 = \sqrt{a y_1}$};
\end{axis}
\end{tikzpicture}
\end{document}