2015-08-07 2 views
0

У меня есть такие данные:средний диапазон данных и участок в Gnuplot

label-> 1 2 3 4 5 
val1 1.67E+07 2.20E+07 3.04E+07 7.89E+07 1.24E+08 
val2 1.71E+07 2.35E+07 2.70E+07 7.80E+07 1.31E+08 
val3 1.48E+07 2.15E+07 2.74E+07 7.18E+07 1.17E+08 
val4 1.57E+07 2.07E+07 2.49E+07 7.46E+07 1.27E+08 
val5 1.32E+07 2.23E+07 3.07E+07 7.50E+07 1.16E+08 

Мне нужно построить ярлык против среднего значения каждого валь колонки, как это:

label-> 1 2 3 4 5 
val1 1.67E+07 2.20E+07 3.04E+07 7.89E+07 1.24E+08 
val2 1.71E+07 2.35E+07 2.70E+07 7.80E+07 1.31E+08 
val3 1.48E+07 2.15E+07 2.74E+07 7.18E+07 1.17E+08 
val4 1.57E+07 2.07E+07 2.49E+07 7.46E+07 1.27E+08 
val5 1.32E+07 2.23E+07 3.07E+07 7.50E+07 1.16E+08 
mean 1.55E+07 2.20E+07 2.81E+07 7.57E+07 1.23E+08 

Is есть ли возможность выполнить эту операцию в gnuplot или я должен привязываться к Excel?

ответ

0

Вы можете сделать это, используя awk и gnuplot. Предположим, что данные вашего примера (без mean строк) находятся в data.txt. Затем вы можете вычислить среднее значение в каждом столбце, начиная со второго столбца (от i=2), а второй ряд (запись или строка, № 1 - NR==1 -> не суммировать, а заполнять вспомогательный массив a с нулями: a[i]=0.0) , С этой целью можно было использовать awk условие: if (NR==1)... else {...calculate the means...}. Awk считывает данные по строкам. В каждой строке, вы итерацию над полями и суммировать данные из столбца с номером i в массив элемент a[i]:

{for(i=2;i<=NF;i++) a[i]+=$i;} 

При итерации по первой строке (NR==1), мы бы; В END сценария awk (все строки обработаны) просто разделите число столбцов в ваших данных NF-1, чтобы рассчитать средние значения. Обратите внимание, что приведенный ниже код предполагает, что у вас есть данные в прямоугольном формате (NF = const).

Кроме того, за исключением меток строк столбцов в label массива: if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; ... }

Затем распечатать этикетки и средних значения в строки, по одной строке для одной этикетки.

for(i=2;i<=NF;i++) {printf label[i]" "; print a[i]/(NF-1)} 

В последней таблице данных будет выглядеть таким образом:

1 15500000 
2 22000000 
3 28080000 
4 75660000 
5 123000000 

Тогда вы могли бы сюжет один столбец против другого. Обратите внимание, что окончательные данные для gnuplot должны быть отформатированы в столбцах, а не в строках. Следующий код выполняет описанные операции:

gnuplot> unset key 
gnuplot> plot "<export LC_NUMERIC=C; awk '{if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; a[i]=0.0;} else {for(i=2;i<=NF;i++) a[i]+=$i;};} END {for(i=2;i<=NF;i++) {printf label[i]\" \"; print a[i]/(NF-1)}};' data.txt" 

отметить, что пространства должны быть экранированы с обратными косыми чертами \ в gnuplot.