我有一个格式的数据文件
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}