带Gnuplot的堆叠和分组条形直方图

带Gnuplot的堆叠和分组条形直方图,gnuplot,histogram,Gnuplot,Histogram,我想复制一个条形图,例如:多个组,每个组有许多条(在我的例子中是4条),每个条被分割成几段(在我的例子中是两段) 在我的例子中,有四种算法应用于不同大小的向量(2^0到2^20)。每个算法有两个“部分”,局部计算和通信。对于每个向量大小,我想显示每个算法执行本地计算和通信所需的时间,以及与这两个部分之和对应的总时间 因此,我希望每个向量大小都有一个组。在每个组中,有四个对应于四种算法的条,每个条被分割成(例如)对应于本地计算的红色部分和对应于通信的蓝色部分 这对gnuplot可行吗?我可以提供任

我想复制一个条形图,例如:多个组,每个组有许多条(在我的例子中是4条),每个条被分割成几段(在我的例子中是两段)

在我的例子中,有四种算法应用于不同大小的向量(2^0到2^20)。每个算法有两个“部分”,局部计算和通信。对于每个向量大小,我想显示每个算法执行本地计算和通信所需的时间,以及与这两个部分之和对应的总时间

因此,我希望每个向量大小都有一个组。在每个组中,有四个对应于四种算法的条,每个条被分割成(例如)对应于本地计算的红色部分和对应于通信的蓝色部分

这对gnuplot可行吗?我可以提供任何有用格式的数据


非常感谢。

对于您的数据集,将本地部分和通信部分堆叠起来是没有意义的,因为从图表中可以看到通信部分太小了。在任何情况下,根据进一步的要求(图例条目、勾号标签等),组合堆叠和聚集也是相当棘手的

以下是如何为数据集绘制聚集直方图的示例:

set style histogram clustered gap 1
set style data histogram
set style fill solid 1.0 noborder

set termoption enhanced

set xtics out nomirror

myxtic(x) = sprintf('2^{%d}', int(floor(log(x)/log(2) + 0.5)))
plot 'test.dat' using ($2+$3):xtic(myxtic(stringcolumn(1))) title 'Algorithm 1',\
     for [i=2:4] '' using (column(2*i)+column(2*i+1)) title sprintf('Algorithm %d', i)
结果是:

要按算法分组,可以使用
newhistogram
关键字创建新组:

set style histogram rowstacked title offset 4,1
set boxwidth 0.9 relative
set style fill solid 1.0 border lt -1
set xtics rotate by 90 right
plot newhistogram "Algorithm 1" lt 1,\
     'test.dat' using 2:xtic(1) title columnheader, \
     '' using 3 title columnheader,\
     newhistogram "Algorithm 2" lt 1,\
     'test.dat' using 4:xtic(1) notitle, \
     '' using 5 notitle,\
     newhistogram "Algorithm 3" lt 1,\
     'test.dat' using 6:xtic(1) notitle, \
     '' using 7 notitle,\
     newhistogram "Algorithm 4" lt 1,\
     'test.dat' using 8:xtic(1) notitle, \
     '' using 9 notitle
local
comm
dat是堆叠的,但是
comm
部分太小了,以至于您无法在图形中看到它(仅当您放大时)

对于输出,我使用了4.6.3和以下设置:

set terminal pngcairo size 1000,400
set output 'test.png'
set xtics font ',6'
结果是:

更复杂一点的xtics显示需要一些技巧,因为对于直方图,xtics不被视为数字,而是字符串。以下是一个例子:

set terminal pngcairo size 1000,400
set output 'test.png'

set style histogram rowstacked title offset 0,-0.5
set bmargin 3
set boxwidth 0.9 relative
set style fill solid 1.0 border lt -1
set termoption enhanced
set xtics out nomirror
myxtic(x) = (int(floor(log(x)/log(2) + 0.5)) % 5 == 0) ? sprintf('2^{%d}', int(floor(log(x)/log(2) + 0.5))) : ""

plot newhistogram "Algorithm 1" lt 1,\
     'test.dat' using 2:xtic(myxtic(real(stringcolumn(1)))) title columnheader, \
     '' using 3 title columnheader,\
     newhistogram "Algorithm 2" lt 1,\
     'test.dat' using 4:xtic(myxtic(real(stringcolumn(1)))) notitle, \
     '' using 5 notitle,\
     newhistogram "Algorithm 3" lt 1,\
     'test.dat' using 6:xtic(myxtic(real(stringcolumn(1)))) notitle, \
     '' using 7 notitle,\
     newhistogram "Algorithm 4" lt 1,\
     'test.dat' using 8:xtic(myxtic(real(stringcolumn(1)))) notitle, \
     '' using 9 notitle
结果


样本数据和样本脚本将极大地帮助您获得答案。:)当然,还要指出你的脚本中缺少了什么以及你尝试了什么。我在此处放置了我的数据样本:。因为我是一个绝对的初学者(我正在从Matlab转到gnuplot),我甚至不知道我想做的事情是否可行(在Matlab中,例如,除非你去低级或应用一些不寻常的技巧,否则这是不可能的),所以我还没有开始编写脚本。嗨,Christoph。这看起来很棒,但我更希望能够更直接地比较这些算法的运行时间,也就是说,将不同算法的结果一个直接放在另一个之外。换句话说,分组不应根据算法进行,而应根据大小进行。我从你的代码中学到了很多。您基本上创建了4个不同的直方图,并将它们一个挨着一个放置。有没有办法把它放在一个循环中,以避免写得太多?很抱歉,我错过了真正的要点;)我更新了我的答案。在这种情况下,您需要一个聚集直方图。这不允许您堆叠本地和通信数据,但这对您提供的数据也没有意义。通讯部分太小了,看不见。将集群与堆叠相结合会变得非常棘手(还没有尝试过)。你说提供的数据不适合这种绘图是完全正确的。事实上,我忘了我必须用第一个算法的“comm”和“local”之和除以每一列。您的旧绘图看起来非常好,它们只是以一种不便于比较数据的方式进行分组。使用plot的“for”选项生成多个直方图是否有意义?