gnuplot сложенные заполненные кривые не могут показать правильную сумму

В настоящее время я работаю над составными кривыми 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

мой текущий вывод:

выход

я ожидаю создания таких графиков ссылка: ожидаемый результат


person indi60    schedule 26.05.2014    source источник


Ответы (2)


Вот как вы можете сделать это только с помощью 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 для set key работает только со столбцами. Поэтому, если вы используете set key below invert, вы не получите исходный порядок вашего файла данных.

Результат с 4.6.4:

введите здесь описание изображения

person Christoph    schedule 26.05.2014
comment
Это, очевидно, правильный ответ. С какой версии реализована sum? - person Miguel; 26.05.2014
comment
@Miguel Это работает с 4.6.0. Единственной проблемой может быть порядок меток отдельных клавиш, поскольку invert не инвертирует его полностью. - person Christoph; 26.05.2014
comment
@Кристоф: ты всегда будешь героем. Спасибо! - person indi60; 27.05.2014
comment
@ Кристоф, немного о легендарных приказах. Заказы должны быть perf, avail, sec и так далее. а также я вижу поверх кривых любой оранжевый цвет. Не правда ли? - person indi60; 27.05.2014
comment
@ indi60 Смотрите правку. В моей предыдущей версии также отсутствовал столбец. Если вы также хотите поменять местами типы линий, вы должны добавить lt i-1 - person Christoph; 27.05.2014

Примечания к стилю:

Добавьте 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)

введите здесь описание изображения

Вы можете выполнить только часть awk вне gnuplot, чтобы увидеть, что она делает с вашими данными:

# 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 
person Miguel    schedule 26.05.2014
comment
Спасибо @miguel .. кстати, эти графики сложены? Я думаю, что каждая категория начинается с нуля. Я ожидаю, что следующая категория начнется с конца предыдущей категории. то есть: прога 0-20 а рели должны начинаться с 20-30 и так далее. - person indi60; 26.05.2014