具有第二 y 轴和“非线性”转换单位的 Pgfplots

具有第二 y 轴和“非线性”转换单位的 Pgfplots

我想绘制一个图表,在其中显示一定范围内的散点值 - 这些是我进行的测量的最大值。根据这些值,可以通过包含平方根的公式计算出一个参数(假设y_2=\sqrt{a \cdot y_1})。我想显示第二个 y 轴y_2,可以从中直接读取获得的参数。我提供了一个图表可能是什么样子的示例(在 pyplot 中创建)。

在此处输入图片描述

不幸的是,我还没有找到一种方法来获得 pgfplot 的第二个 y 轴,而这个 y 轴不“线性依赖”于第一个 y 轴。有人知道我必须做什么才能用 pgfplots 生成这样的图表吗?

答案1

可以向图中添加注释,根据轴坐标放置它们,检索轴的、和xminxmax等。因此,需要稍微小心如何在环境中执行代码(参见 yminymaxpgfplotsaxis实用命令在章节中实用程序和基础级命令pgfplots 手册),就可以绘制这种自定义的二次刻度。

以下代码重现了您的情节,您似乎使用了2 = 平方根(哎呀1)与A= 5.为了使用这个特定函数,我的代码指定了该函数及其倒数:

declare function={y2(\x) = sqrt(5*\x);
                  y1(\x) = \x^2/5;}

循环最大值是使用给定的表达式y2ymax图的值自动确定的。可以做同样的事情来确定函数中的最小循环值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}

在此处输入图片描述

相关内容