Объединить гистограммы в gnuplot (средневзвешенное число бинов)

Допустим, у меня есть две части данных для одного и того же количества, каждая из которых имеет свою ошибку. В частности, у меня есть две гистограммы в файлах gnuplot примерно в форматеxA yA dyA для гистограммы АxB yB dyB для гистограммы B (значения xA и xB одинаковы)

Чтобы увеличить точность гистограмм, я могу "объединить их", чтобы получить лучшую оценку y. На практике я хочу получить гистограмму, в которой значения y представляют собой средневзвешенное значение значений yA и yB с весами, заданными в виде обратной величины их ошибок.

Это довольно стандартная операция при манипулировании данными, и я ожидал, что для гистограмм gnuplot будет существовать какая-то утилита. Оказывается, мне не удалось найти эту утилиту...

Поэтому я хотел бы спросить, есть ли такая программа, которая уже делает это. В случае, если он не существует, я хотел бы попросить предложение на каком языке, чтобы написать это. У меня уже есть кое-что, что делает это в Wolfram Mathematica, но сейчас я хочу выполнить операцию в оболочке Unix, поэтому мне было интересно, будет ли python хорошим выбором для манипулирования файлами gnuplot или есть что-то более подходящее.

Спасибо роберто

Если быть более точным, у меня есть гистограммы в файле.gnu, которые мне дают в формате

   # comments 
     set title "sqrt(p^2(5)) distribution" font "Helvetica, 20" 
     set xlabel "sqrt(p^2(5))" font "Helvetica, 20" 
     set ylabel "d{/Symbol s}/dsqrt(p^2(5))" font "Helvetica, 20" 
     set xrange [    0.00000:  40.00000] 
     plot "-" with histeps 
        4.50000        3986.18        1.27863 
        5.50000        3986.18        1.27863 
        6.50000        3986.18        1.27863 
    e 

     set title "m(5) distribution" font "Helvetica, 20" 
     set xlabel "m(5)" font "Helvetica, 20" 
     set ylabel "d{/Symbol s}/dm(5)" font "Helvetica, 20" 
     set xrange [    0.00000:  40.00000] 
     plot "-" with histeps 
        4.50000        3986.18        1.27863 
        5.50000        3986.18        1.27863 
        6.50000        3986.18        1.27863 
     e 

Я хотел бы извлечь все данные из этого файла, чтобы объединить, например, гистограмму m(5), которая у меня есть в нескольких файлах (объединение означает средневзвешенное значение, как указано выше). Какой-нибудь быстрый способ прочитать эти данные в Python и манипулировать гистограммами, чтобы объединить их?

2 ответа

Да, Python и Numpy - хороший выбор для этого. Если ваши файлы содержат только фиксированное количество чисел в строке, вы можете использовать функцию numpy.loadtxt для их чтения и savetxt для их записи. В противном случае вам придется использовать общие процедуры Python IO.

Самый простой способ - это использовать paste объединить два файла (при условии, что значения x одинаковы и в одинаковом порядке в обоих файлах) и выполнить вычисления в gnuplot.

Рассмотрим два тестовых файла A.txt

1 5 1
2 1 2

а также B.txt:

1 3 1
2 4 1

Использование сценария

set style fill solid noborder
set boxwidth 0.8 relative

set yrange [0:*]
weighted_avg(yA, dyA, yB, dyB) = ((yA/dyA + yB/dyB)/(1.0/dyA + 1.0/dyB))

plot '< paste A.txt B.txt' using 1:(weighted_avg($2, $3, $5, $6)) with boxes notitle

Вы получаете следующую гистограмму

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

Другие вопросы по тегам