使用 PGFPlots 和 gnuplot 绘制不同长度的数据块

使用 PGFPlots 和 gnuplot 绘制不同长度的数据块

考虑一下这个MWE:

在此处输入图片描述

\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents}

\begin{filecontents*}{data.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,

"CH1","notes: data set 1",
\end{filecontents*}

\begin{document}
    \begin{tikzpicture}
        \begin{axis}
        \addplot gnuplot [raw gnuplot, mark=none, black]{
            set datafile separator comma;
            plot "data.csv" using 1:2 every ::3::6 with lines;
        };
        \end{axis}
    \end{tikzpicture}
\end{document}

我曾经用它gnuplot来绘制.csv文件中的数据。关于我的文件的格式.csv,我知道数据总是从第 3 行开始,但我不知道数据会有多长。当处理 1 组数据(如本例中所示)时,只需计算出有 4 行并手动输入every ::3::6 with lines(即从第 3 行到第 6 行)就不太难了。

我的问题是我的实际.csv文件要复杂得多 - 它包含多个数据块,并且它们的长度都不同(如果不手动检查,我不知道确切的长度,大约 2000 多个点)。我的 MWE 的这个扩展说明了这个问题:

\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents}

\begin{filecontents*}{data.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,

"Amplitude","notes: data set 2",
X,Y,
1,7,
2,6,
3,5,
4,4,
5,3,
6,2,
7,1,

"CH1","notes: data set 1",
"CH1","notes: data set 2",
\end{filecontents*}

\begin{document}
    \begin{tikzpicture}
        \begin{axis} [width=0.5\textwidth,height=7cm,
        ]
        \addplot gnuplot [raw gnuplot, mark=none, black]{
            set datafile separator comma;
            plot "data.csv" using 1:2 every ::3::6 with lines;
        };
        \end{axis}
    \end{tikzpicture}
\end{document}

有没有办法自动.csv处理这个文件?理想情况下,我希望这样 TeX 可以计算出存储了多少个数据块,.csv然后我可以选择要绘制哪些数据块(一些在单独的图上,一些在一起)。

仅供参考,这样做的目的是为了自动生成报告。我选择数据文件,选择要绘制的块,然后点击运行,文档就会自动生成。

答案1

这不是一个完整的答案,因为我不知道如何使用pgfplotsgnuplot。但是,这个答案显示了如何使用readarray(及其底层listofitems)提取输入文件的一部分。

您现在只需要弄清楚如何将提取的部分传递给gnuplot

\documentclass[a4paper,12pt]{article}
\usepackage{pgfplots,filecontents,readarray}

\begin{filecontents*}{mydata.csv}
"Amplitude","notes: data set 1",
X,Y,
1,1,
2,2,
3,3,
4,4,

"Amplitude","notes: data set 2",
X,Y,
1,7,
2,6,
3,5,
4,4,
5,3,
6,2,
7,1,

"CH1","notes: data set 1",
"CH1","notes: data set 2",
\end{filecontents*}
\begin{document}
\readarraysepchar{\\}
\readdef{mydata.csv}\mydata
\ignoreemptyitems
\setsepchar{%
    "Amplitude","notes: data set 2",% START OF DATA SET
  /%
    "CH1","notes: data set 1",% END OF DATA SET
  /%
    \\% SAME UNIQUE TOKEN STRING SET IN \readarraysepchar
}
\readlist\myarray{\mydata}
\noindent\foreachitem\x\in\myarray[2,1]{\xcnt: \x\\}
\end{document}

在此处输入图片描述

相关内容