Я пытаюсь достичь чего-то немного амбициозного и застрял на том, как манипулировать данными таблиц с помощью 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}
Результат: