输出:

输出:

我有 CSV 数据,表示调用自定义 malloc()、realloc() 和 free() 实现的时间(以纳秒为单位)。数据如下所示:

function,time
malloc,331
malloc,386
malloc,326
malloc,321
malloc,321
malloc,316
malloc,331
malloc,337
malloc,311
malloc,322
realloc,502
realloc,662
realloc,536
realloc,477
realloc,441
realloc,552
realloc,477
realloc,437
realloc,447
realloc,542
free,321
free,327
free,321
free,402
free,357
free,386
free,417
free,361
free,341
free,431
malloc,341
malloc,316
malloc,326
malloc,326
malloc,311
...

我需要使用 pgfplots 绘制这些数据,使其看起来像(只是一个草图):

我需要的草图

我的问题是:

  • 这可能吗?
  • 我如何让这些条形图如此紧密地排列?即使它们完全相邻,也没什么问题。我可能需要绘制 500-1000 个数据点(操作)。
  • 如何将数据中的“malloc”、“realloc”和“free”转化为红色、绿色和蓝色?

提前谢谢了!

答案1

代码:

\documentclass{standalone}

% this section just for the example
\usepackage{filecontents}
\begin{filecontents}{malloc.dat}
operation time
1 331
2 386
3 326
4 321
5 321
\end{filecontents}

\begin{filecontents}{realloc.dat}
operation time
6 502
7 662
8 536
9 477
10 441
\end{filecontents}

\begin{filecontents}{free.dat}
operation time
11 321
12 327
13 321
14 402
15 357
\end{filecontents}
% end of the section just for the example

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
  bar cycle list/.style={/pgfplots/cycle list={%
    {black,fill=red!70!black,mark=none},%
    {black,fill=green!70!black,mark=none},%
    {black,fill=blue!70!black,mark=none},%
    {black,fill=orange!70!black,mark=none},%
    }
  },
  width=7cm,
  ybar=0pt,
  bar width=1,
  bar shift=0pt,
  xtick={0,5,10,15},
  xlabel={operation \#},
  ylabel={time [$\mathrm{ns}$]},
]

\addplot+[] table[x=operation,y=time] {malloc.dat};
\addplot+[] table[x=operation,y=time] {realloc.dat};
\addplot+[] table[x=operation,y=time] {free.dat};

\legend{malloc(),realloc(),free()};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案:

  1. 是的。

  2. width调整、bar width和选项的值bar shift;在上面的代码中我使用了

      width=7cm,
      ybar=0pt,
      bar width=1,
      bar shift=0pt
    
  3. 您可以更改bar cycle list样式来循环显示您选择的颜色。

答案2

由于您的横轴由离散的时间步长组成,我认为您要找的是梳状图,而不是条形图。此外,据我所知,使用 等来决定颜色仅适用于使用 和 的散点图malloc。我认为最好的解决方案是为和保存单独的数据文件,将时间步长(x 轴)存储在一列中,将时间(y 轴)存储在另一列中,并在绘图中使用三个 s 。reallocpoint meta=explicit symbolicscatter/classesmallocreallocfree\addplotycomb

no markers结果并不像我希望的那样漂亮。您可以使用选项禁用顶部的标记axis,但图例条目不会显示任何内容。不幸的是,我不知道该如何pgfplots修复这个问题,但希望这是朝着正确方向迈出的一步。

输出:

输出

代码:

\documentclass{standalone}

\usepackage{filecontents}

\begin{filecontents}{malloc.dat}
operation time
1 331
2 386
3 326
4 321
5 321
16 341
17 316
18 326
19 326
20 311
\end{filecontents}

\begin{filecontents}{realloc.dat}
operation time
6 502
7 662
8 536
9 477
10 441
\end{filecontents}

\begin{filecontents}{free.dat}
operation time
11 321
12 327
13 321
14 402
15 357
\end{filecontents}

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
  width=10cm,
  height=10cm,
  ycomb,
  xlabel={operation \#},
  ylabel={time [$\mathrm{ns}$]},
  legend style={
    nodes={right},
  },
]

  \addplot+[very thick] table[x=operation,y=time] {malloc.dat};
  \addplot+[very thick] table[x=operation,y=time] {realloc.dat};
  \addplot+[very thick] table[x=operation,y=time] {free.dat};

  \legend{\texttt{malloc()},\texttt{realloc()},\texttt{free()}};

\end{axis}
\end{tikzpicture}
\end{document}

相关内容