如何平滑用 Tikz 绘制的光谱?

如何平滑用 Tikz 绘制的光谱?

我想平滑这些根据实验室实验数据绘制的光谱,每个光谱有超过 1000 个点。我尝试使用tension=1或“每个第 n 个点”来控制平滑,但都没有用,如下图所示。这是 MWC:

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{width=7cm,compat=1.16}
\usepackage{pgfplotstable} 


\begin{document}

\begin{tikzpicture}
\begin{axis}[
 name=plot,width=0.9\textwidth, xmin=230, xmax=400, 
 line width=1.2,
 smooth,
 label style={font=\bfseries\Large},
 xlabel={conc},
 ylabel={absorbance},
 legend pos=north east,
 ]

\addplot [blue,smooth] table {data1.txt};
\addplot [red,smooth] table {data2.txt};
\addplot [green,smooth] table {data3.txt};
\addplot [violet,smooth] table {data4.txt};
\addplot [orange,smooth] table {data5.txt};
\addplot [magenta,smooth] table {data6.txt};
\addplot [purple,smooth] table {data7.txt};
\addplot [cyan,smooth] table {data8.txt};
\addplot [brown,smooth] table {data9.txt};
\addplot [lime,smooth] table {data10.txt};
\addplot [olive,smooth] table {data11.txt};

 \end{axis}
 \end{tikzpicture}

\end{document}

真实数据光谱 示例文件data1.txt https://gofile.io/?c=AVXV71

答案1

在我看来,您的数据是通过某种截断获得的。也就是说,这些值已经以某种方式四舍五入。当然,不可能撤消四舍五入。可以生成平滑的图吗?可以。一种非常直接的方法是仅考虑每个第 n 个点。这可以通过安装过滤器来实现。

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{width=7cm,compat=1.16}
\usepackage{pgfplotstable} 


\begin{document}

\begin{tikzpicture}
\begin{axis}[
 name=plot,width=0.9\textwidth, xmin=230, xmax=400, 
 line width=1.2,
 smooth,
 label style={font=\bfseries\Large},
 xlabel={conc},
 ylabel={absorbance},
 legend pos=north east,
 x filter/.expression={(mod(\coordindex,25) >0)? nan : x}
 ]

\addplot [blue,smooth] table {data1.txt};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
 name=plot,width=0.9\textwidth, xmin=230, xmax=400, 
 line width=1.2,
 smooth,
 label style={font=\bfseries\Large},
 xlabel={conc},
 ylabel={absorbance},
 legend pos=north east,
 ]

\addplot [blue,no markers, raw gnuplot] gnuplot {
        plot 'data1.txt' smooth sbezier;
    };

\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

这个图很流畅,但并没有真正反映数据。一个可以说更好的方法是这样做这里讨论:使用gnuplot。这需要您使用 进行编译-shell-escape。结果是第二个示例,其结果如下图所示。

相关内容