我想平滑这些根据实验室实验数据绘制的光谱,每个光谱有超过 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
。结果是第二个示例,其结果如下图所示。