使用 pgfplots 将多列文件按行绘制为一个长列

使用 pgfplots 将多列文件按行绘制为一个长列

我有一个格式的数据文件

date          1    2    3    4
2019-10-28  120   40   55  100
2019-10-29  100   45   30   80
2019-10-30   90   65  100   70

即每个日期有四个连续的值。是否可以使用 pgfplots 将其绘制为一个长数据列,方法是逐行连接这些值,以便绘制成如下形式

date        number    value
2019-10-28       1      120
2019-10-28       2       40
2019-10-28       3       55
2019-10-28       4      100
2019-10-29       1      100
2019-10-29       2       45
2019-10-29       3       30
2019-10-29       4       80
.
.
.

无需重新组织数据文件本身?

在某种程度上,这是绘制 x 列重置/数据连接在一起而不是按列堆叠的数据

答案1

您可以随时按照您描述的格式创建新表格。我也不知道您实际上想要什么样的情节,所以我没有做任何特别的事情。

\documentclass{article}
\usepackage{pgfplotstable}
\usepgfplotslibrary{dateplot}
% read original file to table
\pgfplotstableread{
date          1    2    3    4
2019-10-28  120   40   55  100
2019-10-29  100   45   30   80
2019-10-30   90   65  100   70
}\dataA
% get number of rows in table
\pgfplotstablegetrowsof{\dataA}
\pgfmathtruncatemacro{\Nrows}{\pgfplotsretval*4}

% make a new table
\pgfplotstablenew[
  % with a column called number
  create on use/number/.style={
     % containing numbers given by this expression
     create col/expr={int(mod(\pgfplotstablerow,4)+1)}
  },
  columns={number}
]{\Nrows}{\dataB}

% create a new column called date
\pgfplotstablecreatecol[
 create col/assign/.code={
   % \pgfplotstablerow is row number in \dataB
   % calculate a row number for lookup in \dataA
   \pgfmathtruncatemacro{\RowNo}{int(floor(\pgfplotstablerow/4))}
   % get an entry from \dataA
   \pgfplotstablegetelem{\RowNo}{date}\of\dataA
   \edef\entry{\pgfplotsretval}
   % and write to \dataB
   \pgfkeyslet{/pgfplots/table/create col/next content}\entry
}
]{date}\dataB

% and finallyb create the value column
\pgfplotstablecreatecol[
 create col/assign/.code={
   % similar to above, just need to calculate a column number as well
   \pgfmathtruncatemacro{\RowNo}{int(floor(\pgfplotstablerow/4))}
   \pgfmathtruncatemacro{\ColNo}{int(mod(\pgfplotstablerow,4)+1)}
   \pgfplotstablegetelem{\RowNo}{[index]\ColNo}\of\dataA
   \edef\entry{\pgfplotsretval}
   \pgfkeyslet{/pgfplots/table/create col/next content}\entry
}
]{value}\dataB


\begin{document}
\pgfplotstabletypeset[string type]{\dataA}    
\pgfplotstabletypeset[columns/date/.style={string type}]{\dataB}

\begin{tikzpicture}
\begin{axis}[
  date coordinates in=x,
  xtick=data
]

\addplot table[x=date,y=value] {\dataB};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容