gnuplot堆积的填充曲线无法显示校正总和

时间:2014-05-26 01:48:35

标签: gnuplot stacked curves

目前我正在研究Gnulot堆叠的填充曲线。我有问题让我的图形堆叠。 这是我的数据:

     prog   reli    perf    avail   sec cons    topo    scale   qos
2011 138    90.3    21.0    63.5    45.5    48.5    6.8 4.0 5.5
2012 191.3  77.8    90.8    30.8    29.0    22.1    2.0 1.0 1.0
2013 85.0   57.5    48.0    20.0    27.5    8.5 0   2.5 1.0
2014 2.0    0.5 1.0 2.0 1.0 1.5 0   0   0

我在t1.plt上绘制了

set term pos eps font 20
set output 't1.eps'
set pointsize 0.8
set border 11
set xtics out
set tics front
set key below
set multiplot
a=0
plot for [i=1:9] "t1" using (column(i)):xtic(1) t column(i) with filledcurves

我当前的输出:

output

我希望创建像这样link的图表: expectation output

2 个答案:

答案 0 :(得分:5)

以下是如何使用gnuplot执行此操作的方法。您可以使用sum命令对列值进行求和,以获得堆叠图:

set terminal postscript eps color font 20
set output 't1.eps'
set xtics 1 out
set tics front
set key invert
set style fill solid noborder
plot for [i=10:2:-1] "t1" using 1:(sum [col=2:i] column(col)) with filledcurves x1 title columnheader(i-1)

注意,列标题的索引是1..9,而值是2..10。所以你必须明确地使用title columnheader(i-1)。如果您还要为第一列提供标题,例如year,您可以使用set key autotitle columnheader

不幸的是,invert的{​​{1}}选项仅适用于列。因此,如果您使用set key,则无法获得数据文件的原始顺序。

4.6.4的结果:

enter image description here

答案 1 :(得分:3)

关于风格的说明:

x1命令的末尾添加plot,以便曲线朝向(下方)x轴关闭(x2将是上一个)。另请注意,在这种情况下,set multiplot是不必要的。最后,迭代中的标题应该来自column(i-1)而不是column(i),或者在数据文件的第一列添加标签,迭代应该从2到10运行,除非你想要绘制第一列也反对自己。

使用您的数据和以下命令:

plot for [i=2:10] \
"t1" using (column(i)):xtic(1) t column(i-1) with filledcurves x1

我明白了:

enter image description here

将图堆叠起来有点复杂,因为它涉及添加连续列,可以使用awk完成,在gnuplot中调用:

set xtics 1
plot for [i=10:2:-1] \
"< awk 'NR==1 {print \"year\",$".(i-1)."} NR>=2 {for (i=2; i<=".i."; i++) \
{sum+= $i} {print $1, sum; sum=0} }' t1" \
using (column(2)):xtic(1) with filledcurves x1 t column(2)

enter image description here

您可以在gnuplot之外单独执行awk部分,看看它对您的数据做了什么:

# This is for second column (col=2), change value of col variable to see other columns
awk 'col=2 {} NR==1 {print "year",$(col-1)} NR>=2 {for (i=2; i<=col; i++) {sum+= $i} {print $1, sum; sum=0} }' t1