使用 pgfplots 计算残差

使用 pgfplots 计算残差

我想为该图创建一个残差:

\begin{figure}[hbt!]
\centering
\begin{tikzpicture}
    \begin{axis}[,width=\textwidth,
            axis lines=middle,
            grid=major,
            xmin=-50, xmax=670,
            ymin=18.4, ymax=25.2,
            xlabel=$t(s)$,
            ylabel=$T(^{\circ} \mathrm{C})$,
            tick style={thick},
            ticklabel style={font=\footnotesize},
            xtick={-50,0,...,650},
            ytick={19,20,...,25}, minor ytick={19.5,20.5,...,24.5}
        ]
        \addplot[black,thin,samples=100,domain=-50:625] {0.007303*x+19.8545};
        \addplot [blue, thin, only marks,mark=*] coordinates { 
            (0,20) (60,20.1) (120,20.6) (180,21.2) (240,21.7) (300,22.2) (360,22.5) (420,23.0) (480,23.1) (540,23.8) (600,24.3)
        };
    \end{axis}
\end{tikzpicture}

\结束{图}

它看起来像这样: 在此处输入图片描述

我想要创建的残差必须看起来像这样: 在此处输入图片描述 我似乎找不到有关这种特殊残差样式的任何信息,而且由于我对 LaTeX 完全陌生,所以我不知道如何创建这样的东西。

由于我已经发表了这篇文章,我对图表总体上有一些问题,我也希望得到帮助。

  1. 和位于每个轴的末尾。如果我想将它们移动xlabelylabel轴的下方和旁边,我该怎么做?如本例所示: 在此处输入图片描述

  2. 我希望删除网格的左外线,但仍然保留-50周围的刻度。

  3. 如果我想在线性函数之外制作一些浮动文本,使用文本0.007303x+19.8545,我该怎么做?或者我可以legend在左上角添加一个。
  4. 0为什么x 轴上不显示刻度?我似乎无法让它显示出来。

答案1

对于残差,一种明显的方法是计算其他程序中的值,并创建一个新的坐标列表,就像对原始数据所做的那样。

pgfplots如果将数据读入表中,也可以使用 执行此操作pgfplotstable。如果表名为\MyData,则可以执行例如

\addplot [mark=*,blue, only marks]
    table[
      x=x,
      y expr={\thisrow{y}-f(\thisrow{x})}
    ] {\MyData};

f(x)我定义的函数是

\tikzset{
  declare function={
    f(\x) = {0.007303*\x+19.8545}; % for convenience
  }
}

对于其他问题:

  1. 可能有更好的选择,但是这个有效:

        xlabel style={at={(xticklabel cs:0.5)},below},
        ylabel style={at={(yticklabel cs:0.5)},rotate=90,above},
    
  2. 你可以使用extra x tick这个,例如

        xtick={0,50,...,650}, % <-- start at zero
        extra x ticks={-50}, % <-- added
        extra x tick style={grid=none}, % <-- added
    
  3. 您只需node在末尾添加一个\addplot,例如

    \addplot[black,thin,samples=100,domain=-50:625] {f(x)} node[above left] {$0.007303x+19.8545$};
    
  4. 轴交叉处的刻度标签默认是隐藏的,添加

    hide obscured x ticks=false
    

下面是完整代码。我没有添加残差图的任何样式。它应该位于主图的正下方吗?

\documentclass[border=5mm]{standalone}
\usepackage{pgfplotstable} % <-- pgfplotstable instead of pgfplots (the former loads the latter)
\pgfplotstableread{
x y
0   20
60   20.1
120   20.6
180   21.2
240   21.7
300   22.2
360   22.5
420   23.0
480   23.1
540   23.8
600   24.3
}\MyData

\tikzset{
  declare function={
    f(\x) = {0.007303*\x+19.8545}; % for convenience
  }
}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            xlabel={$t(s)$},
            ylabel={$T\left(^{\circ} \mathrm{C}\right)$},
            width=\textwidth,
            axis lines=middle,
            grid=major,
            xmin=-50, xmax=670,
            ymin=18.4, ymax=25.2,
            xlabel style={at={(xticklabel cs:0.5)},below},
            ylabel style={at={(yticklabel cs:0.5)},rotate=90,above},
            tick style={thick},
            ticklabel style={font=\footnotesize},
            xtick={0,50,...,650}, % <-- start at zero
            extra x ticks={-50}, % <-- added
            extra x tick style={grid=none}, % <-- added
            ytick={19,20,...,25},
            minor ytick={19.5,20.5,...,24.5},
            hide obscured x ticks=false % <-- added
        ]
        \addplot[black,thin,samples=100,domain=-50:625] {f(x)} node[above left] {$0.007303x+19.8545$};
        \addplot [blue, thin, only marks,mark=*] table {\MyData};
    \end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}
\addplot [mark=*,blue, only marks]
    table[
      x=x,
      y expr={\thisrow{y}-f(\thisrow{x})}
    ] {\MyData};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容