目前我正在研究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
我当前的输出:
我希望创建像这样link的图表:
答案 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的结果:
答案 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
我明白了:
将图堆叠起来有点复杂,因为它涉及添加连续列,可以使用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)
您可以在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