如何绘制这种散点图?

如何绘制这种散点图?

我正在尝试绘制一个数据集,该数据集包含一组输入文件上多个工具的一些基准测试结果。问题是有超过 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。我从未使用过gnuplotR,所以我宁愿留在 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}

相关内容