我正在尝试实现一些雄心勃勃的目标,但我被如何使用和来操作表格数据所pgfplots
困扰pgfplotstable
。
我有一个数据文件,其中包含许多不同工具在一定数量的不同数据集中的基准测试结果。该文件具有以下格式:
datasets tool1 tool2 tool3 tool4 tool5 tool6
dataset1 1 2 3 4 5 6
dataset2 1 2 3 4 5 6
dataset3 1 2 3 4 5 6
dataset4 1 2 3 4 5 6
dataset5 1 2 3 4 5 6
dataset6 1 2 3 4 5 6
dataset7 1 2 3 4 5 6
dataset8 1 2 3 4 5 6
也就是说,工具放在不同的列上,数据集放在不同的行上。我想将这些数据绘制在相同形状的表格中,每行一个条形图,显示每行数据集上不同工具的计时。
因此,表格的第一列应报告数据集的名称,第二列应包含条形图。
我遇到的问题:
- 如何迭代文件的行来生成表格?
- 我可以想象用 进行迭代
\foreach
,但是在从文件的单个给定行获取条形图时遇到了问题。
- 我可以想象用 进行迭代
- 如何从每一行生成单个条形图?
我不知道如何模拟我的预期结果。它类似于这例如,使用条形图代替雨图,并且不对第一列的行名称进行硬编码。
有什么建议吗?
答案1
如果你的文件被命名为例如mydata.csv
,你可以使用
\pgfplotstabletranspose[colnames from=datasets,input colnames to=datasets]{\data}{mydata.csv}
示例 1:
\begin{filecontents*}{mydata.csv}
datasets tool1 tool2 tool3 tool4 tool5 tool6
dataset1 2 3 4 5 6 7
dataset2 1 2 3 4 5 6
dataset3 1 2 3 4 5 6
dataset4 1 2 3 4 5 6
dataset5 1 2 3 4 5 6
dataset6 1 2 3 4 5 6
dataset7 1 2 3 4 5 6
dataset8 1 2 3 4 5 6
\end{filecontents*}
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\begin{document}
\pgfplotstabletranspose[colnames from=datasets,input colnames to=datasets]{\data}{mydata.csv}
\foreach \dataset in {1,...,8}{%
\noindent Dataset \dataset\qquad
\begin{tikzpicture}[baseline={([yshift=-\baselineskip]p.north)}]
\begin{axis}[
height=4cm,
width=\axisdefaultwidth,
ybar,
xtick=data,
xticklabels from table={\data}{datasets},
name=p
]
\addplot table[x expr=\coordindex,y index=\dataset]{\data};
\end{axis}
\end{tikzpicture}%
\par
}%
\end{document}
示例 2:
\begin{filecontents*}{mydata.csv}
datasets tool1 tool2 tool3 tool4 tool5 tool6
dataset1 2 3 4 5 6 7
dataset2 1 2 3 4 5 6
dataset3 1 2 3 4 5 6
dataset4 1 2 3 4 5 6
dataset5 1 2 3 4 5 6
dataset6 1 2 3 4 5 6
dataset7 1 2 3 4 5 6
dataset8 1 2 3 4 5 6
\end{filecontents*}
\documentclass{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\begin{document}
\begin{tikzpicture}
\pgfplotstabletranspose[colnames from=datasets,input colnames to=datasets]{\data}{mydata.csv}
\begin{axis}[
width=\textwidth,
ybar,
bar width=2pt,
xtick=data,
xticklabels from table={\data}{datasets},
legend pos=north west,
cycle list name=color list,
every axis plot/.append style=fill
]
\pgfplotsinvokeforeach {1,...,8}
{
\addplot table[x expr=\coordindex,y index=#1]{\data};
\addlegendentry{dataset#1}
}
\end{axis}
\end{tikzpicture}
\end{document}
结果: