我正在尝试绘制一个数据集,该数据集包含一组输入文件上多个工具的一些基准测试结果。问题是有超过 3000 个测试用例,我需要以紧凑的方式(不超过半页)表示它们。
为了实现这个目标,我试图重现我认为是 Shuppan 和 Darmawan 2011 年“评估 LTL 可满足性求解器”中的一种散点图:
轴上x
有按类别划分的输入文件,按大小排序,轴y
报告已进行基准测试的不同工具。颜色报告给定工具解决给定输入所需的时间,颜色越深表示速度越慢(黑色表示超时)。请注意,轴上x
报告了超过 3000 个输入测试。您看到的名称只是这些测试划分的类别。因此,每个单一颜色的条形图都是特定工具的特定输入(条形图也可以是点,我想他们选择条形图是为了便于阅读,因为他们无论如何都需要垂直空间来写工具名称)。
我有一个制表符分隔的文件,其中每行列出一个测试文件,每个工具的基准数据作为列。输入文件已按行中的类别划分。换句话说,CSV 行如下所示:
category filename size time_tool_1 time_tool_2 time_tool_3 ... time_tool_N
行已按类别分组,并按单个类别内的大小排序。
我正在寻找在 LaTeX 中重现这种图的最佳方法。据我所知,这是一种散点图,尽管有点奇怪。我pgfplots
以前用过,但从来没有画过散点图。我还在考虑用 手动绘制它tikz
,用 读取数据pgfplotstable
。我从未使用过gnuplot
或R
,所以我宁愿留在 LaTeX 世界中,但我愿意接受建议。
因此,问题有两个方面:
- 您会如何绘制这样的情节呢?
- 哪些包和工具更适合?
- 顺便问一下,有没有更好的方法来绘制和表示相同的数据?考虑一下,与参考论文相比,我没有对所有工具进行一般调查基准测试,而是将特定工具与所有其他工具进行比较,因此也许有一种更紧凑、更易读或更简单的方法来表示同一件事。
答案1
我猜想只要有数据需要绘制,就没有必要使用 PGFPLOTS。
我的方法分为两个部分。首先,我使用 P GFPLOTS T TABLE读取表格。这个包擅长读取表格。它应该能够读取您的 CSV 文件。
第二是关于如何绘制。在评论中(以及一般情况下),我们建议使用 PGFPLOTS,因为它具有内置的“模板”和数学/统计引擎。但在这种情况下,您对输出应该是什么样子有一个非常清晰的想法。所以我只是构建了一个双循环,在 中绘制您想要的内容tikzpicture
。
\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
category filename size a b c d
rozier-counter file_01 size_01 10 12 21 88
rozier-counter file_02 size_02 20 24 34 99
rozier-counter file_03 size_03 30 48 55 x
rozier-counter file_04 size_04 40 96 89 x
rozier-counter-carry file_11 size_11 35 4 x 5
rozier-counter-carry file_12 size_12 45 16 x 7
rozier-counter-carry file_13 size_13 55 36 x 5
rozier-counter-carry file_14 size_14 65 64 x 8
rozier-pattern-Eformula file_21 size_21 1 10 28 2
rozier-pattern-Eformula file_22 size_22 8 x 57 7
rozier-pattern-Eformula file_23 size_23 27 x 87 22
rozier-pattern-Eformula file_24 size_24 64 x x 67
rozier-pattern-Sformula file_31 size_31 20 7 12 11
rozier-pattern-Sformula file_32 size_32 x 19 34 23
rozier-pattern-Sformula file_33 size_33 16 37 56 47
rozier-pattern-Sformula file_34 size_34 26 53 78 95
}\data
\pgfplotstablegetrowsof\data\pgfmathsetmacro\rowcount{\pgfplotsretval-1}
\pgfplotstablegetcolsof\data\pgfmathsetmacro\colcount{\pgfplotsretval-1}
\def\lastrowcategory{not yet defined}
\def\categorycount{0}
\tikzset{
map color/.code={
\if x#1
\tikzset{fill=black}
\else
\tikzset{fill=red!#1!yellow}
\fi
}
}
\tikz[x=10]{
\foreach\i in{0,...,\rowcount}{
\pgfplotstablegetelem{\i}{[index]0}\of\data
\ifx\lastrowcategory\pgfplotsretval\else
\xdef\lastrowcategory{\pgfplotsretval}
\fill(\i+\categorycount/3,2)rectangle+(1/3,\colcount-.9)(\i+\categorycount/3,2.8)node[rotate=-60,above right]{\lastrowcategory};
\pgfmathsetmacro\categorycount{\categorycount+1}\xdef\categorycount{\categorycount}
\fi
\foreach \j in{3,...,\colcount}{
\pgfplotstablegetelem{\i}{[index]\j}\of\data
\fill[map color=\pgfplotsretval](\i+\categorycount/3,\j)rectangle+(1,1);
}
}
\fill(\rowcount+1+\categorycount/3,2)rectangle+(1/3,\colcount-.9);
}
\end{document}